1 # 什么是迭代器协议 2 # 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stoplteration异常, 3 # 以终止迭代(只能往后走,不能往前退) 4 # 2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法) 5 # 3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象 6 # 7 8 9 # 什么是生成器? 10 # 可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己的内置的__iter__方法),所以生成器就是可迭代对象 11 # 12 # 生成器分类及在Python中的变现形式:(Python有两种不同的方式提供生成器) 13 # 1. 14 # 生成器函数:常规函数的定义,但是,使用yield语句而不是return语句返回结果。yield语句语句一次返回一个结果, 15 # 在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行。 16 # .生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表 17 18 ##迭代器 19 # l = ['wo','erzi','sunzi','chongsunzi'] 20 # iter_l = l.__iter__() 21 # print(iter_l.__next__()) 22 # print(iter_l.__next__()) 23 # print(iter_l.__next__()) 24 # print(iter_l.__next__()) 25 # print(iter_l.__next__()) #StopIteration 26 27 28 ####生成器初探 自动实现迭代协议 29 30 # 函数形式 31 32 # def text(): 33 # yield 1 34 # yield 2 35 # yield 3 36 37 # g = text() 38 # print(g) 39 # g.__next__() 40 41 # print(g.__next__()) 42 # print(g.__next__()) 43 # print(g.__next__())
三元表达式 列表解析
## 三元表达式 # name = 'yuanha' # res = 'sb' if name == 'yuanhao' else 'zhizhang' # print(res) ###列表解析 # egg_list = [] # for i in range(12): # egg_list.append('鸡蛋%s' %i) # print(egg_list) # # l = [i for i in range(18) ] # print(l) # # l = ['鸡蛋%s' %i for i in range(18) ] # print(l) # # l = ['鸡蛋%s' %i for i in range(18) if i > 6 ] ##三元表达式 # print(l) # yuanhaoziadan = ('儿子%s' %i for i in range(10) ) #生成器表达式 更节省内存 # print(yuanhaoziadan.__next__()) # print(yuanhaoziadan.__next__()) # print(sum((i ** 2 for i in range(2))))
生成函数
1 ###生成器函数 2 3 # import time 4 # def text(): 5 # yield 1 6 # yield 2 7 # res = text() 8 # print(res.__next__()) 9 # print(res.__next__()) 10 11 # def baozi(): 12 # res = [] 13 # for i in range(10): 14 # res.append('包子%s' %i) 15 # return res 16 # baozi_list = baozi() 17 # print(baozi_list) 18 19 # def baozi(): 20 # for i in range(10): 21 # print('做包子') 22 # yield '包子真好吃%s' %i 23 # print('卖包子') 24 # a = baozi() 25 # b = a.__next__() 26 # ##加代码 27 # b = a.__next__() 28 29 30 # baozi = ('包子%s' %i for i in range(7) ) 31 # print(baozi.__next__()) 32 33 # def xiadan(): 34 # for i in range(1000): 35 # yield '鸡蛋%s' %i 36 # 37 # alex = xiadan() 38 # 39 # jidan = alex.__next__() 40 # jidan = alex.__next__() 41 # jidan = alex.__next__() 42 # jidan = alex.__next__() 43 # jidan = alex.__next__() 44 # jidan = alex.__next__() 45 # 46 # 47 # print(jidan) 48 49 # 生成器不会把结果保存在一个系列中,而是保存在生成器的状态,在每次进行迭代时返回一个值,直到遇到StopIteration异常结束 50 # 生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间, 51 # 而上次调用的所有局部变量都保持不变。 52 # 生成器不仅“记住”了它数据状态;生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。