生成器
auth == authentication 认证优质内容筛选与推荐>>
finance 金融
generator 生成器
StopIteration 迭代结束
iterable 迭代
生成器原理:不会存储在任何地方,随用随取
1.列表生成式:
(1)
a=[x*2 for x in range(10)]
b=[x*x for x in range(10)]
print(a)
print(b)
(2)函数列表:
def f(n):
return n**3
a=[f(x) for x in range(10)]
print(a)
print(type(a))
2.元组:
(1)
t=('sad',25)#元组
a,b=t
#相当于
# a=t[0]
# b=t[1]
print(a)
print(b)
(2)
a=(x*2 for x in range(5))
print(a)
print(next(a))#等价于a.__next__() in Python2.0: a.next()
print(next(a))
print(next(a))
print(next(a))
print(next(a))#取完
#print(next(a))#报错StopIteration 迭代结束
#生成器就是一个可迭代对象
3.生成器一共两种创建方式:
(1)(x*2 for x in range(5))
(2) yield
例1:
def foo():
print('ok')
yield 1
print('ok2')
yield 2
return None
# foo()
# print(foo())#<generator object foo at 0x000001D5C423E5E8>生成器对象
# next(foo())
# next(foo())#不会和下面结果一样,foo()从头开始
#或
g=foo()
print(g)
next(g)
next(g)#会记住上一次的yield1,然后继续yield1下继续执行yield2
例2:
def foo():
print('ok')
yield 1
print('ok2')
yield 2
return None
g=foo()
print(g)
a=next(g)
b=next(g)
print(a,b)
4. for i in 可迭代对象
什么是可迭代对象:内部有iter方法的都是可迭代对象
#列表
l=[1,2,3]
l.__iter__()
#元组
t=(1,2,3)
l.__iter__()
#字典
d={'name':'123'}
l.__iter__()
5.生成器:通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的
列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以再循环的过程中不断推算出后续的元素呢?这样就不必
创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
6.斐波那契序列
def fbn(max):
n,before,after=0,0,1
while n<max :
# print(after)
yield (after)
before,after=after,before+after
# tmp = before
# before = after
# after = tmp + after
n=n+1
g=fbn(4)
print(g)
print(next(g))
print(next(g))
print(next(g))
print(next(g))#next最多4个
7.send原理及用法
def bar():
print('ok1')
count=yield 1
print(count)
# print('ok2')
yield 2
b=bar()
b.send(None)#相当于next(b) 第一次send前如果没有next,只能传一个send(None)
ret=b.send('eric')#与next()一样,不过send()可以传值
print(ret)