欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Python中的循環(huán)語(yǔ)句的用法

 更新時(shí)間:2015年04月09日 12:02:37   作者:taiyang1987912  
這篇文章主要介紹了詳解Python中的循環(huán)語(yǔ)句的用法,循環(huán)語(yǔ)句是學(xué)習(xí)各個(gè)編程語(yǔ)言的最基本的基礎(chǔ)知識(shí),需要的朋友可以參考下

一、簡(jiǎn)介

      Python的條件和循環(huán)語(yǔ)句,決定了程序的控制流程,體現(xiàn)結(jié)構(gòu)的多樣性。須重要理解,if、while、for以及與它們相搭配的 else、 elif、break、continue和pass語(yǔ)句。
二、詳解
1、if語(yǔ)句

        Python中的if子句由三部分組成:關(guān)鍵字本身、用于判斷結(jié)果真假的條件表達(dá)式以及當(dāng)表達(dá)式為真或者非零時(shí)執(zhí)行的代碼塊。if 語(yǔ)句的語(yǔ)法如下:

if expression:
 expr_true_suite

        if 語(yǔ)句的expr_true_suite代碼塊只有在條件表達(dá)式的結(jié)果的布爾值為真時(shí)才執(zhí)行,否則將繼續(xù)執(zhí)行緊跟在該代碼塊后面的語(yǔ)句。
(1)多重條件表達(dá)式
        單個(gè)if語(yǔ)句可以通過(guò)使用布爾操作符and、or和not,實(shí)現(xiàn)多重判斷條件或是否定判斷條件。
(2)單一語(yǔ)句的代碼塊
        如果一個(gè)復(fù)合語(yǔ)句(例如if子句、while或for循環(huán))的代碼塊僅僅包含一行代碼,那么它可以和前面的語(yǔ)句寫在同一行上。如if make_hard_copy: send_data_to_printer(),這樣的單行語(yǔ)句是合法的, 盡管它可能方便,但這樣會(huì)使得代碼更難閱讀, 所以推薦將這行代碼移到下一行并合理地縮進(jìn)。另外一個(gè)原因就是如果你需要添加新的代碼, 你還是得把它移到下一行。
2、else語(yǔ)句
       Python提供了與if語(yǔ)句搭配使用的else語(yǔ)句,如果if語(yǔ)句的條件表達(dá)式的結(jié)果布爾值為假,那么程序?qū)?zhí)行 else 語(yǔ)句后的代碼。其語(yǔ)法如下:

if expression:
 expr_true_suite
else:
 expr_false_suite

        在C語(yǔ)言中,不會(huì)在條件語(yǔ)句范圍外發(fā)現(xiàn)else語(yǔ)句, 但Python不同,可以在while和for循環(huán)中使用else語(yǔ)句,在循環(huán)中使用時(shí),else子句只在循環(huán)完成后執(zhí)行,也就是說(shuō)break語(yǔ)句也會(huì)跳過(guò)else塊。
         例:顯示出10到20中的數(shù)字的最大約數(shù)

在CODE上查看代碼片派生到我的代碼片

 #!/usr/bin/env python 
  
 def showMaxFactor(num): 
  count = num / 2 
  while count > 1: 
   if (num % count == 0): 
   print 'largest factor of %d is %d' % (num, count) 
   break 
   count = count - 1 
  else: 
  print eachNum, 'is prime' 
  
 for eachNum in range(10, 21): 
  showMaxFactor(eachNum) 

在CODE上查看代碼片派生到我的代碼片

 largest factor of 10 is 5 
 11 is prime 
 largest factor of 12 is 6 
 13 is prime 
 largest factor of 14 is 7 
 largest factor of 15 is 5 
 largest factor of 16 is 8 
 17 is prime 
 largest factor of 18 is 9 
 19 is prime 
 largest factor of 20 is 10 

3、elif (即else-if )語(yǔ)句
        elif是Python的else-if 語(yǔ)句,它檢查多個(gè)表達(dá)式是否為真,并在為真時(shí)執(zhí)行特定代碼塊中的代碼。和else一樣,elif 聲明是可選的,然而不同的是if 語(yǔ)句后最多只能有一個(gè)else語(yǔ)句,但可以有任意數(shù)量的 elif 語(yǔ)句。

