Python基础 生成器和迭代器

# 迭代器协议
# 对象必须提供一个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')

 

posted @ 2020-08-18 09:28  sansan506  阅读(62)  评论(0)    收藏  举报