1、生成器
生成器只有在用的时候会出现在内存中,对比列表全部存在内存中,减少了内存占用
next()函数 依次取生成器的值
s = (x*2 for x in range(1000)) # 中括号是列表解析,小括号表示生成一系列值,就是生成器
# s: <generator object <genexpr> at 0x7fa20aa8b048>
print(next(s)) # 用next()函数取生成的值
print(next(s)) # 取出这个值后会记录这个位置,下次从后面依次取值
# 生成器就是一个可迭代的对象
yield方法 创建生成器对象
def foo():
# print('ok1') # 不使用next方法,函数内部不会执行
yield 1 # 使用next方法后,才会执行yield前面的代码并返回值,函数停在该位置
# print('ok2')
yield 2 #
for i in foo(): # for循环就是封装的迭代器取值方法
print(i)
p = foo()
next(p) # 取生成的值
print(next(p))
def fibo(m):
a,b,c=0,0,1
while a<m:
yield b # 把计算出来的菲博列次数存到生成器对象中
b,c=c,c+b
a+=1
f = fibo(8)
for i in f: # 依次迭代取出来
print(i)
send()函数 给yield前边的变量赋值
def foo():
print('ok1')
kk = yield 1 # 程序走到这里会返回该迭代器对象,并不会直接赋值
print(kk)
yield 2
n = foo()
n.send(None) # 首先传一个空值进去,让函数记住迭代器对象的位置
# next(n) # 也可以让next()函数走到第一个迭代器对象的位置,效果同上
n.send('eee') # 然后在这里传一个值给记住的代器对象位置前面的变量
2、迭代器
# list, tuple, dict, string : Iterable(可迭代对象)
l = [1,2,3,4,5]
d = iter(l) # iter()函数生成一个迭代器
print(d) # <list_iterator object at 0x7fe7572b28d0>
print(l.__iter__()) # 效果同上
# 满足两个条件: 1.有iter方法 2.有next方法 就是一个迭代器
from collections import Iterable,Iterator
print(isinstance(d, Iterator)) # 判断是否为迭代器 True