python基础7 (来自廖雪峰的官方网站)
高級特性
迭代
如果給定一個list或tuple,我們可以通過for循環來遍歷這個list或tuple,這種遍歷我們稱為迭代(Iteration)。
在Python中,迭代是通過for ... in來完成的,而很多語言比如C語言,迭代list是通過下標完成的,比如Java代碼:
可以看出,Python的for循環抽象程度要高于C的for循環,因為Python的for循環不僅可以用在list或tuple上,還可以作用在其他可迭代對象上。
list這種數據類型雖然有下標,但很多其他數據類型是沒有下標的,但是,只要是可迭代對象,無論有無下標,都可以迭代,比如dict就可以迭代:
因為dict的存儲不是按照list的方式順序排列,所以,迭代出的結果順序很可能不一樣。
默認情況下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同時迭代key和value,可以用for k, v in d.items()。
由于字符串也是可迭代對象,因此,也可以作用于for循環:
所以,當我們使用for循環時,只要作用于一個可迭代對象,for循環就可以正常運行,而我們不太關心該對象究竟是list還是其他數據類型。
那么,如何判斷一個對象是可迭代對象呢?方法是通過collections模塊的Iterable類型判斷:
>>> from collections import Iterable >>> isinstance('abc', Iterable) # str是否可迭代 True >>> isinstance([1,2,3], Iterable) # list是否可迭代 True >>> isinstance(123, Iterable) # 整數是否可迭代 False最后一個小問題,如果要對list實現類似Java那樣的下標循環怎么辦?Python內置的enumerate函數可以把一個list變成索引-元素對,這樣就可以在for循環中同時迭代索引和元素本身:
>>> for i, value in enumerate(['A', 'B', 'C']): ... print(i, value) ... 0 A 1 B 2 C上面的for循環里,同時引用了兩個變量,在Python里是很常見的,比如下面的代碼:
>>> for x, y in [(1, 1), (2, 4), (3, 9)]: ... print(x, y) ... 1 1 2 4 3 9列表生成式
列表生成式即List Comprehensions,是Python內置的非常簡單卻強大的可以用來創建list的生成式。
舉個例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11)):
但如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做?方法一是循環:
>>> L = [] >>> for x in range(1, 11): ... L.append(x * x) ... >>> L [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]但是循環太繁瑣,而列表生成式則可以用一行語句代替循環生成上面的list:
>>> [x * x for x in range(1, 11)] [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]寫列表生成式時,把要生成的元素x * x放到前面,后面跟for循環,就可以把list創建出來,十分有用,多寫幾次,很快就可以熟悉這種語法。
for循環后面還可以加上if判斷,這樣我們就可以篩選出僅偶數的平方:
還可以使用兩層循環,可以生成全排列:
>>> [m + n for m in 'ABC' for n in 'XYZ'] ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']三層和三層以上的循環就很少用到了。
運用列表生成式,可以寫出非常簡潔的代碼。例如,列出當前目錄下的所有文件和目錄名,可以通過一行代碼實現:
for循環其實可以同時使用兩個甚至多個變量,比如dict的items()可以同時迭代key和value:
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' } >>> for k, v in d.items(): ... print(k, '=', v) ... y = B x = A z = C因此,列表生成式也可以使用兩個變量來生成list:
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' } >>> [k + '=' + v for k, v in d.items()] ['y=B', 'x=A', 'z=C']最后把一個list中所有的字符串變成小寫:
>>> L = ['Hello', 'World', 'IBM', 'Apple'] >>> [s.lower() for s in L] ['hello', 'world', 'ibm', 'apple']if … else
使用列表生成式的時候,有些童鞋經常搞不清楚if…else的用法。
例如,以下代碼正常輸出偶數:
但是,我們不能在最后的if加上else:
>>> [x for x in range(1, 11) if x % 2 == 0 else 0]File "<stdin>", line 1[x for x in range(1, 11) if x % 2 == 0 else 0]^ SyntaxError: invalid synta這是因為跟在for后面的if是一個篩選條件,不能帶else,否則如何篩選?
另一些童鞋發現把if寫在for前面必須加else,否則報錯:
這是因為for前面的部分是一個表達式,它必須根據x計算出一個結果。因此,考察表達式:x if x % 2 == 0,它無法根據x計算出結果,因為缺少else,必須加上else:
>>> [x if x % 2 == 0 else -x for x in range(1, 11)] [-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]上述for前面的表達式x if x % 2 == 0 else -x才能根據x計算出確定的結果。
可見,在一個列表生成式中,for前面的if ... else是表達式,而for后面的if是過濾條件,不能帶else。
總結
以上是生活随笔為你收集整理的python基础7 (来自廖雪峰的官方网站)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用切片操作,实现一个trim()函数,
- 下一篇: python基础8(来自廖雪峰的官方网站