標籤:
條件
和其他語言類似,python中使用if...elif...else來形成分支,支援三目操作符 ?:,python中沒有switch,但是縮排的特性讓if...elif...else的結構同樣便於閱讀
迴圈控制
python中除了break,continue這兩個一般的迴圈控制語句之外,還有一個pass,執行空操作。由於python的文法特性,添加pass可以留空某一個域,避免在調試過程中反覆報錯。
while迴圈
python中的while迴圈比其他語言增加了一個特性:支援else。在其他語言中,經常會用到判斷是否正常結束迴圈還是中途break非正常結束,python中利用while...else可以簡潔明了地解決這個問題:
i = 0
s = ‘this is a test string‘
while i < len(s):
? ? if s[i] == ‘z‘ :
? ? ? ? break
? ? i += 1
else:
? ? print "There is no z in the string"
由於break會跳出整個while,包括else,所以else後面的語句可以在正常結束的情況下被執行。
for迴圈
python中的for迴圈更像是perl中的foreach,支援迭代器等特性,功能非常強大
for會訪問可迭代對象中的每一個元素,並在所有元素都訪問完畢之後結束迴圈,可迭代對象包括序列、字典、集合、迭代器等。
1. 直接迴圈序列項:這是最直接的迴圈方式:
alist = [‘A’,’B’,’C’,’D‘]
foreach value in alist:
? ? print “value=“,value
如果是字典類型,則直接存取返回的是鍵,而不是值
2. 通過序列索引來訪問序列:通過range()函數等,建立序列的索引對應序列,再通過逐一查看該索引序列去訪問原序列, 如果要提取索引值的話,有些情況下這種方式也是必要的:
alist = [‘A’,’B’,’C’,’D‘]
foreach index in range(len(alist)):
? ? print “index=%i,value=%s“ % (index,list[index])
range()方法的完整文法是range(start,end,step=1),range(1,10,2)建立一個1到9的奇數序列,省略最後一個參數則步長預設為1,省略兩個參數時,range()文法為range(end),預設從0開始,步長為1並且不可改變:
print range(1,10,2)
print range(1,10)
print range(10)
3. 同時訪問索引和內容:通過enumerate()函數,構建一個enumerate對象,for每次迴圈可以從該對象中擷取index和內容的對應元組,如果是字典的話,使用enumerate()方法只會提取鍵和其對應的索引(注意字典鍵的無序性),想要同時訪問字典的鍵和值,則需要通過字典的iteritems()方法:
adict = {‘A‘:‘B‘,‘C‘:‘D‘,‘EEE‘:‘F‘}
for k,v in adict.iteritems():
? ? print k,v
alist = [‘A‘,‘B‘,‘C‘,‘D‘]
for k,v in enumerate(alist):
? ? print k,v
迭代器
迭代器和序列不同,並非根據索引來計數,迭代器是有一個next()方法的對象,for語句會使用next()方法擷取下一項,並且在條目全部取出後,引發StopIteration異常,從而完成迭代。
通過iter方法可以產生一個迭代器,實際上,序列在for迴圈的過程中,也會被當成迭代器來迭代工作。字典的迭代器只會遍曆字典的鍵,所以當使用for key in adict的時候,迴圈的是鍵,字典可以通過dict.iter*來產生鍵、值、索引值對的迭代器。
迭代器是不可變的,所以不能在逐一查看迭代器的過程中對相對應的對象進行改變,如果需要進行改變的操作,則需要利用keys()方法等返回一個鍵的列表,通過逐一查看索引或者鍵的方式,再對對象進行改變。
清單產生器
在for迴圈的使用中,可以看到通過range()方法可以實現其他語言中for的簡易功能,通過清單產生器產生特有的列表,則可以完成其他語言中for的全部功能。
列表解析:
[expr for iter_var in iterable if cond_expr]
產生器運算式:
(expr for iter_var in iterable if cond_expr)
產生器可以得到一個記憶體更加友好的結果,他並不建立數字列表,而是在每次計算出一個條目後,就講該條目產生出來,產生器延遲計算的方式使其在記憶體上更加有效。
通過產生器,可以非常大限度上地簡化代碼,並且最佳化記憶體結構。
如通過[(x,y)for x in range(3) for y in range(3)]可以形成一個3*3的矩陣,而產生器則是不在記憶體中產生矩陣,而是逐個計算並產生結果。若要統計一個檔案中的非空位元組數,直接使用列表解析則可能會佔用很大的記憶體,如使用 sum(len(word)) for line in data for word in line.split() 產生器,則可以事先不佔用記憶體,而是逐行訪問檔案。
利用產生器,可以重構一些比較複雜的代碼,如統計一個檔案中的最長行的長度:
f = open(‘file’,’r‘)
allLineLens = [len(x.strip()) for x in f]?
f.close()
return max(allLineLens)
在allLineLens中解析了一個列表,會講整個檔案讀取到記憶體中,使用產生器:
return max(len(x.strip())) for x in open(‘file‘)
可以逐行讀取,最佳化記憶體的同時,簡化代碼。
Python在科學計算上大幅被應用,科學家是討厭迴圈的思維方式,產生器的方式將資料的結構更加直觀地展示出來,更加能符合科學家的思維習慣應該也有很大關係吧。
Python學習_05_條件、迴圈