生成器generator
本着节约的原则,在使用列表元素时,按照某种算法,不断的推演出后续的算法,不必创建完整的列表浪费空间。
- 方法一:类似于列表生成式,只是把[ ]变为(),利用for循环可以输出该生成器的后续元素
g = (x * x for x in range(10))
for x in g:
print(x)
- 方法二:如果一个函数包含yield关键字,则它是一个generator.在每次调用next()方法时,遇到yield时语句返回,再次执行时从上次的field语句处继续执行。
def gen():
print('first step')
yield 1
print('second step')
yield (2)
print('third step')
yield (3)
g=gen();
next(g)
#输出为 first step
for n in gen():
print(n)
#输出结果:
# first step
# 1
# second step
# 2
# third step
# 3
-
练习:打印出杨辉三角
def triangles():
l=[1]
while True:
yield l;
l=[l[x]+l[x+1]for x in range(len(l)-1)];
l.insert(0,1);
l.append(1)
n=0
for t in triangles():
print(t)
n=n+1
if n==10:
break
迭代器
前几天学过使用 isinstance()判断一个对象是否是 Iterable 对象
今天再学习使用 isinstance()判断一个对象是否是 Iterator 对象
生成器都是 Iterator 对象,但 list、dict、str 虽然是 Iterable,却不是Iterator。
from collections import Iterator
print(isinstance((x for x in range(10)), Iterator))#输出为True
print(isinstance('123',Iterator))#输出为False
可以使用 iter()函数 把 list、dict、str 等 Iterable 变成 Iterator
from collections import Iterator
print(isinstance(iter([]), Iterator))#输出为True
print(isinstance(iter('abc'), Iterator) )#输出为True
网友评论