文档章节

python笔记(六)迭送器和生成器

o
 osc_1ee7cxmx
发布于 2018/08/06 15:48
字数 826
阅读 4
收藏 0

精选30+云产品,助力企业轻松上云!>>>

一、迭送器

1.1可迭代协议(iteradle)

可迭代协议可以被迭代要满足的要求就叫做可迭代协议

可迭代协议的定义:内部实现了__iter__方法可以实现_iter_的内置方法的都是可迭代对象

可以被for循环的对象都是可迭代的对象

迭代是一个重复的过程每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值

1.2迭代器(iterator)

迭代器遵循迭代器协议:必须拥有__iter__方法和__next__方法

优点:   - 提供一种统一的、不依赖于索引的迭代方式   - 惰性计算,节省内存

缺点:   - 无法获取长度(只有在next完毕才知道到底有几个值)   - 一次性的,只能往后走,不能往前退,执行到最后一个元素后,会报错

 

二、生成器(Generator)

生成器定义

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

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

3.本质:生成器的本质为迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)   

4.特点:惰性运算,开发者自定义

生成器的优点

1.延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量处理,将会非常有用

2.提高代码可读性

生成器表达式

1 g=('%s' %i for i in range(10))
2 for i in g:
3     print(i)

yield from

 1 def gen1():
 2     for c in 'AB':
 3         yield c
 4     for i in range(3):
 5         yield i
 6 
 7 print(list(gen1()))
 8 
 9 def gen2():
10     yield from 'AB'
11     yield from range(3)
12 
13 print(list(gen2()))
14 # 两个函数执行的结果是一样的

send

 1 def generator():
 2     print(123)
 3     content = yield 1
 4     print('=======',content)
 5     print(456)
 6     yield 2
 7 
 8 g = generator()
 9 ret = g.__next__()
10 print('***',ret)
11 ret = g.send('hello')   #send的效果和next一样
12 print('***',ret)
13 
14 #send 获取下一个值的效果和next基本一致
15 #只是在获取下一个值的时候,给上一yield的位置传递一个数据
16 #使用send的注意事项
17     # 第一次使用生成器的时候 是用next获取下一个值
18     # 最后一个yield不能接受外部的值

 

三、推导式

1 #列表推导式
2 g=[i for i in range(10)]
3 print(g)
4 #与生成器表达式的区别为:生成器用(),列表用[]

遍历之后挨个处理:[每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型]
筛选功能:[满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件]

例子:所有能被3整除的数

1 ret = [i for i in range(30) if i%3 == 0]  #完整的列表推导式
2 print(ret)

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

如果你失明了,你怎么编程? - How can you program if you're blind?

问题: Sight is one of the senses most programmers take for granted. 视觉是大多数程序员认为理所当然的感官之一。 Most programmers would spend hours looking at a computer monitor......

技术盛宴
21分钟前
10
0
如何删除使用Python的easy_install安装的软件包? - How do I remove packages installed with Python's easy_install?

问题: Python's easy_install makes installing new packages extremely convenient. Python的easy_install使安装新包非常方便。 However, as far as I can tell, it doesn't implement th......

fyin1314
51分钟前
8
0
如何将逗号分隔的字符串转换为数组? - How to convert a comma separated string to an array?

问题: I have a comma separated string that I want to convert into an array, so I can loop through it. 我有一个逗号分隔的字符串,我想将其转换成数组,因此可以循环遍历它。 Is the...

富含淀粉
今天
13
0
深源恒际:担心个人身份被冒用?不存在!

本文作者:c****t 近日,苟晶被冒名顶替身份参加高考的事件在社会各界掀起广泛热议。事件调查结果公布后,舆论风向逆转,吃瓜群众认为当事人夸大其词消费了公众情绪,一边对当事人所遭遇的不...

百度开发者中心
昨天
5
0
CKEditor 5 + SpringBoot实战(三):SpringData JPA数据持久化

在本系列的文章中,我将介绍如何在Spring Boot Application中使用CKEditor编辑器。介绍的内容包括基本环境的搭建,文件上传,SpringData JPA数据持久化,CKEditor5的安装,CKEditor图片上传,...

树下魅狐
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部