if expression1:
 expr1_true_suite
elif expression2:
 expr2_true_suite
 ...
elif expressionN:
 exprN_true_suite
else:
 none_of_the_above_suite

        在將來(lái)的某天,Python可能會(huì)支持 switch /case語(yǔ)句,但是完全可以用其他的Python結(jié)構(gòu)來(lái)模擬它。在Python中,大量的if-elif 語(yǔ)句并不難閱讀。
在CODE上查看代碼片派生到我的代碼片

 if user.cmd == 'create': 
  action = "create item" 
 elif user.cmd == 'delete': 
  action = 'delete item' 
 elif user.cmd == 'update': 
  action = 'update item' 
 else: 
  action = 'invalid choice... try again!' 

       上面的語(yǔ)句還可以用序列和成員關(guān)系操作符來(lái)簡(jiǎn)化它:

在CODE上查看代碼片派生到我的代碼片

 if user.cmd in ('create', 'delete', 'update'): 
  action = '%s item' % user.cmd 
 else: 
  action = 'invalid choice... try again!' 

       還可以用Python字典給出更加優(yōu)雅的解決方案,使用映射對(duì)象(比如字典)的一個(gè)最大好處就是它的搜索操作比類似語(yǔ)句或是 for 循環(huán)這樣的序列查詢要快很多。

在CODE上查看代碼片派生到我的代碼片

 msgs = {'create': 'create item', 
   'delete': 'delete item', 
   'update': 'update item' 
   } 
 default = 'invalid choice... try again!' 
 action = msgs.get(user.cmd, default) 

4、條件表達(dá)式(即"三元操作符")
       三元運(yùn)算符語(yǔ)法為:X if C else Y,只需要一行完成條件判斷和賦值操作:

在CODE上查看代碼片派生到我的代碼片

 >>> x, y = 4, 3 
 >>> smaller = x if x < y else y 
 >>> smaller 
 3 

5、while語(yǔ)句
      while是一個(gè)條件循環(huán)語(yǔ)句,與if聲明相比,如果 if 后的條件為真,就會(huì)執(zhí)行一次相應(yīng)的代碼塊。而while中的代碼塊會(huì)一直循環(huán)執(zhí)行,直到循環(huán)條件不再為真。
(1)一般語(yǔ)法
       while循環(huán)的語(yǔ)法如下:

while expression:
 suite_to_repeat

        while循環(huán)的suite_to_repeat子句會(huì)一直循環(huán)執(zhí)行,直到expression值為布爾假。
(2)計(jì)數(shù)循環(huán)

count = 0
while (count < 9):
 print 'the index is:', count
 count += 1

       代碼塊里包含了print和自增語(yǔ)句,它們被重復(fù)執(zhí)行,直到count不再小于9。索引count在每次迭代時(shí)被打印出來(lái)然后自增 1。
(3)無(wú)限循環(huán)

while True:
 handle, indata = wait_for_client_connect()
 outdata = process_request(indata)
 ack_result_to_client(handle, outdata)

       “無(wú)限”循環(huán)永遠(yuǎn)不會(huì)結(jié)束,但它不一定是壞事,許多通訊服務(wù)器的客戶端/服務(wù)器系統(tǒng)就是通過(guò)它來(lái)工作的。
6、for語(yǔ)句
        Python提供了的另一個(gè)循環(huán)機(jī)制就是for語(yǔ)句,它是Python中最強(qiáng)大的循環(huán)結(jié)構(gòu)。它可以遍歷序列成員,可以用在列表解析和生成器表達(dá)式中,它會(huì)自動(dòng)地調(diào)用迭代器的next()方法,捕獲StopIteration異常并結(jié)束循環(huán)(所有這一切都是在內(nèi)部發(fā)生的)。 Python的for更像是shell或是腳本語(yǔ)言中的foreach循環(huán)。

