Python 核心编程(第二版)——条件和循环
Python 中的 if 子句由三部分組成: 關(guān)鍵字本身,用于判斷結(jié)果真假的條件表達(dá)式, 以及當(dāng)表達(dá)式為真或者非零時(shí)執(zhí)行的代碼塊。if 語(yǔ)句的語(yǔ)法如下:
if expression:
? ? expr_true_suite
單個(gè) if 語(yǔ)句可以通過(guò)使用布爾操作符 and , or 和 not實(shí)現(xiàn)多重判斷條件或是否定判斷條件。
如果一個(gè)復(fù)合語(yǔ)句(例如 if 子句, while 或 for 循環(huán))的代碼塊僅僅包含一行代碼, 那么它可以和前面的語(yǔ)句寫在同一行上:if make_hard_copy: send_data_to_printer()。
2.else語(yǔ)句
如果 if 語(yǔ)句的條件表達(dá)式的結(jié)果布爾值為假, 那么程序?qū)?zhí)行 else 語(yǔ)句后的代碼:
if expression:
? ? expr_true_suite
else:
? ? expr_false_suite
Python 的縮進(jìn)使用強(qiáng)制使代碼正確對(duì)齊, 讓程序員來(lái)決定 else 屬于哪一個(gè) if . 限制您的選擇從而減少了不確定性。
3.elif(即else-if)語(yǔ)句
elif 是 Python 的 else-if 語(yǔ)句, 它檢查多個(gè)表達(dá)式是否為真, 并在為真時(shí)執(zhí)行特定代碼塊中的代碼。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
4.條件表達(dá)式(即“三元操作符”)
語(yǔ)法為:X if C else Y ,C為條件表達(dá)式,X 是 C 為 True 時(shí)的結(jié)果, Y 是 C 為 False 時(shí)的結(jié)果。
5.while語(yǔ)句
while 循環(huán)的語(yǔ)法如下:
while expression:
? ? suite_to_repeat
while 循環(huán)的 suite_to_repeat 子句會(huì)一直循環(huán)執(zhí)行,直到 expression 值為布爾假。
while True:#無(wú)限循環(huán)
? ??suite_to_repeat
6.for語(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ǔ)句塊使用。
迭代序列有三種基本方法:
1)通過(guò)序列項(xiàng)迭代;
1 >>> nameList = ['Walter', "Nicole", 'Steven', 'Henry'] 2 >>> for eachName in nameList: 3 ... print eachName, "Lim" 4 ... 5 Walter Lim 6 Nicole Lim 7 Steven Lim 8 Henry Lim View Code2)通過(guò)序列索引迭代;
1 >>> nameList = ['Cathy', "Terry", 'Joe', 'Heather', 2 'Lucy'] 3 >>> for nameIndex in range(len(nameList)): 4 ... print "Liu,", nameList[nameIndex] 5 ... 6 Liu, Cathy 7 Liu, Terry 8 Liu, Joe 9 Liu, Heather 10 Liu, Lucy View Code使用 range() 我們可以得到用來(lái)迭代 nameList 的索引數(shù)列表;使用切片/下標(biāo)操作符( [ ] ),就可以訪問(wèn)對(duì)應(yīng)的序列對(duì)象。
3)使用項(xiàng)和索引迭代;
1 >>> nameList = ['Donn', 'Shirley', 'Ben', 'Janice', 2 ... 'David', 'Yen', 'Wendy'] 3 >>> for i, eachLee in enumerate(nameList): 4 ... print "%d %s Lee" % (i+1, eachLee) 5 ... 6 1 Donn Lee 7 2 Shirley Lee 8 3 Ben Lee 9 4 Janice Lee 10 5 David Lee 11 6 Yen Lee 12 7 Wendy Lee View Code?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 每次遞增 step . step 不可以為零,否則將發(fā)生錯(cuò)誤。如果只給定兩個(gè)參數(shù),而省略 step, step 就使用默認(rèn)值 1 。
range()簡(jiǎn)略語(yǔ)法:range(end) 和?range(start, end)。
核心筆記: 為什么 range() 不是只有一種語(yǔ)法?
range(start=0, end, step =1) # 錯(cuò)誤
這個(gè)語(yǔ)法不可以使用兩個(gè)參數(shù)調(diào)用. 因?yàn)?step 要求給定 start . 換句話說(shuō), 你不能只傳遞end 和 step 參數(shù). 因?yàn)樗鼈儠?huì)被解釋器誤認(rèn)為是 start 和 end 。
與序列相關(guān)的內(nèi)建函數(shù):sorted(), reversed(), enumerate(), zip()。sorted() 和 zip() )返回一個(gè)序列(列表), 而另外兩個(gè)函數(shù)( reversed() 和 enumerate() )返回迭代器(類似序列)。
1 >>>albums = ('Poe', 'Gaudi', 'Freud', 'Poe2') 2 >>> years = (1976, 1987, 1990, 2003) 3 >>> for album in sorted(albums): 4 ... print album, 5 ... 6 Freud Gaudi Poe Poe2 7 >>> 8 >>> for album in reversed(albums): 9 ... print album, 10 ... 11 Poe2 Freud Gaudi Poe 12 >>> 13 >>> for i, album in enumerate(albums): 14 ... print i, album 15 ... 16 0 Poe 17 1 Gaudi 18 2 Freud 19 3 Poe2 20 >>> 21 >>> for album, yr in zip(albums, years): 22 ... print yr, album 23 ... 24 1976 Poe 25 1987 Gaudi 26 1990 Freud 27 2003 Poe2 View Code7.break語(yǔ)句
Python 中的 break 語(yǔ)句可以結(jié)束當(dāng)前循環(huán)然后跳轉(zhuǎn)到下條語(yǔ)句,break 語(yǔ)句可以用在 while 和 for 循環(huán)中。
8.continue 語(yǔ)句
核心筆記: continue 語(yǔ)句
當(dāng)遇到continue 語(yǔ)句時(shí), 程序會(huì)終止當(dāng)前循環(huán),并忽略剩余的語(yǔ)句, 然后回到循環(huán)的頂端. 在開(kāi)始下一次迭代前,如果是條件循環(huán), 我們將驗(yàn)證條件表達(dá)式.如果是迭代循環(huán),我們將驗(yàn)證是否還有元素可以迭代. 只有在驗(yàn)證成功的情況下, 才會(huì)開(kāi)始下一次迭代。
continue可以被用在 while 和 for 循環(huán)里。
1 valid = False 2 count = 3 3 while count > 0: 4 input = input("enter password") 5 # check for valid passwd 6 for eachPasswd in passwdList: 7 if input == eachPasswd: 8 valid = True 9 break 10 if not valid: # (or valid == 0) 11 print "invalid input" 12 count -= 1 13 continue 14 else: 15 break View Code9.pass 語(yǔ)句
Python 提供了 pass 語(yǔ)句, 它不做任何事情 - 即 NOP , ( No OPeration , 無(wú)操作) 我們從匯編語(yǔ)言中借用這個(gè)概念。pass 同樣也可作為開(kāi)發(fā)中的小技巧, 標(biāo)記你后來(lái)要完成的代碼。例如:
def foo_func():pass 或是 if user_choice == 'do_calc':pass else:pass10. 再談 else 語(yǔ)句
在循環(huán)中使用時(shí), else子句只在循環(huán)完成后執(zhí)行, 也就是說(shuō) break 語(yǔ)句也會(huì)跳過(guò) else 塊。
1 #!/usr/bin/env python 2 3 def showMaxFactor(num): 4 count = num / 2 5 while count > 1: 6 if num % count == 0: 7 print('largest factor of %d is %d' % (num, count)) 8 break 9 count -= 1 10 else: 11 print num, "is prime" 12 13 for eachNum in range(10, 21): 14 showMaxFactor(eachNum) View Code11.迭代器和 iter() 函數(shù)
迭代器為類序列對(duì)象提供了一個(gè)類序列的接口。它們是一組數(shù)據(jù)結(jié)構(gòu),你可以利用它們的索引從0 開(kāi)始一直"迭代" 到序列的最后一個(gè)條目. 用"計(jì)數(shù)"的方法迭代序列是很簡(jiǎn)單的. Python 的迭代無(wú)縫地支持序列對(duì)象, 而且它還允許程序員迭代非序列類型, 包括用戶定義的對(duì)象。
為什么要迭代器?
? 提供了可擴(kuò)展的迭代器接口.
? 對(duì)列表迭代帶來(lái)了性能上的增強(qiáng).
? 在字典迭代中性能提升.
? 創(chuàng)建真正的迭代接口, 而不是原來(lái)的隨機(jī)對(duì)象訪問(wèn).
? 與所有已經(jīng)存在的用戶定義的類以及擴(kuò)展的模擬序列和映射的對(duì)象向后兼容
? 迭代非序列集合(例如映射和文件)時(shí), 可以創(chuàng)建更簡(jiǎn)潔可讀的代碼.
如何迭代?
迭代器就是有一個(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)用者, 迭代完成。
reversed() 內(nèi)建函數(shù)將返回一個(gè)反序訪問(wèn)的迭代器;enumerate() 內(nèi)建函數(shù)同樣也返回迭代器;另外兩個(gè)新的內(nèi)建函數(shù), any() 和 all(),如果迭代器中某個(gè)/所有條目的值都為布爾真時(shí),則它們返回值為真。
使用迭代器:
1)序列(for 循環(huán)會(huì)自動(dòng)調(diào)用迭代器的 next() 方法(以及監(jiān)視StopIteration 異常))
1 >>> myTuple = (123, 'xyz', 45.67) 2 >>> i = iter(myTuple) 3 >>> i.next() 4 123 5 >>> i.next() 6 'xyz' 7 >>> i.next() 8 45.67 9 10 fetch = iter(seq) 11 while True: 12 try: 13 i = fetch.next() 14 except StopIteration: 15 break 16 do_something_to(i) View Code2)字典
字典和文件是另外兩個(gè)可迭代的 Python 數(shù)據(jù)類型. 字典的迭代器會(huì)遍歷它的鍵(keys)。語(yǔ)句 for eachKey in myDict.keys() 可以縮寫為 for eachKey in myDict。
3)文件
文件對(duì)象生成的迭代器會(huì)自動(dòng)調(diào)用 readline() 方法。這樣, 循環(huán)就可以訪問(wèn)文本文件的所有行,也可以使用更簡(jiǎn)單的 for eachLine in myFile。
記住:在迭代可變對(duì)象的時(shí)候修改它們并不是個(gè)好主意。
一個(gè)序列的迭代器只是記錄你當(dāng)前到達(dá)第多少個(gè)元素, 所以如果你在迭代時(shí)改變了元素, 更新會(huì)立即反映到你所迭代的條目上.在迭代字典的 key 時(shí), 你絕對(duì)不能改變這個(gè)字典. 使用字典的 keys() 方法是可以的, 因?yàn)閗eys() 返回一個(gè)獨(dú)立于字典的列表. 而迭代器是與實(shí)際對(duì)象綁定在一起的, 它將不會(huì)繼續(xù)執(zhí)行下去。
1 >>> myDict = {'a': 1, 'b': 2, 'c': 3, 'd': 4} 2 >>> for eachKey in myDict: 3 ... print eachKey, myDict[eachKey] 4 ... del myDict[eachKey] 5 ... a 1 6 Traceback (most recent call last): 7 File "", line 1, in ? 8 RuntimeError: dictionary changed size during iteration View Code如何創(chuàng)建迭代器?
對(duì)一個(gè)對(duì)象調(diào)用 iter() 就可以得到它的迭代器. 它的語(yǔ)法如下:
iter(obj)
iter(func, sentinel )
如果你傳遞一個(gè)參數(shù)給 iter() , 它會(huì)檢查你傳遞的是不是一個(gè)序列, 如果是, 那么很簡(jiǎn)單:根據(jù)索引從 0 一直迭代到序列結(jié)束. 另一個(gè)創(chuàng)建迭代器的方法是使用類。如果是傳遞兩個(gè)參數(shù)給 iter() , 它會(huì)重復(fù)地調(diào)用 func , 直到迭代器的下個(gè)值等于sentinel 。
12.列表解析
列表解析的語(yǔ)法:[expr for iter_var in iterable]
這個(gè)語(yǔ)句的核心是 for 循環(huán), 它迭代 iterable 對(duì)象的所有條目. 前邊的 expr 應(yīng)用于序列的每個(gè)成員, 最后的結(jié)果值是該表達(dá)式產(chǎn)生的列表. 迭代變量并不需要是表達(dá)式的一部分。
列表解析還提供了一個(gè)擴(kuò)展版本的語(yǔ)法:[expr for iter_var in iterable if cond_expr],這個(gè)語(yǔ)法在迭代時(shí)會(huì)過(guò)濾/捕獲滿足條件表達(dá)式 cond_expr 的序列成員。
矩陣樣例:
>>> [(x+1,y+1) for x in range(3) for y in range(5)] [(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5)]磁盤文件樣例:
可以通過(guò) for line in data 迭代文件內(nèi)容,不過(guò), 除了這個(gè), 我們還可以把每行分割( split )為單詞, 然后我們可以像這樣計(jì)算單詞個(gè)數(shù):
>>> f = open('hhga.txt', 'r')
>>> len([word for line in f for word in line.split()])
91
快速地計(jì)算文件大小
import os
>>> os.stat('hhga.txt').st_size
499L
假定文件中至少有一個(gè)空白字符, 我們知道文件中有少于 499 個(gè)非空字符. 我們可以把每個(gè)單詞的長(zhǎng)度加起來(lái), 得到和:
>>> f.seek(0)
>>> sum([len(word) for line in f for word in line.split()])
408
13.生成器表達(dá)式
生成器表達(dá)式是列表解析的一個(gè)擴(kuò)展。生成器是特定的函數(shù), 允許你返回一個(gè)值, 然后"暫停"代碼的執(zhí)行, 稍后恢復(fù)。列表解析的一個(gè)不足就是必要生成所有的數(shù)據(jù), 用以創(chuàng)建整個(gè)列表. 這可能對(duì)有大量數(shù)據(jù)的迭代器有負(fù)面效應(yīng). 生成器表達(dá)式通過(guò)結(jié)合列表解析和生成器解決了這個(gè)問(wèn)題。
列表解析:
[expr for iter_var in iterable if cond_expr]
生成器表達(dá)式:
(expr for iter_var in iterable if cond_expr)
生成器表達(dá)式并不真正創(chuàng)建數(shù)字列表, 而是返回一個(gè)生成器,這個(gè)生成器在每次計(jì)算出一個(gè)條目后,把這個(gè)條目“產(chǎn)生”(yield)出來(lái). 生成器表達(dá)式使用了"延遲計(jì)算"(lazy evaluation), 所以它在使用內(nèi)存上更有效.
磁盤文件樣例:
>>> sum(len(word) for line in data for word in line.split()) ? ? ##sum() 函數(shù)(它的參數(shù)不僅可以是列表,還可以是可迭代對(duì)象,比如生成器表達(dá)式)
408
交叉配對(duì)例子:
1 rows = [1, 2, 3, 17] 2 3 def cols(): # example of simple generator 4 yield 56 5 yield 2 6 yield 1 7 8 x_product_pairs = ((i, j) for i in rows for j in cols()) 9 10 >>> for pair in x_product_pairs: 11 ... print pair 12 ... 13 (1, 56) 14 (1, 2) 15 (1, 1) 16 (2, 56) 17 (2, 2) 18 (2, 1) 19 (3, 56) 20 (3, 2) 21 (3, 1) 22 (17, 56) 23 (17, 2) 24 (17, 1) View Code重構(gòu)樣例:
讀取文件的行的首選方法應(yīng)該是這樣:(readlines() 會(huì)讀取文件的所有行)
1 f = open('/etc/motd', 'r') 2 longest = 0 3 allLines = f.readlines() 4 f.close() 5 for line in allLines: 6 linelen = len(line.strip()) 7 if linelen > longest: 8 longest = linelen 9 return longest View Code轉(zhuǎn)載于:https://www.cnblogs.com/christal-11/p/7682414.html
總結(jié)
以上是生活随笔為你收集整理的Python 核心编程(第二版)——条件和循环的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: codeMirror配置
- 下一篇: websocket python爬虫_p