python 生成器和迭代器
生成器
1.将li中的元素都乘以2
>>> li = [1,2,3,5,5,6,7,8,9,9,8,3]>>> li = [a*2 for a in li]
>>> print(li)
[2, 4, 6, 10, 10, 12, 14, 16, 18, 18, 16, 6]
生成器表达式形式:
一个一个取生成器的值>>> li = [1,2,3,5,5,6,7,8,9,9,8,3]
>>> li = (a*2 for a in li)
>>> print(li)
<generator object <genexpr> at 0x10565af10>#变成了一个生成器
>>> next(li)
2
>>> next(li)
4
>>> next(li)
6
>>> next(li)
10
for循环取生成器值,取完不会报错
一个一个取生成器的值
>>> li = [1,2,3,5,5,6,7,8,9,9,8,3]
>>> li = (a*2 for a in li)
>>> print(li)
<generator object <genexpr> at 0x10565af10>#变成了一个生成器
>>> for i in li:
... print(i)
...
2
4
6
10
10
12
14
16
18
18
16
6
while循环取生成器,取完了会报错
>>> li = [1,2,3,5,5,6,7,8,9,9,8,3]
>>> li = (a*2 for a in li)
>>> while True:
... print(next(li))
...
2
4
6
10
10
12
14
16
18
18
16
6
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
StopIteration
生成器函数形式:
def func(n):count = 0
while count < n:
print('count',count)
count += 1
sign = yield count
if sign == "stop":
break
new_func = func(4) #第一个执行方法时,是把函数变成了生成器
print(new_func)
next(new_func)#第二次执行时,执行了一次函数,然后停在yield,并返回了count
输出结果:
<generator object func at 0x1009fce60>
count 0
def func(n):count = 0
while count < n:
print('count',count)
count += 1
sign = yield count
if sign == "stop":
break
new_func = func(4) #第一个执行方法时,是把函数变成了生成器
print(new_func)
next(new_func)#第二次执行时,执行了一次函数,然后停在yield,并返回了count
#new_func.send("stop")
#唤醒并执行yield,发送一个信息到生成器内部
迭代器
可迭代对象:可以直接for循环
1.集合数据类型:列表,字典,字符串等
2.生成器和带yield的generator方法
判断对象是否可迭代:isinstance
>>> from collections import Iterable>>> isinstance("abc",Iterable)
True
>>> isinstance([1,2,3],Iterable)
True
>>> isinstance(123,Iterable)
False
迭代器:可以被next()函数调用并不断返回下一个值的对象。
iter(a) iter方法可以将变量变为迭代器
>>> from collections import Iterator>>> b = (a for a in range(10))
>>> isinstance(b,Iterator)
True
>>> a = "123"
>>> isinstance(a,Iterator)
False
>>> a = iter(a)
>>> isinstance(a,Iterator)
True
>>>
以上是 python 生成器和迭代器 的全部内容, 来源链接: utcz.com/z/388449.html