(1)一般語(yǔ)法
       for循環(huán)會(huì)訪問(wèn)一個(gè)可迭代對(duì)象(例如序列或是迭代器)中的所有元素,,并在所有條目都處理過(guò)后結(jié)束循環(huán)。它的語(yǔ)法如下:
for iter_var in iterable:
    suite_to_repeat
        每次循環(huán), iter_var迭代變量被設(shè)置為可迭代對(duì)象(序列、迭代器或者是其他支持迭代的對(duì)象)的當(dāng)前元素,提供給suite_to_repeat 語(yǔ)句塊使用。
(2)用于序列類型
       for循環(huán)可以迭代不同的序列對(duì)象,像字符串、 列表、以及元組。
       迭代序列有三種基本方法:
通過(guò)序列項(xiàng)迭代
在CODE上查看代碼片派生到我的代碼片

 >>> nameList = ['Walter', "Nicole", 'Steven', 'Henry'] 
 >>> for eachName in nameList: 
 ...  print eachName, "Lim" 
 ... 
 Walter Lim 
 Nicole Lim 
 Steven Lim 
 Henry Lim 

        迭代一個(gè)列表.。每次迭代,eacgName變量都被設(shè)置為列表中特定某個(gè)元素。
通過(guò)序列索引迭代
在CODE上查看代碼片派生到我的代碼片

 >>> nameList = ['Cathy', "Terry", 'Joe', 'Heather','Lucy'] 
 >>> for nameIndex in range(len(nameList)): 
 ...  print "Liu,", nameList[nameIndex] 
 ... 
 Liu, Cathy 
 Liu, Terry 
 Liu, Joe 
 Liu, Heather 
 Liu, Lucy 

 

      沒(méi)有迭代元素, 而是通過(guò)列表的索引迭代。但通過(guò)直接迭代序列要比索引迭代快。
使用項(xiàng)和索引迭代
在CODE上查看代碼片派生到我的代碼片

 >>> nameList = ['Donn', 'Shirley', 'Ben', 'Janice','David', 'Yen', 'Wendy'] 
 >>> for i, eachLee in enumerate(nameList): 
 ...  print "%d %s Lee" % (i+1, eachLee) 
 ... 
 1 Donn Lee 
 2 Shirley Lee 
 3 Ben Lee 
 4 Janice Lee 
 5 David Lee 
 6 Yen Lee 
 7 Wendy Lee 

(3)用于迭代器類型
        用for循環(huán)訪問(wèn)迭代器和訪問(wèn)序列的方法差不多,迭代器并不代表循環(huán)條目的集合,迭代器對(duì)象有一個(gè)next()方法, 調(diào)用后返回下一個(gè)條目。 所有條目迭代完后, 迭代器引發(fā)一個(gè)StopIteration異常告訴程序循環(huán)結(jié)束,for語(yǔ)句在內(nèi)部調(diào)用next()并捕獲異常。
        使用迭代器做 for 循環(huán)的代碼與使用序列條目幾乎完全相同。事實(shí)上在大多情況下,無(wú)法分辨出迭代的是一個(gè)序列還是迭代器,因此遍歷一個(gè)迭代器時(shí),實(shí)際上可能指的是要遍歷一個(gè)序列、迭代器或是一個(gè)支持迭代的對(duì)象(它有 next()方法)。
(4)range()內(nèi)建函數(shù)
        內(nèi)建函數(shù)range()可以把類似foreach的for循環(huán)變成你更加熟悉的語(yǔ)句。
        Python提供了兩種不同的方法來(lái)調(diào)用range() ,完整語(yǔ)法要求提供兩個(gè)或三個(gè)整數(shù)參數(shù):range(start, end, step =1),range()會(huì)返回一個(gè)包含所有k的列表,其中start <= k < end,從start到end ,k每次遞增 ste,step不可以為零,否則將發(fā)生錯(cuò)誤。 
