#迭代器 主要有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,2if n<count:return #return 后面不加任何返回值,返回Nonewhile True:if count<=n:count+=1a,b=b,a+byield bprint('好棒!')
#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,2if n<count:return #return 后面不加任何返回值,返回Nonewhile True:if count<=n:count+=1a,b=b,a+breturn bprint('好棒!')
print(fib(5))
print(fib(5))
''''''
def fib(n):a,b,count=0,1,2flag=Trueif n<count:print(None) #return 后面不加任何返回值,返回Nonewhile flag:if count<=n:count+=1a,b=b,a+b# return bprint('%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=Noneprint(a)print('middle....')b = yield 2 # 2这个值只是迭代值,调用next时候返回的值print(b)print('next')c = yield 3print(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))