我是靠谱客的博主 强健墨镜,这篇文章主要介绍python教程:迭代器,生成器与for循环机制,现在分享给大家,希望可以做个参考。

一:什么是迭代器协议

  1. 迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代器中的下一项,要么就引起一个stoplteration异常,以终止协议(只能往后走不能往前)

  2. 可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个_iter_()方法)

  3. 协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min函数等)使用迭代器协议访问对象。

二:for循环机制

for循环机制的本质:循环所有对象,全部都是使用迭代器协议。

三:什么是生成器

1. 生成器,可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己内置的_iter_方法),所以生成器就是可迭代对象。

2. 生成器分类:在python中有两种表现形式(python有两种不同的方式提供生成器)

【1】生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果,yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便于下次从它离开的地方继续执行。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
def test(): yield 1 yield 2 yield 3 res=test() print(res) print(res.__next__()) print(res.__next__()) #结果:<generator object test at 0x0000023E254BD8E0> # 1 # 2

【2】生成器表达式:类似于列表推导,但是生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
laomuji=('鸡蛋%d' %i for i in range(10)) print(laomuji) print(laomuji.__next__()) print(laomuji.__next__()) print(laomuji.__next__()) print(next(laomuji)) print(next(laomuji)) #结果:<generator object <genexpr> at 0x0000015F1262D8E0> # 鸡蛋0 # 鸡蛋1 # 鸡蛋2 # 鸡蛋3 # 鸡蛋4

3.列表解析:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
''' 遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! ''' egg_list=[] for i in range(10): egg_list.append('鸡蛋%d' %i) print(egg_list) #结果:['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9'] 列表解析: l=['鸡蛋%d' %i for i in range(10)] print(l) #结果:['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9'] #列表解析将即将生成的列表结果放前面,for循环放在后面 三元表达式:(三个操作,for循环前面是一个,for循环是一个,if条件这是一个) l1=['鸡蛋%d' %i for i in range(10) if i>5 ] print(l1) #结果:['鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9'] #没有四元表达式

总结:

1.把列表解析的[]换成()得到的就是生成器表达式

2.列表解析与生成器表达式都是一种便利的变成方式,只不过生成器表达式更加节省内存

3.Python不但使用迭代器协议让for循环更加通用。大部分内置函数也是使用迭代器协议访问对象的。例如,sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,我们可以直接计算一系列值得和:

复制代码
1
2
sum(x**2 for x in range(4))

而不用多此一举的先构造一个列表:

复制代码
1
2
sum([x**2 for x in range(4)])

最后

以上就是强健墨镜最近收集整理的关于python教程:迭代器,生成器与for循环机制的全部内容,更多相关python教程:迭代器内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部