在CODE上查看代碼片派生到我的代碼片

 >>> range(3, 7) 
 [3, 4, 5, 6] 
 >>> for eachVal in range(2, 19, 3): 
 ...  print "value is:", eachVal 
 ... 
 value is: 2 
 value is: 5 
 value is: 8 
 value is: 11 
 value is: 14 
 value is: 17 

 

         range() 還有兩種簡(jiǎn)略的語(yǔ)法格式:range(end)和range(start, end)。 start 默認(rèn)為0, step默認(rèn)為1。
(5)xrange()內(nèi)建函數(shù)
        xrange()類似range(),不過(guò)當(dāng)有一個(gè)很大的范圍列表時(shí),xrange() 可能更為適合, 因?yàn)樗粫?huì)在內(nèi)存里創(chuàng)建列表的完整拷貝。 它只被用在 for 循環(huán)中,在 for 循環(huán)外使用它沒(méi)有意義。它的性能遠(yuǎn)高出 range(),因?yàn)樗簧烧麄€(gè)列表。在Python的將來(lái)版本中,range()可能會(huì)像xrange()一樣,返回一個(gè)可迭代對(duì)象(不是列表也不是一個(gè)迭代器)。

(6)與序列相關(guān)的內(nèi)建函數(shù)
        序列相關(guān)函數(shù):sorted()、 reversed()、enumerate()和zip(),稱為“序列相關(guān)”是因?yàn)槠渲袃蓚€(gè)函數(shù)(sorted() 和 zip())返回一個(gè)序列(列表),而另外兩個(gè)函數(shù)(reversed() 和 enumerate())返回迭代器(類似序列)。
7、break和continue語(yǔ)句
       Python中的break語(yǔ)句可以結(jié)束當(dāng)前循環(huán)然后跳轉(zhuǎn)到下條語(yǔ)句,類似C中的break。常用在當(dāng)某個(gè)外部條件被觸發(fā)(一般通過(guò) if 語(yǔ)句檢查),需要立即從循環(huán)中退出時(shí).。break 語(yǔ)句可以用在 while 和 for 循環(huán)中。
       Python里的continue語(yǔ)句和其他高級(jí)語(yǔ)言中的傳統(tǒng)continue并沒(méi)有什么不同,它可以被用在while和for循環(huán)里。 while循環(huán)是條件
性的,而 for 循環(huán)是迭代的,所以continue在開始下一次循環(huán)前要滿足一些先決條件,否則循環(huán)會(huì)正常結(jié)束。
       程序中當(dāng)遇到 continue 語(yǔ)句時(shí), 程序會(huì)終止當(dāng)前循環(huán),并忽略剩余的語(yǔ)句,然后回到循環(huán)的頂端。在開始下一次迭代前,如果是條件循環(huán),我們將驗(yàn)證條件表達(dá)式。如果是迭代循環(huán),將驗(yàn)證是否還有元素可以迭代。只有在驗(yàn)證成功的情況下,才會(huì)開始下一次迭代。
在CODE上查看代碼片派生到我的代碼片

 #!/usr/bin/env python 
  
 valid = False 
 count = 3 
 passwdList=('abc',) 
 while count > 0 and valid == False: 
  input = raw_input("enter password:").strip() 
  # check for valid passwd 
  for eachPasswd in passwdList: 
   if input == eachPasswd: 
    valid = True 
    break 
   if not valid: # (or valid == 0) 
    print "invalid input" 
    count -= 1 
    continue 
   else: 
     break 

        結(jié)合使用了while、for、if、break以及continue,來(lái)驗(yàn)證用戶輸入。用戶有三次機(jī)會(huì)來(lái)輸入正確的密碼,阻止用戶猜測(cè)密碼。

8、pass語(yǔ)句
        Python中沒(méi)有對(duì)應(yīng)的空大括號(hào)或是分號(hào)( ; )來(lái)表示如C語(yǔ)言中的“不做任何事”,如果需要子語(yǔ)句塊的地方不寫任何語(yǔ)句, 解釋器會(huì)提示語(yǔ)法錯(cuò)誤。因此,Python 提供了pass語(yǔ)句,它不做任何事情,即NOP(No OPeration),pass同樣也可作為開發(fā)中的小技巧,標(biāo)記以后將要完成的代碼。

