1. 程式人生 > >Python學習-第五章 條件、迴圈及其他語句

Python學習-第五章 條件、迴圈及其他語句

條件、迴圈及其他語句

序列解包(可迭代物件解包):將一個序列(或任何可迭代物件)解包,並將得到的值儲存到一系列變數中。

>>> values=1,2,3
>>> values
(1, 2, 3)
>>> x,y,z=values
>>> x
1

這種序列解包方法在字典中隨便獲取(或刪除)一個鍵-值對,然後把獲取的鍵-值對以元組的方式返回,可以直接將返回的元組解包到兩個變數中。

>>> scoundrel={'name':'Robin','girlfriend':'Marion'}
>>> key,value=scoundrel.popitem()
>>> key
'girlfriend'
>>> value
'Marion'
要注意的是要解包的序列包含的元素個數必須與你等號左邊列出的目標個數相同,否則Python將引發異常。

我們可以使用星號運算子(*)來收集多餘的值,這樣無需確保值和變數的個數相同

>>> a,b,*rest=[1,2,3,4]
>>> rest
[3, 4]

鏈式賦值是一種快捷方式,用於將多個變數關聯到同一個值。

x=y=somefunction()與下面程式碼等價
y=somefunction()
x=y
但是這兩條語句可能與下面的語句不等價:
x=somefunction()
y=somefunction()

Python支援鏈式比較:可同時使用多個比較運算子,如0<age<100.
is:相同運算子,其作用看似與==一樣,但是實際並不如此。is檢查兩個物件是否相同(而不是相等)。

>>> x=y=[1,2,3]
>>> z=[1,2,3]
>>> x==y
True
>>> x==z
True
>>> x is y
True
>>> x is z     //這兩個列表雖然相等,但並非同一個物件,可以使用id(x)與id(z)檢視
False

in:成員資格運算子

>>> name=input('What is your name?')
What is your name?Wang xuan
>>> if 's' in name:
...   print('Your name contains the letter "s".')
... else:
...   print('Your name does not contain the letter "s".')
...
Your name does not contain the letter "s".

內建函式zip是一個很有用的並行迭代工具,它將兩個序列“縫合”起來,並返回一個由元組組成的序列。返回值是一個適合迭代的物件,要檢視其內容,可使用list將其轉換為列表。函式zip可用於“縫合”任意數量的序列。當序列的長度不同時,函式zip將在最短的序列用完後停止“縫合”。

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

反向迭代函式reversed和排序後再迭代函式sorted

>>> sorted([4,3,6,8,3])
[3, 3, 4, 6, 8]
>>> sorted('Hello,world!')
['!', ',', 'H', 'd', 'e', 'l', 'l', 'l', 'o', 'o', 'r', 'w']
>>> list(reversed('Hello,world!'))
['!', 'd', 'l', 'r', 'o', 'w', ',', 'o', 'l', 'l', 'e', 'H']
>>> ''.join(reversed('Hello,world!'))
'!dlrow,olleH'

要按字母表排序,可以先轉換為小寫。將sort或sorted的可以引數設定為str.lower。

>>> sorted("aBc",key=str.lower)
['a', 'B', 'c']

要結束迴圈,可使用break。假設你要找出小於100的最大平方值,可從100開始向下迭代。找到一個平方值後直接跳出迴圈。

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

列表推導是一種從其他列表建立列表的方式,類似於數學中的集合推導。

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

>>> [x*x for x in range(10) if x%3==0]
[0, 9, 36, 81]

>>> [(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)]

pass語句是什麼都不用做
垃圾收集用del語句,del不僅會刪除到物件的引用,還會刪除名稱本身。
函式exec將字串作為程式碼執行。在呼叫函式exec時不能只提供一個引數,還應向它傳遞一個名稱空間-用於放置變數的地方。

>>> from math import sqrt
>>> scope={}
>>> exec('sqrt=1',scope)
>>> sqrt(4)
2.0
>>> scope['sqrt']
1

eval函式時計算用字串表示的Python表示式的值,並返回結果(exec什麼都不返回,因為它本身就是條語句)。

>>> eval(input("Enter an arithmetic expression:"))
Enter an arithmetic expression:6+18*2
42