# 迭代器协议
# 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终结迭代(只能往下走不能往前退)
# 可迭代对象:实现了迭代器协议的对象 对象内部定义一个__iter__
# 协议是一种约定,可迭代对象实现了迭代器协议,Python的内部工具 如 for sum min max 函数等使用迭代器协议访问对象
# __iter__遵循迭代器协议,生成可迭代对象
# a='hello'
# b=a.__iter__()
# print(b.__next__())
# print(b.__next__())
# print(b.__next__())
# print(b.__next__())
# print(b.__next__())
# print(b.__next__())
###################################################生成器#################################################
# 生成器 自动实现了迭代器协议 生成器 就是可迭代对象 只能遍历一次
# 两种形式 一是函数 二是生成器表达式
# 一是函数 函数运行三种方式 next(函数) 函数.__next__ 函数.send
# 使用yield而不是return,但yield可以有多个
# 函数可以保存状态,用一次值取一次
# def a():
# yield 1,2
# yield 1, 3
#
# test = a()
# print(test.__next__())
# print(test.__next__())
# def test():
# for i in range(10):
# print('这是%s个' % i)
# yield ('第%s次暂停' % i)
# print('结束')
#
#
# a = test()
# print(a.__next__())
# print(a.__next__())
# 二是生成器表达式
# 三元表达式 只有三元 可以有两元
# name ='ale3x'
# res = '你好' if name=='alex' else '滚'
# print(res)
# 列表解析
# egg_list =[]
# for i in range(10):
# egg_list.append('鸡蛋%d' %i)
# print(egg_list)
# #等同
# l1 = ['鸡蛋%d' %i for i in range(10)]
# l2 = ['鸡蛋%d' %i for i in range(10) if i<5] #取I小于5
# print(l1)
# print(l2)
############################################################################################
# l1 = ('鸡蛋%d' %i for i in range(10)) #生成器表达式,相对列表解析更节省内存
# print(l1)
# print(l1.__next__())
# print(l1.__next__())
# def foo():
# with open('ssd','r',encoding='utf-8') as f:
# for i in f:
# yield i
# # print(i,end='')
# # a=eval(i)
# # print(type(i))
# # print(type(a))
# g=foo()
# b = eval(g.__next__())
# a = sum(eval(i)['一'] for i in g)
# print(a)
# h=foo()
# for i in h:
# b=eval(i)
# print('百分百%.2f %%' %(b['一']/a))
# def test():
# print('ddd')
# fist=yield 1
# print(2,fist)
# yield 2
#
# g = test()
# g.__next__()
# g.send('q')