《Python基礎教程》 讀書筆記 第五章(下)迴圈語句

來源:互聯網
上載者:User

標籤:

5.5.1while迴圈

 

x=1while x<=100:    print x    x+=1 

 

確保使用者輸入了名字:

name=""while not name:    name=raw_input(‘please enter your name:‘)print ‘hello,%s!‘%name

5.5.2for迴圈

while語句非常靈活。它可以用來在任何條件為真的情況下重複執行一個代碼塊。一般情況下這樣就夠用了,但是有些時候還得量體裁衣。比如要為一個集合(序列和其他可迭代對象)的每個元素都執行一個代碼塊。這個時候可以使用for語句:

words=[‘a‘,‘b‘,‘c‘,‘d‘]for word in words:    print word

5.5.3迴圈遍曆字典元素

一個簡單的for語句就能迴圈字典的所有鍵,就像處理序列一樣

d={‘x‘:1,‘y‘:2,‘z‘:3}for key in d:    print key,‘corresponds to‘,d[key]

注意:字典元素的順序通常是沒有定義的。換句話說,迭代的時候,字典中的健和值都能保證被處理,但是處理順序不確定。如果順序很重要的話,可以將索引值儲存在單獨的列表中,例如在迭代前進行排序。

5.5.4一些迭代工具

1.並行迭代

程式可以同時迭代兩個序列。

names=[‘anne‘,‘beth‘,‘george‘,‘damon‘]ages=[12,45,32,102]for i  in range(len(names)):    print names[1],‘is‘,ages[i],‘years old‘

內建的zip函數可以用來進行並行迭代,可以把兩個序列“壓縮”在一起,然後返回一個元組的列表:

>>> zip(names,ages)[(‘anne‘, 12), (‘beth‘, 45), (‘george‘, 32), (‘damon‘, 102)]

迴圈中解包元組:

>>> for name,age in zip(names,ages):    print name,‘is‘,age,‘years old‘anne is 12 years oldbeth is 45 years oldgeorge is 32 years olddamon is 102 years old

zip函數也可以作用於任意多的序列。關於它很重要的一點是zip可以應付不等長的序列:當最短的序列“用完”的時候就會停止:

>>> zip(range(5),xrange(100000000))[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]

2.編號迭代

有些時候想要迭代序列中的對象,同時還要擷取當前對象的索引。例如,在一個字串列表中替換所有包含’XXX’的子字串:\

