#迭代器 主要有iter() 和next()两种方法 可以用与字符串,列表,元祖(有序对象)
'''
list1=[12,23,345,12,34]
it=iter(list1)#将列表变成迭代器对象
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it)) #迭代器对象元素取完后,提示stopIteration
'''
#用for遍历我们的迭代器 ,跟我们的列表最大的区别是在:列表是一个容器,打印出来等于打印全部的元素;迭代器,依次取出我们的元素,
#用多少取多少
'''
list1=[12,23,345,12,34]
it=iter(list1)#将列表变成迭代器对象
for i in it: #可以遍历列表,字符串,元祖,字典.items(),迭代器对象
print(i)
'''
#生成器
#生成器是迭代器的一种,返回迭代器的函数,迭代器函数有iter()函数的功能,两者取值都是需要我们的next()函数,
#生成器也是可以用于for循环
#斐波那契数列(Fibonacci sequence),指的是这样一个数列:1、1、2、3、5、8、13、21、34、……,
# 斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2)
'''
def fib(n):
a,b,count=0,1,2
if n<count:
return #return 后面不加任何返回值,返回None
while True:
if count<=n:
count+=1
a,b=b,a+b
yield b
print('好棒!')
#fib(n)就是生成器
# it=fib(5)
# print(next(it))
# print(next(it))
#使用for循环取值
for i in fib(6):
print(i)
'''
#yield与return的区别,yield只返回一次,有记忆效果,下一次打印的话直接先从yield后面执行;return呢,不管返回多少次,都是从头开始
'''
def fib(n):
a,b,count=0,1,2
if n<count:
return #return 后面不加任何返回值,返回None
while True:
if count<=n:
count+=1
a,b=b,a+b
return b
print('好棒!')
print(fib(5))
print(fib(5))
'''
'''
def fib(n):
a,b,count=0,1,2
flag=True
if n<count:
print(None) #return 后面不加任何返回值,返回None
while flag:
if count<=n:
count+=1
a,b=b,a+b
# return b
print('%d %d %d'%(a,b,a+b))
if count==n:
break
# print('好棒!')
print(fib(5))
'''
#send()函数
def f():
print('start')
a = yield 1 #执行到yield会暂停,先执行我们的yield ,再进行赋值a=None
print(a)
print('middle....')
b = yield 2 # 2这个值只是迭代值,调用next时候返回的值
print(b)
print('next')
c = yield 3
print(c)
a=f() #这是一个生成器函数,直接调用不会打印
# print(next(a))
# print(next(a))
# print(next(a))
# print(next(a))
#send()使用之前必须使用next(),send()作用在于,把值传递给我们当前的yield(也有next迭代的作用)
# print(next(a))
# print(a.send('msg'))
# print(a.send('msg1'))
# print(next(a))