條件語句
Python中的if語句如下:
if exPRession: expr_true_suite
其中expression可以用布爾操作符and, or 和 not實現多重判斷條件。
如果一個復合語句的的代碼塊僅僅包含一行代碼,那么它可以和前面的語句寫在同一行:
if expression: dosomething但實際上,為了可讀性,我們盡量不這么做
else語句的使用:
if expression: expr_true_suiteelse: expr_false_suite
Python使用縮進強制使代碼對齊,可以避免制造一些類型的懸掛else問題。但同樣要讓我們非常小心代碼的對齊問題,否則代碼很可能不能使用。
elif(else—if)語句
Python沒有switch/case語句,所以用if—elif來替代它的使用,并不會降低太多的閱讀性
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!'
上面的語句也可以用序列改寫:
if user.cmd in ('create', 'delete', 'update'): action = '%s item' % user.cmdelse: action = 'invalid choice... try again!'
再或者是字典方案
msgs = {'create': 'create item','delete': 'delete item','update': 'update item'}default = 'invalid choice... try again!'action = msgs.get(user.cmd, default)
條件表達式(即“三元操作符”)
也就是C里的C?X:Y
Python里使用了 X if C else Y:
>>> x, y = 4, 3>>> smaller = x if x < y else y>>> smaller3
while語句
while循環的一般語法如下:
while expression: suite_to_repeat
while循環一般被用作計數循環或者無限循環:
>>> count = 0>>> while (count < 9): print 'the index is:', count count += 1the index is: 0the index is: 1the index is: 2the index is: 3the index is: 4the index is: 5the index is: 6the index is: 7the index is: 8>>>while True: message = raw_input("please input :") if message.lower() == 'q': break
for 語句
Python的for非常強大,它可以遍歷序列成員,可用在列表解析和生成器表達式,會自動地調用迭代器的 next()方法,捕獲StopIteration異常并結束循環(這都是在內部發生的),Python的for循環不同于傳統語言的for循環,類似于shell的foreach
一般語法
for循環訪問一個可迭代對象(如序列或迭代器)中所有元素,并在所有條目都處理后結束循環
for iter_var in iterable: suit_to_repeat
for循環迭代不同的序列對象,有如下例子:
>>> for eachLetter in 'Names': #迭代字符串 print 'current letter:',eachLettercurrent letter: Ncurrent letter: acurrent letter: mcurrent letter: ecurrent letter: s>>> nameList = ['Amy', 'Bob', 'Henry']>>> for eachName in nameList: #迭代序列項 print eachName, 'Lim'Amy LimBob LimHenry Lim>>> for nameIndex in range(len(nameList)): #不迭代元素,迭代索引 print "Liu,", nameList[nameIndex]Liu, AmyLiu, BobLiu, Henry>>> nameList = ['Donn', 'Shirley', 'Ben', 'Jane']>>> for i, eachone in enumerate(nameList): #用項和索引迭代 print '%d %s' %(i+1, eachone)1 Donn2 Shirley3 Ben4 Jane
for循環訪問迭代器和訪問序列的方法差不多,只是for語句會做一些額外的事而迭代器不代表循環條目的集合。
迭代器對象有一個next()方法,調用后返回下一個條目。迭代完后引發一個StopIteration異常告訴程序循環結束。for在內部直接調用next()并捕獲異常。
range()內建函數在之前的博文Python基本使用(2)里已經詳細說明。這里不贅述
xrange()
xrange()類似range(),當一個列表范圍很大時,xrange()更為合適,因為它不會在內存里創建列表的完整拷貝,它只能用于for循環中,在for循環外沒有任何意義。使用時性能遠高于range()。
sorted(), reversed(), enumerate(), zip()
>>> for album in sorted(albums): print album,Freud Gaudi Poe Poe2>>> for album in reversed(albums): print album,Poe2 Freud Gaudi Poe>>> for i, album in enumerate(albums): print i, album0 Poe1 Gaudi2 Freud3 Poe2>>> for album, yr in zip(albums, years): print yr, album1976 Poe1987 Gaudi1990 Freud2003 Poe2
break語句和continue語句
break,continue和C中的break,continue十分相似。
pass語句
因為Python沒有傳統的括號,所以用pass表示此代碼塊什么都不做。
另外,循環語句也可以接else語句
表示循環結束后執行此代碼塊。
迭代器和iter()函數
迭代器為類序列對象提供了一個類序列的接口。序列可以利用索引從0開始一直迭代到序列的最后一個條目,用計數的方法迭代序列是很簡單的。Python的迭代無縫支持序列對象,還允許非序列類型,包括用戶定義的對象。
迭代器用起來很靈巧,可以迭代不是序列但表現出序列行為的對象,例如字典的key,一個文件的行等等。Python在使用迭代時分不出是迭代器還是序列,讓人不用去關注這些,因為Python讓它像一個序列那樣操作。
使用迭代器:
序列:
>>> myTuple = (123, 'xyz', 45.67)>>> i = iter(myTuple)>>> i.next()123>>> i.next()'xyz'>>> i.next()45.67>>> i.next()Traceback (most recent call last):File "<pyshell#5>", line 1, in <module>i.next()StopIteration
如果這是一個實際應用程序,那么我們需要把代碼放在一個try—except 塊中。序列現在回自動地產生它們自己的迭代器,所以一個for循環:
for i in seq: do_something_to(i)
實際上是這樣工作:
fetch = iter(seq)while True: try: i = fetch.next() except StopIteration: break do_something_to(i)
字典:字典的迭代器會遍歷它的鍵(keys)
>>> legends = {('Poe', 'author'):(1809, 1849, 1976),}>>> legends = {('Poe', 'author'):(1809, 1849, 1976),('Gaudi','architect'):(1852, 1906, 1987),('Freud', 'psychoanalyst'):(1856, 1939, 1990)}>>> for eachLegend in legends: print 'Name: %s/tOccupation: %s' % eachLegend print 'Birth: %s/tDeath: %s/tAlbum:%s/n' % legends[eachLegend]Name: Poe Occupation: authorBirth: 1809 Death: 1849 Album:1976Name: Gaudi Occupation: architectBirth: 1852 Death: 1906 Album:1987Name: Freud Occupation: psychoanalystBirth: 1856 Death: 1939 Album:1990
另外,Python還引進了三個新的內建字典方法來定義迭代:myDict.iterkeys()(通過keys迭代),myDict.itervalues()(通過values迭代)以及myDict.iteritems()(通過key/value對來迭代)
文件
文件對象生成的迭代器會自動調用readline()方法,這樣,循環就可以訪問文本文件的所有行。 程序員可以用for eachLine in myFile 替換 for eachLine in myFile.readlines():
>>> myFile = open('config-win.txt')>>> for eachLine in myFile:... print eachLine, # comma suppresses extra /n...[EditorWindow]font-name: courier newfont-size: 10>>> myFile.close()
可變對象和迭代器
迭代可變對象時修改它們不是一個好主意,除了列表外其他序列類型不可變,所以危險就發生在這里。序列的迭代器只記錄你當前到達第多少個元素,如果你迭代時改變了元素,更新會立即反映到你所迭代的條目上。在迭代字典的key時,絕對不能改變這個字典(因為字典是無序的)。使用字典的keys()方法是可以的,因為keys()返回一個獨立于字典的列表,而迭代器與實際對象綁在一起,它將不會繼續執行下去:
>>> myDict = {'a': 1, 'b': 2, 'c': 3, 'd':4}>>> for eachKey in myDict: print eachKey, myDict[eachKey] del myDict[eachKey]a 1Traceback (most recent call last):File "<pyshell#4>", line 1, in <module>for eachKey in myDict:RuntimeError: dictionary changed size during iteration
創建迭代器
對一個對象調用iter()就可以得到它的迭代器:
iter(obj)iter(func, sentinel)如果傳遞一個參數給 iter() ,它會檢查你傳遞的是不是一個序列,如果是,那么很簡單:根據索引從0一直迭代到序列結束。
如果傳遞兩個參數給iter(),它會重復地調用func,直到迭代器的下個值等于sentinel
另一個創建迭代器的方法是類,以后我將在后面的章節詳細學習。
列表解析
列表解析是一項非常有用,簡單,而且靈活的工具,可以用來動態地創建列表。
列表解析的語法:
[expr for iter_var in iterable]
核心是for循環,迭代iterable對象的所有條目。前邊的expr應用于序列的每個成員,最后的結果值是該表達式產生的列表。迭代變量并不需要是表達式的一部分。
lambda函數表達式:
>>> map(lambda x: x ** 2, range(6)) #這是lambda函數表達式[0, 1, 4, 9, 16, 25]>>> [x ** 2 for x in range(6)] #這是列表解析[0, 1, 4, 9, 16, 25]
列表解析還有結合if的拓展版本
[expr for iter_var in iterable if cond_expr]
這個語法在迭代時會過濾/捕獲滿足條件表達式cond_expr的序列成員
以下例子是挑出序列中的奇數:
>>> seq = [11, 12, 16, 13, 10, 9, 9, 10, 8]>>> filter(lambda x: x % 2, seq) #用filter和lambda實現[11, 13, 9, 9]>>> [x for x in seq if x % 2] #用列表解析實現[11, 13, 9, 9]
生成器表達式
生成器表達式是列表解析的一個擴展,語法如下:
(expr for iter_var in iterable if cond_expr)
語法和列表解析基本相同,不過它并不真正創建數字列表,而是返回一個生成器,這個生成器在計算出一個條目后,把這個條目“產生”(yield)出來。生成器表達式用了“延遲計算”,所以它在使用內存上更有效。將在以后的學習中詳細地說明這一點
新聞熱點
疑難解答