迭代:重复做一件事
iterable(可迭代对象)
支持每次返回自己的一个成员对象。
对象实现了__iter__方法。
list str tuple
dict file
自定包含__iter__()或__getitem__()方法的类。
__iter__() 迭代器:
用法:
In [43]: l1=[1,2,3,4,5,6,7,8]
In [44]: i1=l1.__iter__()
In [45]: i1.next()
Out[45]: 1
In [46]: i1.next()
Out[46]: 2
In [47]: i1.next()
Out[47]: 3
In [48]:
--------------------------------------------------------------
取迭代器的两种方法:
1.list.__iter__()
2.iter()
如下:
In [68]: print l2
['Sun', 'Mon', 'Tue', 'Web', 'Tue', 'Fri', 'Sat']
In [69]: l3=l2.__iter__()
In [70]: l3.next()
Out[70]: 'Sun'
In [71]:
In [71]:
In [71]: l3.next()
Out[71]: 'Mon'
In [72]: l3.next()
Out[72]: 'Tue'
In [73]: l3.next()
Out[73]: 'Web'
In [74]: l3.next()
Out[74]: 'Tue'
In [75]: l3.next()
Out[75]: 'Fri'
In [76]: l3.next()
Out[76]: 'Sat'
In [77]: l3.next()
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-77-a08afb3dc999> in <module>()
----> 1 l3.next()
StopIteration:
In [78]: print l2
['Sun', 'Mon', 'Tue', 'Web', 'Tue', 'Fri', 'Sat']
In [79]: l4=iter(l2)
In [80]: l4.next
Out[80]: <method-wrapper 'next' of listiterator object at 0x2bfa490>
In [81]: l4.next()
Out[81]: 'Sun'
In [82]: l4.next()
Out[82]: 'Mon'
In [83]:
-----------------------------------------------------------
python 列表解析:
列表解析是用于基于一个列表创建新列表。
是列表,要放入[]中。
语法:
[expression for iter_var in iterable]
[expression for iter_var in iterable if cond_expr]
例如:
In [88]: l1=[1,2,3,4,5]
In [89]: l2=[]
In [90]: for i in l1: 用普通for 来做。
....: l2.append(i**2)
....:
In [91]: print l2
[1, 4, 9, 16, 25]
In [92]: [i**2 for i in l1] 直接用列表解析来做。
Out[92]: [1, 4, 9, 16, 25]
In [93]:
----------------------------------
计算1到10所有数的平方再除以2
In [101]: [i**2 / 2 for i in range(1,11)]
Out[101]: [0, 2, 4, 8, 12, 18, 24, 32, 40, 50]
这样及可。
计算1到10所有偶数平方再除以2
In [102]: [i**2 / 2 for i in range(1,11) if i % 2==0]
Out[102]: [2, 8, 18, 32, 50]
-------------------------------------------------
查看/var/log下面所有以".log"结尾的文件名:
In [120]: import os
In [121]: [i for i in os.listdir('/var/log') if i.endswith('.log')]
Out[121]: ['Xorg.9.log', 'yum.log', 'boot.log', 'Xorg.0.log', 'pm-powersave.log']
In [122]:
这里用到两个关键字:os模块里的os.listdir() 还有是str.endswith()
及可实现。
____________________________________________________________
python 解析器会创建很多的元素对象。直接占用大量内存。
所以我们在用的时候,把[python 解析器]换成(python 生成器)
python中的解析器与生成器的关系就像是
python中range与xrange之间的关系。
例子:
In [134]: [i**2 for i in range(1,11)]
Out[134]: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
In [135]: [i**2 for i in xrange(1,11)]
Out[135]: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
In [136]: (i**2 for i in range(1,11))
Out[136]: <generator object <genexpr> at 0x2bf3af0>
In [137]: l1=(i**2 for i in range(1,11))
In [138]: print l1
<generator object <genexpr> at 0x2bf3cd0>
In [139]: l1.next
Out[139]: <method-wrapper 'next' of generator object at 0x2bf3cd0>
In [140]: l1.next()
Out[140]: 1
In [141]: l1.next()
Out[141]: 4
In [142]: l1.next()
Out[142]: 9
In [143]: l1.next()
Out[143]: 16
In [144]: l1=(i**2 for i in xrange(1,11))
In [145]: l1.next()
Out[145]: 1
In [146]: l1.next()
Out[146]: 4
In [147]:
生成器也可以被for来迭代。
____________________________________________________
产生偏移和元素。
enumerate enumerate
enumerate() 内置函数返回一个生成器对象。
range 可以在非完备遍历中用于生成索引偏移
如:range(1,100,2)这种。
如果我们即想要索引,又想要元素。我们就可以用 enumerate
In [160]: url='www.baidu.com'
In [161]: t=enumerate(url)
In [162]: t.next()
Out[162]: (0, 'w')
In [163]: t.next()
Out[163]: (1, 'w')
In [164]: t.next()
Out[164]: (2, 'w')
In [165]:
|_____________
In [165]: print l2
['x', 'y', 'z']
In [166]: l3=enumerate(l2)
In [167]: l3.next()
Out[167]: (0, 'x')
In [168]: l3.next()
Out[168]: (1, 'y')
In [169]: l3.next()
Out[169]: (2, 'z')
In [170]: l3.next()
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-170-a08afb3dc999> in <module>()
----> 1 l3.next()
StopIteration:
In [171]:
____________________
In [176]: print l2
['x', 'y', 'z']
In [177]: l4=[]
In [178]: l4.append([i for i in enumerate(l2)])
In [179]: print l4
[[(0, 'x'), (1, 'y'), (2, 'z')]]
In [180]:
------------------------------------------------------------