# 迭代器的概念(优点:可遍历容器里的元素,省内存空间,随着循环生成)
# 迭代器协议 —— 内部含有__next__和__iter__方法的就是迭代器
# 只要含有__iter__方法的都是可迭代的 —— 可迭代协议
# 可迭代的.__iter__()方法就可以得到一个迭代器
# 迭代器中的__next__()方法可以一个一个的获取值
# from collections import Iterable
# from collections import Iterator
# print(isinstance([], Iterator))
# print(isinstance([].__iter__(), Iterator))
# print(isinstance([], Iterable))
#
#
# print('__iter__' in dir([].__iter__()))
# print('__iter__' in dir(123)) # False, int不可迭代
#
# # 只要含有__iter__方法的都是可迭代的 —— 可迭代协议
# l = [1,2,3,4]
# iterator = l.__iter__()
# print(iterator)
# print(iterator.__next__())
# print(iterator.__next__())
# for其实就在使用迭代器
#
# for i in range(10): # 等同于iter = range(10).__iter__()
# print(i) # 循环执行print(iter.__next__())
# ----------------------------------------------------------------------------------------------------------------------------------------------
# #生成器就是一个迭代器,用yield,不能和return公用
# def generator():
# print(1)
# yield 'a'
# yield 'b'
# yield 'c'
#
# g = generator() # 得到一个生成器作为返回值,实际上是迭代器
# print(g)
# print(g.__next__())
# 在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
# def feibo(max):
# n, a, b = 0, 0, 1
# while n < max:
# yield b
# a, b = b, a + b
# n += 1
#
# l = [x for x in feibo(20)]
# print(l)
def generators():
print(12345)
content = yield 'qwert'
print('!!!!!!!!',content)
yield 'ppppp'
g = generators()
g1 = g.__next__()
print(g1)
g1 = g.send('hello')
print(g1)