__author__ = '12711'
#-*- coding:utf-8 -*-
'''
g=(i*2 for i in range(10))
print(g)
print(next(g))
next(g)
print( g.__next__())
# g.__next__()
# for i in g:
# print(i)
'''
'''
#1,1,2,3,5,8
def fib(s):
n,a,b=0,0,1
while n<s:
#print(b)
yield b
a,b=b,a+b
n+=1
return 'ha'
f=fib(6)
print(f)
# print(f.__next__())
# print(f.__next__())
# print("干点好事")
# print(f.__next__())
for i in fib(6):
print(i)
#这里,最难理解的就是generator和函数的执行流程不一样。
# 函数是顺序执行,遇到return语句或者最后一行函数语句就返回。
# 而变成generator的函数,
# 在每次调用next()的时候执行
# ,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
'''
'''
import time
def consumer(name):
print("%s 准备吃包子啦!" %name)
while True:
baozi = yield
print("包子[%s]来了,被[%s]吃了!" %(baozi,name))
def producer(name):
c = consumer(name)
#c2 = consumer(name)
c.__next__()
#c2.__next__()
print("老子开始准备做包子啦!")
for i in range(10):
time.sleep(1)
print("做了1个包子!")
c.send(1)
#c2.send(i)
producer("alex")
'''
'''
迭代器
我们已经知道,可以直接作用于for循环的数据类型有以下几种:
一类是集合数据类型,如list、tuple、dict、set、str等;
一类是generator,包括生成器和带yield的generator function。
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可以使用isinstance()判断一个对象是否是Iterable对象:
'''
from collections import Iterable
print(isinstance([],Iterable))
print(isinstance((i*2 for i in range(10)),Iterable))
#可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
#可以使用isinstance()判断一个对象是否是Iterator对象:
from collections import Iterator
print(isinstance((i*2 for i in range(10)),Iterator))
print(isinstance([],Iterator))
# 生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
#
# 把list、dict、str等Iterable变成Iterator可以使用iter()函数:
print(isinstance(iter([]),Iterator))