def foo_func():
    pass

       這樣的代碼結(jié)構(gòu)在開發(fā)和調(diào)試時(shí)很有用,因?yàn)榫帉懘a的時(shí)候可能要先把結(jié)構(gòu)定下來(lái),但又不希望它干擾其他已經(jīng)完成的代碼, 在不需要它做任何事情地方放一個(gè)pass,將是一個(gè)很好的主意。另外它在異常處理中也被經(jīng)常用到,比如你跟蹤到了一個(gè)非致命的錯(cuò)誤而不想采取任何措施。
9、迭代器和iter()函數(shù)

(1)什么是迭代器

        迭代器為類序列對(duì)象提供了一個(gè)類序列的接口,可以利用它們的索引從0開始一直"迭代" 到序列的最后一個(gè)條目,用"計(jì)數(shù)"的方法迭代序列是很簡(jiǎn)單的。 Python的迭代無(wú)縫地支持序列對(duì)象,而且它還允許程序員迭代非序列類型, 包括用戶定義的對(duì)象。
        迭代器用起來(lái)很靈巧,可以迭代不是序列但表現(xiàn)出序列行為的對(duì)象,例如字典的 key 、一個(gè)文件的行等等。當(dāng)使用循環(huán)迭代一個(gè)對(duì)象條目時(shí),不必去關(guān)注它是迭代器還是序列。
(2)為什么要迭代器
         迭代器的定義:提供了可擴(kuò)展的迭代器接口、對(duì)列表迭代帶來(lái)了性能上的增強(qiáng)、在字典迭代中性能提升、創(chuàng)建真正的迭代接口,而不是原來(lái)的隨機(jī)對(duì)象訪問(wèn)、與所有已經(jīng)存在的用戶定義的類以及擴(kuò)展的模擬序列和映射的對(duì)象向后兼容、迭代非序列集合(例如映射和文件)時(shí), 可以創(chuàng)建更簡(jiǎn)潔可讀的代碼。
(3)如何迭代
       迭代器有一個(gè)next()方法的對(duì)象,而不是通過(guò)索引來(lái)計(jì)數(shù)。當(dāng)一個(gè)循環(huán)機(jī)制(例如 for 語(yǔ)句)需要下一個(gè)項(xiàng)時(shí),調(diào)用迭代器的next()方法就可以獲得它。條目全部取出后,會(huì)引發(fā)一個(gè)StopIteration異常,這并不表示錯(cuò)誤發(fā)生,只是告訴外部調(diào)用者迭代完成。
       不過(guò),迭代器也有一些限制。 例如不能向后移動(dòng),不能回到開始,也不能復(fù)制一個(gè)迭代器。如果要再次(或者是同時(shí))迭代同個(gè)對(duì)象,你只能去創(chuàng)建另一個(gè)迭代器對(duì)象。不過(guò),還有其他的工具來(lái)幫助你使用迭代器。
        reversed()內(nèi)建函數(shù)將返回一個(gè)反序訪問(wèn)的迭代器。enumerate()內(nèi)建函數(shù)同樣也返回迭代器。另外兩個(gè)新的內(nèi)建函數(shù):any()和 all(),如果迭代器中某個(gè)/所有條目的值都為布爾真時(shí),則它們返回值為真。
(4)使用迭代器
序列
在CODE上查看代碼片派生到我的代碼片

 >>> myTuple = (123, 'xyz', 45.67) 
 >>> i = iter(myTuple) 
 >>> i.next() 
 123 
 >>> i.next() 
 'xyz' 
 >>> i.next() 
 45.670000000000002 
 >>> i.next() 
 Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
 StopIteration 

       在for循環(huán)中for i in seq:do_something_to(i),它會(huì)自動(dòng)調(diào)用迭代器的next()方法,并且監(jiān)視StopIteration異常。
