迭代器与生成器

1.两种创建方式generator

1.1 s = (x*x for x in range(10))

这种创建方式打印s为:

<generator object <genexpr> at 0x0000028B68B47888>

1.2 

def f():
print("ok")
yield 1
print("ok1") # next标识
yield 2
print("ok2")
return None
f()

这时候的s和f()都是一个可迭代对象iteration。

相对与列表生成器相当于找了一个厨师,但是菜并没有做好。列表是将所有的元素都存储在内存中。

1.2next方法

next(s)便可以调出s第一个的元素。

next(f())

next(f())

next(f()) # 打印3个OK 不报错 用一个变量接收
########################################
g = f()
next(g) # 打印ok ok1 ok2 并报错 ok2 之所以被打印看ga()
next(g)
next(g)

注意要用一个变量接收它。

def ga():
print("ok")
count = yield 1 # yield 相当于冻结了函数 下次的next会接着这里yield开始 debug下
print(count)
print("ok1")
yield 2
b = ga()
t = b.send(None) # 等于next(b) 但是不能直接send”gaga“ 会报错 没有值让你赋值
print(t)
b.send("gaga")
#jieguo: ok gaga ok1

2.迭代器iterator

# 生成器都是迭代器(iterator) 迭代器包含生成器
l = [1,2,3,4] # 可迭代对象
d = iter(l)
print(d) # <list_iterator object at 0x0000016C2AE36C18>
# 什么是迭代器 1.有iter 2.有next
print(next(d))
###########################################3
for i in [1,2,3,4]:
print(i)
# for 循环所做的事情
#1.调用iter方法返回一个迭代器对象
#2. 不断调用对象的next方法
#3. 处理异常StopIterator

from collections import Iterator,Iterable
print(isinstance(l,list))
print(isinstance(d,Iterator))

原文地址:https://www.cnblogs.com/khal-Cgg/p/5872634.html