Python學習_05_條件、迴圈

來源:互聯網
上載者:User

標籤:

條件

和其他語言類似,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_條件、迴圈

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.