字典
       字典和文件是另外兩個(gè)可迭代的Python數(shù)據(jù)類型。字典的迭代器會(huì)遍歷它的鍵(keys),語(yǔ)句for eachKey in myDict.keys()可以縮寫為for eachKey in myDict。
        Python還引進(jìn)了三個(gè)新的內(nèi)建字典方法來(lái)定義迭代: myDict.iterkeys() (通過(guò) keys 迭代), myDict.itervalues() (通過(guò) values 迭代)以及myDicit.iteritems() (通過(guò)key/value 對(duì)來(lái)迭代 )。 注意 : in操作符也可以用于檢查字典的key是否存在,布爾表達(dá)式myDict.has_key(anyKey)可以被簡(jiǎn)寫為anyKey in myDict。
文件
        文件對(duì)象生成的迭代器會(huì)自動(dòng)調(diào)用readline()方法。這樣,循環(huán)就可以訪問(wèn)文本文件的所有行??梢允褂酶?jiǎn)單的for eachLine in myFile替 換for eachLine in myFile.readlines()。
(5)可變對(duì)象和迭代器
       在迭代可變對(duì)象的時(shí)候修改它們并不是個(gè)好主意,這在迭代器出現(xiàn)之前就是一個(gè)問(wèn)題。一個(gè)序列的迭代器只是記錄當(dāng)前到達(dá)第幾個(gè)元素,所以若在迭代時(shí)改變了元素,更新會(huì)立即反映到你所迭代的條目上。在迭代字典的key時(shí),絕對(duì)不能改變這個(gè)字典。 使用字典的keys()方法是可以的,因?yàn)閗eys() 返回一個(gè)獨(dú)立于字典的列表, 而迭代器是與實(shí)際對(duì)象綁定在一起的,它將不會(huì)繼續(xù)執(zhí)行下去。
(6)如何創(chuàng)建迭代器
       對(duì)一個(gè)對(duì)象調(diào)用iter()就可以得到它的迭代器,它的語(yǔ)法如下:iter(obj)或iter(func, sentinel )。如果傳遞一個(gè)參數(shù)給iter(),它會(huì)檢查你傳遞的是不是一個(gè)序列,如果是則會(huì)根據(jù)索引從0一直迭代到序列結(jié)束。另一個(gè)創(chuàng)建迭代器的方法是使用類,一個(gè)實(shí)現(xiàn)__iter__()和next()方法的類可以作為迭代器使用。如果是傳遞兩個(gè)參數(shù)給iter(), 它會(huì)重復(fù)地調(diào)用func,直到迭代器的下個(gè)值等于sentinel。

10、列表解析
       列表解析( List comprehensions或縮略為list comps ) 來(lái)自函數(shù)式編程語(yǔ)言Haskell。它是一個(gè)非常有用、簡(jiǎn)單、而且靈活的工具, 可以用來(lái)動(dòng)態(tài)地創(chuàng)建列表。
       Python支持的函數(shù)式編程特性,例如lambda 、map() 以及filter()等,通過(guò)列表解析它們可以被簡(jiǎn)化為一個(gè)列表解析式子。map()對(duì)所有的列表成員應(yīng)用一個(gè)操作,filter()基于一個(gè)條件表達(dá)式過(guò)濾列表成員,lambda()允許快速地創(chuàng)建只有一行的函數(shù)對(duì)象。    
       列表解析的語(yǔ)法:[expr for iter_var in iterable], 它迭代iterable對(duì)象的所有條目。其中的expr應(yīng)用于序列的每個(gè)成員,最后的結(jié)果值是該表達(dá)式產(chǎn)生的列表,迭代變量并不需要是表達(dá)式的一部分。
在CODE上查看代碼片派生到我的代碼片

 >>> [x ** 2 for x in range(6)] 
 [0, 1, 4, 9, 16, 25] 

        列表解析的表達(dá)式可以取代內(nèi)建的map()函數(shù)以及l(fā)ambda ,而且效率更高。結(jié)合 if語(yǔ)句,列表解析還提供了一個(gè)擴(kuò)展版本的語(yǔ)法:[expr for iter_var in iterable if cond_expr],它在迭代時(shí)會(huì)過(guò)濾/捕獲滿足條件表達(dá)式cond_expr的序列成員。
        挑選出序列中的奇數(shù):
