python基础9 (迭代器、生成器)
1、可迭代对象
迭代:将某个数据集内的数据“一个挨着一个的取出来”
可迭代协议:可以被迭代要满足的要求,即内部含有__iter__()方法
可迭代的类型:字符串、列表、元组、字典、集合
特点:惰性运算 #我们可以用dir()来查看是否还有__iter__()方法
have_iter = '__iter__' in dir([1,2])
#如果有,则have_iter = True
2、迭代器、__next__()
当我们调用可迭代对象的__iter__方法的时候,会返回一个例如list_iterator的类型,就是一个迭代器 迭代器协议:必须拥有__iter__方法和__next__方法 l = [1,2,3,4]
l_iter = l.__iter()__ #获得了迭代器
ret1 = l_iter.__next__() #获得第一个元素
ret2 = l_iter.__next__() #获得第二个元素 for循环就是这样进行迭代的
3、生成器、yield
Python中提供的生成器:
1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。 2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表 #yield
yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行。通过调用__next__()和send()可以使生成器继续执行到下一个yield,不同的是send会传一个值给上一个yield
4、生成器函数
#例子:生成500万个hsr
def generate_hsr():
for i in range(5000000):
yield 'hsr' g = generate_hsr()
for i in g:
print(i)
5、send
#send获取下一个值,传值给上一个yield
#第一次使用生成器用next
最后一个yield不能接受传值
def generator():
print(123)
content = yield 1
print(content)
yield 2 g = generator()
ret1 = g.__next__() #ret1 =1
ret2 = g.send('hsr') #输出hsr 并 ret2 = 2
6、计算移动平均值
def avg_generator():
sum = 0
count = 0
avg = 0
while 1:
num = yield avg
count += 1
sum += num
avg = sum / count g = avg_generator()
r = g.__next__()
print(r)
for i in range(5):
ret = g.send(int(input()))
print(ret)
6、预激协程的装饰器
# 用装饰器进行一次next,后面就可以直接使用
def init(func):
def inner(*args,**kwargs):
g = func(*args,**kwargs)
g.__next__()
return g
return inner
@init
def avg_generator():
sum = 0
avg = 0
count = 0
while 1:
num = yield avg
count += 1
sum += num
avg = sum / count
g = avg_generator()
print(g.send(10))
print(g.send(15))
print(g.send(20))
7、yield from
#可以从容器中直接一个一个返回值
def generator():
l = [1,2,3,4,5]
yield from l g = generator()
for i in g:
print(i) #结果
1
2
3
4
5
9、列表推导式
#形式
#[满足条件的元素 for 元素 in 可迭代对象 if 条件] li = [i for i in range(31) if i % 3 == 0]
#得到30内可以被3整除的数的列表 #嵌套
li2 = [[1,2,3,4,5],[6,7,8,9,10]]
ret = [i for ls in li2 for i in ls if i %2 == 0]
#得到嵌套列表中可以被2整除的数的列表
10、生成器表达式
#和列表推导式类似,将[]换成()
#不同的是生成器表达式得到的是一个迭代器,而不是全部的数据 g = (i for i in range(10))
print(g) #会得到类似<generator object generator ...> #可以使用for循环获取值
for i in g:
print(i)
11、字典推导式
#以将键值对换为例(注意值要是不可迭代对象)
dic = {'a':10,'b':20}
dic_frequency = {dic[k]:k for k in dic}
12、集合推导式
#和列表推导式类似,将[]换成{},结果会去重
squared = { x**2 for i in [1,-1,2]}
#结果 squared = {1,4}
python基础9 (迭代器、生成器)的更多相关文章
- python基础6 迭代器 生成器
可迭代的:内部含有__iter__方法的数据类型叫可迭代的,也叫迭代对象实现了迭代协议的对象 运用dir()方法来测试一个数据类型是不是可迭代的的. 迭代器协议是指:对象需要提供next方法,它要么返 ...
- python基础(9)-迭代器&生成器函数&生成器进阶&推导式
迭代器 可迭代协议和迭代器协议 可迭代协议 只要含有__iter__方法的对象都是可迭代的 迭代器协议 内部含有__next__和__iter__方法的就是迭代器 关系 1.可以被for循环的都是可迭 ...
- (转)python基础之迭代器协议和生成器(一)
一 递归和迭代 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...
- Python基础(冒泡、生成器、迭代器、列表与字典解析)
一.冒泡算法 冒泡算法,给定一组数据,从大到小排序或者从小到大排序,就像气泡一样 原理: 相邻的两个对象相比,大的放到后面,交换位置 交换位置通过a,b=b,a来实现 1.我们可以通过for循环来根 ...
- Python基础之迭代器和生成器
阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...
- python基础之 迭代器回顾,生成器,推导式
1.迭代器回顾 可迭代对象:Iterable 可以直接作用于for循环的对象统称为可迭代对象:Iterable.因为可迭代对象里面存在可迭代协议,所以才会被迭代 可迭代对象包括: 列表(list) 元 ...
- 7th,Python基础4——迭代器、生成器、装饰器、Json&pickle数据序列化、软件目录结构规范
1.列表生成式,迭代器&生成器 要求把列表[0,1,2,3,4,5,6,7,8,9]里面的每个值都加1,如何实现? 匿名函数实现: a = map(lambda x:x+1, a) for i ...
- python基础之迭代器协议和生成器
迭代器和生成器补充:http://www.cnblogs.com/luchuangao/p/6847081.html 一 递归和迭代 略 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个ne ...
- python基础8 -----迭代器和生成器
迭代器和生成器 一.迭代器 1.迭代器协议指的是对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2. ...
- Python基础4 迭代器,生成器,装饰器,Json和pickle 数据序列化
本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...
随机推荐
- JavaScript:理解执行环境、作用域链和活动对象
作用域的原理,对JS将如何解析标识符做出了解答.而作用域的形成与执行环境和活动对象紧密相关. 我们对于JS标识符解析的判断,存在一个常见误区 首先,看一个关于JS标识符解析的问题 ,源于风雪之隅提出的 ...
- [luogu3195 HNOI2008] 玩具装箱TOY (斜率优化dp)
题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...
- ArcGIS探索
一.ArcGIS10概述 1.1 总览 ArcGIS是地理信息系统平台软件,主要用于创建和使用地图,编辑和管理地理数据,分析和共享地理信息,并在一系列应用中使用地图和地理信息. 功能定位: a.地图: ...
- 父类指针指向子类内存,为什么当父类的成员函数不加virtual时,访问的还是父类的成员函数,而不是子类同名的成员函数
我认为是这样,类的成员函数都在代码区,不同的类的成员函数在代码区有自己的类名称空间限制,类的虚函数在虚函数表中,程序执行的时候,是先在虚函数表中找该成员函数,如果没有找到,就去该类在代码区的成员函数中 ...
- visual studio 2017 使用码云gitee进行源代码管理
在码云新建项目 复制项目地址 visual studio 操作 新建项目 提交到码云
- CodeForces 362E Petya and Pipes
Petya and Pipes Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on CodeForces. ...
- Google翻译PDF文档
Google翻译PDF文档 翻译软件虽多如牛毛,但有关整段/全文翻译,堪用的软件极少, 涉及专业技术的文献.胜任翻译工作的人力稀缺.少不了project师讴心沥血. 由于多是PDF格式.即使要翻译个概 ...
- Android动态载入JAR包的实现方法
有时候我们须要使用动态更新技术,简单来说就是:当我们把开发jar包发送给用户后.假设后期升级了部分代码.这时让用户的jar包自己主动更新,而不是用户主动手动地去更新的技术就是动态更新.这个须要使用的技 ...
- RSA in .net and dotnet core
dotnet RSAParameters Struct https://docs.microsoft.com/zh-cn/dotnet/api/system.security.cryptography ...
- iOS定义静态变量、静态常量、全局变量
静态变量 当我们希望一个变量的作用域不仅仅是作用域某个类的某个对象,而是作用域整个类的时候,这时候就可以使用静态变量. staticstatic修饰的变量,是一个私有的全局变量.C或者Java中sta ...