index=0for string in strings:    if ‘xxx‘ in strings:    strings[index]=‘[censored‘index+=1

另一種方法是使用內建的enumerate函數:

3.翻轉和排序迭代

兩個有用的函數:reversed和sorted:它們同列表的reverse和sort (sorted和sort使用同樣的參數)方法類似,但作用於任何序列或可迭代對象上,不是原地修改對象,而是返回翻轉或排序後的版本:

>>> sorted([4,3,5,8,1])[1, 3, 4, 5, 8]>>> sorted(‘hell,world!‘)[‘!‘, ‘,‘, ‘d‘, ‘e‘, ‘h‘, ‘l‘, ‘l‘, ‘l‘, ‘o‘, ‘r‘, ‘w‘]>>> list(reversed(‘hello,world‘))[‘d‘, ‘l‘, ‘r‘, ‘o‘, ‘w‘, ‘,‘, ‘o‘, ‘l‘, ‘l‘, ‘e‘, ‘h‘]>>> ‘‘.join(reversed(‘hello,world!‘))‘!dlrow,olleh‘

5.5.5跳出迴圈

1. break

結束(跳出)迴圈可以使用break語句。

from math import sqrtfor n in range(99,0,-1):    root=sqrt(n)    if root ==int(root):        print n        break

2. continue

continue會讓當前的迭代結束,“跳”到下一輪迴圈的開始。它最基本的意思是“跳過剩餘的迴圈體,但是不結束迴圈”。當迴圈體很大而且很複雜的時候,這會很有用,有些時候因為一些原因可能會跳過它—這個時候可以使用continue語句:

for x in seq:

    if condition1: continue

    if condition2: continue

    if condition3: continue

do_something()

da_ something_ else()

do_ another_thing()

etc()

很多時候,只要使用if語句就可以了:

for x in seq:

    if not (condition1 or condition2 or condition3)

      do_something()

      do_something_else()

      do_another_thing()

      etc()

3.while True/break習語

while True:    word=raw_input(‘please enter a word:‘)    if not word:break    print ‘the word was ‘+word

while True的部分實現了一個永遠不會自己停止的迴圈。但是在迴圈內部的if語句中加入條件可以的,在條件滿足時調用break語句。這樣一來就可以在迴圈內部任何地方而不是只在開頭(像普通的while迴圈一樣)終止迴圈。if/break語句自然地將迴圈分為兩部分:第1部分負責初始化(在普通的while迴圈中,這部分需要重複),第2部分則在迴圈條件為真的情況下使用第1部分內初始化好的資料。

5.5.6迴圈中的else子句

from math import sqrtfor n in range(99,81,-1):    root=sqrt(n)    if root==int(root):        print n        break    else:        print "didn‘t find it"

5.6列表推導式——輕量級迴圈

列表推導式(list comprehension)是利用其他列表建立新列表(類似於數學術語中的集合推導式)的一種方法。它的工作方式類似於for迴圈:

>>> [x*x for x in range(10)][0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

可以增加更多for語句的部分:

>>> [(x,y)for x in range(3) for y in range(3)][(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)

5.7三人行 :pass, del和exec

5.7.1 pass

它可以在的代碼中做預留位置使用。比如程式需要一個jf語句,然後進行測試,但是缺少其中一個語句塊的代碼,考慮下面的情況:

if name==‘ralph‘:    print ‘welcome!‘elif name==‘enid‘:    passelif name==‘bill‘:    print ‘access‘

5.7.2使用del刪除

>>> scoundrel={‘age‘:42,‘first name‘:‘robin‘,‘last name‘:‘of locksley‘}>>> robin=scoundrel>>> scoundrel{‘last name‘: ‘of locksley‘, ‘first name‘: ‘robin‘, ‘age‘: 42}>>> robin{‘last name‘: ‘of locksley‘, ‘first name‘: ‘robin‘, ‘age‘: 42}>>> coundrel=None>>> robin{‘last name‘: ‘of locksley‘, ‘first name‘: ‘robin‘, ‘age‘: 42}>>> robin=None

首先,robin和scoundrel都被綁定到同一個字典上。所以當設定scoundrel為None的時候,字典通過robin還是可用的。但是當我把robin也設定為None的時候,字典就“漂”在記憶體裡面了,沒有任何名字綁定到它上面。沒有辦法擷取和使用它,所以Python解譯器(以其無窮的智慧)直接刪除了那個字典(這種行為被稱為垃圾收集)。

>>> x=["hello","world"]>>> y=x>>> y[1]="python">>> x[‘hello‘, ‘python‘]>>> del x>>> y[‘hello‘, ‘python‘]>>> xTraceback (most recent call last):  File "<input>", line 1, in <module>NameError: name ‘x‘ is not defined

5.7.3 使用exec和eval執行和求值字串

1 .exec
執行一個字串的語句是exec:

>>> exec "print ‘hello,world!‘"hello,world!
>>> from math import sqrt>>> exec "sqrt=1">>> sqrt(4)Traceback (most recent call last):  File "<input>", line 1, in <module>TypeError: ‘int‘ object is not callable

exec語句最有用的地方在於可以動態地建立代碼字串。如果字串是從其他地方獲得的—很有可能是使用者—那麼幾乎不能確定其中到底包含什麼代碼。所以為了安全起見,可以增加一個字典,起到命名空間的作用。

可以通過增加in<scope>來實現,其中的<seope>就是起到放置代碼字串命名空間作用的字典。

>>> from math import sqrt>>> scope={}>>> exec "sqrt=1" in scope>>> sqrt(4)2.0>>> scope[‘sqrt‘]1

可以看到,潛在的破壞性代碼並不會覆蓋sqrt函數,原來的函數能正常工作,而通過exec賦值的變數sqrt只在它的範圍內有效。注意,如果需要將scope列印出來的話,會看到其中包含很多東西,因為內建的_builtins_字典自動包含所有的內建函數和值:

>>> len(scope)2>>> scope.keys()[‘__builtins__‘, ‘sqrt‘]

2.eval

eval(用於“求值”)是類似於exec的內建函數。exec語句會執行一系列Python語句,而eval會計算Python運算式(以字串形式書寫),並且返回結果值,(exec語句並不返回任何對象,因為它本身就是語句)。例如,可以使用下面的代碼建立一個Python計算機:

>>> eval(raw_input("enter an arthmetric expression:"))enter an arthmetric expression: 6+18*242

5.8 小結  

本章的新函數

chr(n)   當傳入序號n時,返回n所代表的包含一個字元的字串,(0, n< 256)
eval(source[,globals[,locals]])  將字元申作為運算式計算,並且傳回值
enumerate(seq) 產生用於迭代的(索引,值)對
ord(c)  返回單字元字串的int值
range([start,]stop[,step])  建立整數的列表
reversed(seq)  產生seq中值的反向版本,用於迭代
sorted(seq[,cmp][,key][,reverse])  返回seq中值排序後的列表
xrange([start,]stop[,step])  創造xrange對象用於迭代
zip(seq1,_eq2.…)  創造用於並行迭代的新序列

《Python基礎教程》 讀書筆記 第五章(下)迴圈語句

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.