在CODE上查看代碼片派生到我的代碼片

 >>> seq = [11, 10, 9, 9, 10, 10, 9, 8, 23, 9, 7, 18, 12, 11, 12] 
 >>> filter(lambda x: x % 2, seq) 
 [11, 9, 9, 9, 23, 9, 7, 11] 
 >>> [x for x in seq if x % 2] 
 [11, 9, 9, 9, 23, 9, 7, 11] 

         即使不用filter()和lambda,可以使用列表解析來(lái)完成操作,獲得想要的數(shù)字。
       矩陣樣例:迭代一個(gè)有三行五列的矩陣,[(x+1,y+1) for x in range(3) for y in range(5)]。
       磁盤文件樣例:若有一個(gè)數(shù)據(jù)文件text.txt,需要計(jì)算出所有非空白字符的數(shù)目,可以把每行分割( split )為單詞,,然后計(jì)算單詞個(gè)數(shù):>>> f = open('hhga.txt', 'r');len([word for line in f for word in line.split()])??焖俚赜?jì)算文件大?。?gt;>>import os;os.stat('text.txt').st_size。把每個(gè)單詞的長(zhǎng)度加起來(lái):>>>f.seek(0);sum([len(word) for line in f for word in line.split()])。
11、生成器表達(dá)式  

         生成器表達(dá)式是列表解析的一個(gè)擴(kuò)展,只用一行代碼就可以創(chuàng)建包含特定內(nèi)容的列表。另一個(gè)重要特性是生成器,生成器是特定的函數(shù),允許返回一個(gè)值,然后"暫停"代碼的執(zhí)行,稍后恢復(fù)。
        列表解析的一個(gè)不足就是必要生成所有的數(shù)據(jù),用以創(chuàng)建整個(gè)列表。這可能對(duì)有大量數(shù)據(jù)的迭代器有負(fù)面效應(yīng), 生成器表達(dá)式通過(guò)結(jié)合列表解析和生成器解決了這個(gè)問(wèn)題。
        生成器表達(dá)式與列表解析非常相似,而且它們的基本語(yǔ)法基本相同。不過(guò)它并不真正創(chuàng)建數(shù)字列表而是返回一個(gè)生成器,這個(gè)生成器在每次計(jì)算出一個(gè)條目后,把這個(gè)條目“產(chǎn)生”(yield)出來(lái)。生成器表達(dá)式使用了"延遲計(jì)算"(lazy evaluation),所以它在使用內(nèi)存上更有效。生成器并不會(huì)讓列表解析廢棄,它只是一個(gè)內(nèi)存使用更友好的結(jié)構(gòu),基于此,有很多使用生成器地方。
列表解析語(yǔ)法:

[expr for iter_var in iterable if cond_expr]

生成器表達(dá)式語(yǔ)法:

(expr for iter_var in iterable if cond_expr)

        磁盤文件樣例:上述計(jì)算文本文件中非空白字符總和,如果這個(gè)文件的大小變得很大, 那么這行代碼的內(nèi)存性能會(huì)很低,因?yàn)橐獎(jiǎng)?chuàng)建一個(gè)很長(zhǎng)的列表用于存放單詞的長(zhǎng)度。為了避免創(chuàng)建龐大的列表,使用生成器表達(dá)式來(lái)完成求和操作,優(yōu)化后的代碼:>>> sum(len(word) for line in data for word in line.split()),是把方括號(hào)刪除,少了兩字節(jié), 而且更節(jié)省內(nèi)存。
        交叉配對(duì)例子:成器表達(dá)式就好像是懶惰的列表解析(這反而成了它主要的優(yōu)勢(shì)),它還可以用來(lái)處理其他列表或生成器,如:x_product_pairs = ((i, j) for i in rows for j in cols())。
       重構(gòu)樣例,尋找文件最長(zhǎng)的行的例子:
以前的方法:

在CODE上查看代碼片派生到我的代碼片

 #!/usr/bin/env python 
  
 def fun(): 
  f = open('/etc/motd', 'r') 
  longest = 0 
  allLines = [x.strip() for x in f.readlines()] #or allLineLens = [len(x.strip()) for x in f] 
  f.close() 
  for line in allLines: 
   linelen = len(line) 
   if linelen > longest:   #or longest = max(allLineLens) 
    longest = linelen 
  return longest 

