python 7

迭代:重复做一件事

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]: 

------------------------------------------------------------






你可能感兴趣的:(for)