迭代器协议和生成器

 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 # 生成器不仅“记住”了它数据状态;生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。

猜你喜欢

转载自www.cnblogs.com/luoluokang/p/12536409.html