新的方法:

       使用生成器表達(dá)式替換列表解析和max()函數(shù),并去掉文件打開模式(默認(rèn)為讀?。簉eturn max(len(x.strip()) for x in open('/etc/motd'))。
三、總結(jié)
(1)itertools模塊被加入,更加支持了迭代器的應(yīng)用,列表解析和生成表達(dá)式的內(nèi)容可結(jié)合實(shí)例分析。
(2)若有不足,請(qǐng)留言,在此先感謝!

相關(guān)文章

  • 圖文詳解OpenCV中光流以及視頻特征點(diǎn)追蹤

    圖文詳解OpenCV中光流以及視頻特征點(diǎn)追蹤

    光流是空間運(yùn)動(dòng)物體在觀察成像平面上的像素運(yùn)動(dòng)的瞬時(shí)速度,是利用圖像序列中像素在時(shí)間域上的變化以及相鄰幀之間的相關(guān)性來(lái)找到上一幀跟當(dāng)前幀之間存在的相應(yīng)關(guān)系,這篇文章主要給大家介紹了關(guān)于OpenCV中光流以及視頻特征點(diǎn)追蹤的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • Java編程迭代地刪除文件夾及其下的所有文件實(shí)例

    Java編程迭代地刪除文件夾及其下的所有文件實(shí)例

    這篇文章主要介紹了Java編程迭代地刪除文件夾及其下的所有文件實(shí)例,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • python對(duì)象銷毀實(shí)例(垃圾回收)

    python對(duì)象銷毀實(shí)例(垃圾回收)

    今天小編就為大家分享一篇python對(duì)象銷毀實(shí)例(垃圾回收),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • Python中字符串格式化str.format的詳細(xì)介紹

    Python中字符串格式化str.format的詳細(xì)介紹

    python從2.6開始支持format,新的更加容易讀懂的字符串格式化方法,下面這篇文章主要介紹了Python中字符串格式化str.format的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-02-02
  • 按日期打印Python的Tornado框架中的日志的方法

    按日期打印Python的Tornado框架中的日志的方法

    這篇文章主要介紹了按日期打印Python的Tornado框架中的日志的方法,需要的朋友可以參考下
    2015-05-05
  • 將python運(yùn)行結(jié)果保存至本地文件中的示例講解

    將python運(yùn)行結(jié)果保存至本地文件中的示例講解

    今天小編就為大家分享一篇將python運(yùn)行結(jié)果保存至本地文件中的示例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • Python使用matplotlib 畫矩形的三種方式分析

    Python使用matplotlib 畫矩形的三種方式分析

    這篇文章主要介紹了Python使用matplotlib 畫矩形的三種方式,結(jié)合實(shí)例形式分析了Python基于matplotlib繪制矩形的具體實(shí)現(xiàn)方法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-10-10
  • Python接口自動(dòng)化判斷元素原理解析

    Python接口自動(dòng)化判斷元素原理解析

    這篇文章主要介紹了Python接口自動(dòng)化判斷元素原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Python數(shù)據(jù)標(biāo)準(zhǔn)化的實(shí)例分析

    Python數(shù)據(jù)標(biāo)準(zhǔn)化的實(shí)例分析

    在本篇文章里小編給大家整理了關(guān)于Python數(shù)據(jù)標(biāo)準(zhǔn)化的實(shí)例內(nèi)容,有需要的朋友們可以測(cè)試學(xué)習(xí)下。
    2021-08-08
  • python 多線程與多進(jìn)程效率測(cè)試

    python 多線程與多進(jìn)程效率測(cè)試

    這篇文章主要介紹了python 多線程與多進(jìn)程效率測(cè)試,在Python中,計(jì)算密集型任務(wù)適用于多進(jìn)程,IO密集型任務(wù)適用于多線程、接下來(lái)看看文章得實(shí)例吧,需要的朋友可以參考一下喲
    2021-10-10

最新評(píng)論