Python 迭代器和列表解析express
1)迭代器數據結構
一種特殊的數據結構,以對象形式存在 >>> i1 = l1.__iter__() >>> i1 = iter(l1) 可迭代對象: 序列: list、str、tuple 非序列: dict、file 自定義類: __iter__()、 __getitem__() 注意: 若要實現迭代器,須要在類中定義next()方法 要使迭代器指向下一個對象,則使用成員函數 next() i1.next() 當沒有元素時,會引起StopIteration異常 for循環可用於任何可迭代對象 例: >>> l1 = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'] >>> i1 = l1.__iter__() >>> il.next() 'Sun' >>> il.next() 'Mon'
2)列表解析 [ ]app
根據已有列表,高效生產新列表的方式。 經常使用於實現建立新的列表,所以要放置於 [ ] 中 語法: [ expression for iter_var in iterable ] [ expression for iter_var in iterable if cond_expr ] os模塊中 listdir() 可以列出全部文件 例:事先定義l1 l2 l1 = [ 1,2,3,4,5 ] l2=[ ] >>> for i in l1: l2.append(i**2) l2列表內各項爲l1的平方 >>> print l2 [1, 4, 9, 16, 25] >>> l3 = [ i**2 for i in l1 ] l3列表內各項爲l1的平方 [1, 4, 9, 16, 25] >>> l4 = [ i**2 for i in l1 if i>=3 ] l3列表內各項爲l1中 >= 3的平方 [9, 16, 25] 例題: l1 = ['x','y','z'] l2 = [1,2,3] 應用列表解析方法使其各項相乘 >>> l3 = [ (i,j) for i in l1 for j in l2 ] for循環內部嵌套一個for循環實現各項乘 [('x', 1), ('x', 2), ('x', 3), ('y', 1), ('y', 2), ('y', 3), ('z', 1), ('z', 2), ('z', 3)]
3)生成器 ( )函數
惰性計算、延遲求值 生成器表達式並不真正建立數字列表,而是返回一個生成器對象,此對象在每次計算出一個條目後,把這個條目產生出來(一次返回一個值) 語法: ( expr for iter_var in iterable ) ( expr for iter_var in iterable if cond_expr ) 例: >>> l1 = ( i**2 for i in range(2,11,2)) >>> l1.next() 2 >>> l1 = ( i**2 for i in range(2,11) if i%2==0 ) >>> l1.next() 2 注意: 序列過長,而且每次只獲取一個元素時,應當考慮使用生成器表達式而不是列表解析 列表解析與生成器的關係至關於range()與xrange()
4)產生偏移和元素code
enumerate 同時偏移縮印和偏移元素,使用enumerate()函數 此內置函數返回一個生成器對象 >>> S = 'Hello,world' >>> a = enumerate(S) >>> a.next() (0,'H') >>> a.next() (1,'e')