又看一下廖雪峰老师的网站学习一下,做一下笔记,假装我学过(搬砖)。。。
生成器(generator)
Generation就是不需要按照列表的形式将每个元素写到列表中,在实际中并不是所有的列表元素都可以枚举的 下面看一下怎么
要创建generator方法有很多,第一种办法比较简单,只需要把列表中的[]改为()就可以了
>>> l = [x**2 for x in range(0,10,2)]
>>> l
[0, 4, 16, 36, 64]
>>> g = (x**2 for x in range(0,10,2))
>>> g
<generator object <genexpr> at 0x000001A6E28F72B0>
list元素可以直接打印出来,生成器的打印可以使用next()获取生成器下一个返回值
>>> next(g)
0
>>> next(g)
4
>>> next(g)
16
>>> next(g)
36
>>> next(g)
64
>>> next(g)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
到最后生成器元素获取完毕之后会抛出一个StoryIteration的错误
但是实际上获取生成器的元素我们几乎不会使用next()方法而是使用for循环
>>> g = (x**2 for x in range(0,10,2))
>>> for i in g:
... print(i)
...
0
4
16
36
64
>>>
但是用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中
>>> g = (x**2 for x in range(0,10,2))
>>> while True:
... try:
... x = next(g)
... print("g : ",x)
... except StopIteration as e:
... print("Generator return value: ",e.value)
... break
...
g : 0
g : 4
g : 16
g : 36
g : 64
Generator return value: None
>>>
迭代器(iterator)
① 可以使用isinstance()判断一个对象是否是Iterable对象
>>> from collections import Iterable
>>> isinstance([],Iterable)
True
>>> isinstance((),Iterable)
True
>>> isinstance({},Iterable)
True
>>> isinstance("",Iterable)
True
>>> isinstance(100,Iterable)
False
② 可以使用isinstance()判断一个对象是否是Iterator对象:可以使用isinstance()判断一个对象是否是Iterator对象
>>> isinstance(100,Iterable)
False
>>> from collections import Iterator
>>> isinstance([],Iterator)
False
>>> isinstance((),Iterator)
False
>>> isinstance({},Iterator)
False
>>> isinstance("",Iterator)
False
凡是可作用于for循环的对象都是Iterable类型
凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列
集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象
reversed(seq)函数
这个函数的作用是返回一个反转的迭代器,seq可以是 tuple, string, list 或 range
>>> a = "CSDN"
>>> b = reversed(a)
>>> b
<reversed object at 0x000001A6E28DBB38>
>>> for i in b:
... print(i)
...
N
D
S
C
>>
>>> input_size = (312,416)
>>> size = list(reversed(input_size))
>>> size
[416, 312]
>>> size = tuple(reversed(input_size))
>>> size
(416, 312)
>>
the end.