# l = [1,2,3]
# 索引
# 循环 for
# list
# dic
# str
# set
# tuple
# f = open()
# range()
# enumerate
'''
print(dir([])) # 告诉我列表的所有方法
print(dir({})) # 告诉我字典的所有方法
print(dir('')) # 告诉我字符串的所有方法
# 求以上三个方法的交集
ret = set(dir([]))&set(dir({}))&set(dir(''))
print(ret)
# 双下方法
print([1].__add__(([2])))
print([1]+ [2])
# 判断是否可迭代
print('__iter__' in dir(int))
print('__iter__' in dir(bool))
print('__iter__' in dir(list))
print('__iter__' in dir(dict))
print('__iter__' in dir(str))
print('__iter__' in dir(set))
print('__iter__' in dir(tuple))
print('__iter__' in dir(enumerate([],1)))
'''
# 只要是能被for循环的数据类型就一定有__iter__方法
# print([].__iter__()) # 一个列表执行了__iter__()之后的返回值就是一个迭代器
# print(dir([]))
# print(set(dir([].__iter__()))-set(dir([]))) # {'__next__', '__length_hint__', '__setstate__'}
# print([1,2,'aa'].__iter__().__length_hint__()) # 元素个数
# l = [1,2,3]
# iterator = l.__iter__()
# print(iterator.__next__())
# print(iterator.__next__())
# print(iterator.__next__())
# 只要含有__iter__方法的都是可迭代的
# [].__iter__() 迭代器 --> __next__() # 通过next就可以从迭代器中一个一个的取值
# 只要含有__iter__方法的都是可迭代的 --> 可迭代协议
# 迭代器协议 --> 内部含有__next__和__iter__方法的就是迭代器
# print('__iter__' in dir([].__iter__()))
# print('__next__' in dir([].__iter__()))
# from collections import Iterable # iterable 可迭代的
# from collections import Iterator # iterator 迭代器
# print(isinstance([],Iterable)) # True 列表是可迭代的
# print(isinstance([],Iterator)) # False 列表不是迭代器
# 迭代器协议和可迭代协议
# 可以被for循环的都是可迭代的
# 可迭代的和迭代器都是什么样子的
# 可迭代的内部都有__iter__方法
# 迭代器一定是可迭代的,可迭代的不一定是迭代器
# 可迭代的.__iter__() 方法就可以得到一个迭代器
# 迭代器中的__next__()方法可以一个一个的获取值
# for 循环其实就是在使用迭代器
# iterator
# 可迭代对象
# 直接给你内存地址
# 判断是不是迭代器,其实是为了使用for循环
# 当我们遇到一个新的变量,不确定能不能for循环时,就判断它是否可迭代
# 迭代器的好处:
# 从容器类型中一个一个的取值,会把所有的值都取到
# 可以节省内存空间 --> range(1000000000)
# 迭代器并不会在内存中再占用一大块内存,而是随着循环,每次生成一个
# 每次next,就给我一个
# range
# f = open()
# l = [1,2,3,4,5]
# iterator = l.__iter__()
# while 1:
# print(iterator.__next__())
# 生成器
# 生成器函数 --> 本质上就是我们自己写的函数
# 生成器表达式
# 普通函数
# def generator():
# print(123)
# return 'a'
# ret = generator()
# print(ret)
#----------------------------------------------------------------------------------------#
# 生成器函数
# 只要含有yield关键字的函数都是生成器函数,yield只能在函数里,且yield不能与return同时出现
# def generator():
# print(123)
# yield 'a'
# # 生成器函数:执行之后会得到一个生成器作为返回值
# ret = generator()
# print(ret)
# print(ret.__next__())
# def generator():
# print(123)
# yield 'a'
# print(222)
# yield 'b'
# print(333)
# yield [7,8,9]
# ret = generator()
# for i in ret:
# print(i)
# print(ret)
# print(ret.__next__())
# print(ret.__next__())
# print(ret.__next__())
def wahaha():
for i in range(2000000):
yield '娃哈哈%s'%i
g = wahaha()
count = 0
for i in g:
count += 1
print(i)
if count > 50:
break
print('*',g.__next__())
print('**',g.__next__())
print('***',g.__next__())
print('***',g.__next__())