Python基礎編程(五)條件、循環和其餘語句

5.2 賦值魔法

就算是不起眼的賦值語句也有一些特殊的技巧。

5.2.1 序列解包

多個賦值操做能夠同時進行:
>>>x,y,z = 1,2,3
>>>print x,y,z
1 2 3
用它交換兩個(或更多個)變量也是沒有問題的:
>>>x,y = y,x
>>>print x,y,z
2 1 3
這叫作序列解包或可選代解包——將多個值的序列解開,而後放到變量的序列中。
>>>values = 1,2,3
>>>values
(1,2,3)
>>>x,y,z = values
>>>x
1
當函數或者方法返回元組(或者其餘序列或可迭代對象)時,這個特性尤爲有用。假設須要獲取(和刪除)字典中任意的鍵-值對,可使用popitem方法,這個方法將鍵-值做爲元組返回。
>>>scoundrel = {'name':'Robin','girlfriend':'Marion'}
>>>key.value = scoundrel.popitem()
>>>key
'girlfriend'
>>>value
'Marion'
它會容許函數返回一個以上的值而且打包成元組,而後經過一個賦值語句很容易進行訪問。所解包的序列中的元素數量必須和放置在賦值符號=左邊的變量數量徹底一致,不然Python會在賦值是引起異常。

5.2.2 鏈式賦值

鏈式賦值是將同一個值賦給多個變量的捷徑。
x = y = somefunction()

5.3 語句塊:縮排的樂趣

語句塊是在條件爲真(條件語句)時執行或者執行屢次(循環語句)的一組語句。在代碼前放置空格來縮進語句便可建立語句塊。
塊的每行都應該縮進一樣的量。在Python中,冒號(:)用來標識語句塊的開始,塊中的每個語句都是縮進的(縮進量相同)。當退回到和已經閉合的塊同樣的縮進量時,就表示當前塊已經結束了。

5.4 條件和條件語句

下面的值在做爲布爾表達式的時候,會被解釋器看做假(false):
False  None  0  「」  ()  []  {}
也就是標準值False和None、全部類型的數字0(包括浮點型、長整型和其餘類型)、空序列(好比空字符串、元組和列表)以及空的字典都爲假。其餘的一切都被解釋爲真,包括特殊值True。
布爾值True和False屬於布爾類型,bool函數能夠用來轉化其餘值:
>>>bool(42)
True
>>>bool("")
False

5.4.2 條件執行和if語句

5.4.3 else語句

5.4.4 elif語句

若是須要檢查多個條件,就可使用elif,它是「else if」的簡寫,也是if和else字句的聯合使用——也就是具備條件的else字句。

5.4.5 嵌套代碼塊

5.4.6 更復雜的條件

1. 比較運算符

x == y                x等於y
x < y                 x小於y
x > y		      x大於y
x <= y                x小於等於y
x >= y		      x大於等於y
x != y                x不等於y
x is y		      x和y是同一個對象	
x is not y	      x和y是不一樣的對象
x in y		      x是y容器(例如,序列)的成員
x not in y	      x不是y容器(例如,序列)的成員

3. is:同一性運算符

>>> x = y = [1,2,3]
>>> z = [1,2,3]
>>> x == y
True
>>> x== z
True
>>> x is y
True
>>> x is z
False
is運算符是斷定同一性而不是相等性的。變量x和y都被綁定到同一個列表上,而變量z被綁定在裏另一個具備相同數值和順序的列表上。它們的值可能相等,可是卻不是同一個對象。

5. 字符串和序列比較

5.4.7 斷言

若是須要確保程序中的某個條件必定爲真才能讓程序正常工做的話,assert語句就有用了,它能夠在程序中置入檢查點。條件後能夠添加字符串,來解釋斷言:
>>> age = -1
>>> assert 0< age <100.'The age must be realistic'
Traceback (most recent call last):
    File "<stdin>".line 1. in ?
AssertionError: The age must be realistic

5. 循環

5.5.1 while循環

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

5.5.2 for循環

words = ['this','is','an','ex','parrot']
for word in words
    print word
numbers = [0,1,2,3,4,5,6,7,8,9]
for number in numbers:
    print number
Range函數的工做方式相似於分片。它包含下限,但不包含上限,默認下限爲0。
>>>range(0,10)
[1,2,3,4,5,6,7,8,9]
>>>range(10)
[1,2,3,4,5,6,7,8,9]
for number in range(1,101)
    print number

5.5.3 循環遍歷字典元素

d = {'x':1,'y':2,'z':3}
for key,value in d.items():
    print key,'correponds',value

5.5.4 一些迭代代工具

1. 並行迭代

names = ['anne','beth','george','damon']
ages = [12,45,32,102]
for i in range(len(names)):
    print names[i],'is',ages[i],'year old'
內建的zip函數能夠用來進行並行迭代,能夠把兩個序列「壓縮「在一塊兒,而後返回一個元祖的列表:
zip(names,ages)
[('anne',12),('beth',45),('george',32),('damon',102)]
for name,age in zip(names,ages):
    print name,'is',age,'year old'
zip函數也能夠做用於任意多的序列。並且zip能夠應付不等長的序列:當最短的序列」用完「的時候就會中止。

2. 編號迭代

有時候想要迭代序列中的對象,同時還要獲取當前對象的索引。
index = 0
for string in strings:
    if 'xxx' in string:
    strings[index] = '[censored]'
index += 1
另外一種方法是使用內建的enumerate函數:
for index,string in enumerate(strings):
    if 'xxx' in string:
      strings[index] = '[censored]'
這個函數能夠在提供索引的地方迭代索引-值對。

3. 翻轉和序列迭代

reversed和sorted:它們同列表的reverse和sort方法相似,但做用於任何可迭代對象上,不是原地修改對象,而是返回反轉或排序後的版本。

5.5.5 跳出循環

1. break

2. continue

3. while True/break語句

Python中的whlie和for循環很是靈活,但一旦使用while語句就會遇到一個須要更多功能的問題。若是須要當用戶在提示符下輸入單詞是作一些事情,而且在用戶不輸入單詞後結束循環。可使用下面的方法:
while True:
      word = raw_input('Please enter a word: ')
      if not word: break
      print 'The word was ' + word

5.5.6 循環中else子句

from math import sqrt
for n in range (99,81,-1):
    root = sqrt(n)
    if root == int(root):
       print n
       break
else:
     print "Didn't find it!"
再循環中增長一個else子句——它僅在沒有調用break時執行。

5.7 三人行

pass、del和exec。

5.7.1 什麼都沒發生

有的時候,程序什麼事情都不用作。pass語句:
它能夠在代碼中做佔位符使用。好比程序須要啊一個if語句,而後進行測試,可是缺乏其中一個語句塊的代碼。代碼不會執行,由於Python中空代碼塊是非法的。解決發發就是在語句塊中加上一個pass語句:
if name == 'Ralph Auldus Melish':
  print 'Welcome!'
  elif name == 'Enid':
       #還沒完……
       pass
  elif name == 'Bill Gates':
      print 'Access Denied'

5.7.2 使用del刪除

使用del語句,它不只會一出一個對象的引用,也會移除那個名字自己。、

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

1. exec

>>> exec "print 'Hello,word!'"
Hello,word!
exec與劇中最有用的地方在於能夠動態地建立代碼字符串。
實在沒看懂 = =

2. eval

eval(用於」求值「)是相似於exec的內建函數。exec語句會執行一系列Python語句,而eval會計算Python表達式(以字符串形式書寫),而且返回結果值,(exec語句並不返回任何對象,由於它自己就是語句)。
相關文章
相關標籤/搜索