Day12 Python基础之生成器、迭代器(高级函数)(十)
https://www.cnblogs.com/yuanchenqi/articles/5769491.html
1. 列表生成式
我现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],我要求你把列表里的每个值加三次方,你怎么实现?你可能会想到2种方式
a=[0,1,2,3,4,5,6,7,8,9]
b=[]
for i in a:
b.append(i+1)
a=b
print(a)
普通版本
a=map(lambda x:x+1,range(10))
print(a,type(a))
for i in a:
print(i) 输出结果:
<map object at 0x0272A4D0> <class 'map'>
1
2
3
4
5
6
7
8
9
10
文艺版本
(1)
t=[0,1]
a,b=t
print(a)
print(b)
输出结果:
0
1
(2)
t=[0,1,2]
a,b=t
print(a)
print(b)
输出结果:
ValueError: too many values to unpack (expected 2)
(3)
t=[0,1]
a,b,cc=t
print(a)
print(b)
print(c)
输出结果:
ValueError: not enough values to unpack (expected 3, got 2)
小知识点
def f(n):
return n**3
a=[f(x) for x in range(10)]
print(a,type(a)) 等价于
a=[x**3 for x in range(10)]
print(a,type(a))
输出结果:
[0, 1, 8, 27, 64, 125, 216, 343, 512, 729] <class 'list'>
装逼版本
2. 生成器(generator)
生成器的创建方式有两种:()和yield
a=(x**3 for x in range(10))
print(a,type(a)) 等价于
def f(n):
return n**3
a=(f(x) for x in range(10))
print(a,type(a)) 输出结果:
<generator object <genexpr> at 0x02DC34B0> <class 'generator'>
简单生成器之()生成演示
生成器数据类型的变量指向的内存地址,根本就没有任何数据在内存中,也没有存储在任何地方。
(类比理解:列表是将数据存储在变量指向的内存空间的,这就相当于你冰箱里面放了十道菜,你想吃哪个就去拿,这是占用一定的空间的,为了解决这个问题,我们有了生成器,就好比你拥有了一个有脾气的厨师,让厨师给你现做现吃,做哪个你就吃哪个好了,在生成器s中可以用生成器内置方法s.__next__()或者python内置函数next(s)这个方法按顺序生成值,这取决于你生成器的本身的特性。建议使用next(s))
生成生成器对象里面的值
a=(x*2 for x in range(10))
print(a,type(a))
print(a.__next__())
print(next(a))
print(next(a))
print(next(a))
输出结果:
<generator object <genexpr> at 0x028B34B0> <class 'generator'>
0
2
4
6
next()生成值
注:生成器就是一个可迭代对象,迭代器也是可迭代对象
a=(x*2 for x in range(4))
print(a,type(a)) for i in a:
print(i) 输出结果:
0
2
4
6
遍历生成器
注:(1)for循环可遍历可迭代对象,有__iter__方法的都是可迭代对象内部的方法,iter()是内置函数
(2)for循环遍历可迭代对象的三个步骤:
- 调用可迭代对象的iter方法,返回一个迭代器对象
- 不断调用迭代器的next方法
- 处理stopiteration异常
while:
try:
i=next(generator)
except StopIteration
break
(3)当内存中的数据,没有变量引用的时候(即没有变量指向该内存地址),该数据就会被python的解释器当垃圾清除掉
这样就算遍历生成器,也不会占用大量内存,因为i的指向一直在更新,没有被引用的数据就会被清除
def f():
print('Hello')
yield 1
print('Ok')
yield 2
g=f()
print(g,type(g))
输出结果:
<generator object f at 0x033634B0> <class 'generator'>
简单生成器之yield生成演示
注:没有yield就是普通的函数,有yeild,定义的函数f()就是一个生成器对象,有几个yield就相当于几道菜。
生成生成器对象里面的值
def f():
print('Hello')
yield 1
print('Ok')
yield 2
g=f()
next(g)
next(g)
输出结果:
Hello
Ok
next()
注:
(1)每调用一次next(g),就执行一遍g函数,以yield为结束点,返回1(相当于return结束函数的运行),再执行一遍next(g),以上次的结束点为起点,继续执行g函数,并返回2
(2)可通过yield实现在单线程的情况下实现并发运算的效果,即伪并发,CPU切换速度特别快,以至于我们不觉得有切换这一过程
def f():
print('Hello')
yield 1
print('Ok')
yield 2
g=f() for i in g:
print(i)
输出结果:
Hello
1
Ok
2
for循环遍历生成对象
注:for循环遍历生成对象g,以yield结束标志执行函数内容,并打印出了yield返回值
def fibo(N):
Max=N
n,before,after=0,0,1
while n<Max:
# print(after)
yield after
before,after=after,before+after
n+=1
g=fibo(8)
# print(next(g))
# print(next(g))
# print(next(g))
for i in g:
print(i)
yield生成斐波那契数列
生成器对象的send方法
def fibo(N):
Max=N
n,before,after=0,0,1
while n<Max:
# print(after)
count=yield after
print(count)
before,after=after,before+after
n+=1
g=fibo(8) g.send(None) #相当于next(g),先进入生成器对象,遇到yield,返回after后结束
g.send('eee') #从上一次结束点开始,继续程序,将send的参数赋值给count,继续执行后面的语句,直到再次遇到yield
输出结果:
eee
send方法传参数
注:进入生成器后(next,send(None))再能send传参数
3. 迭代器(iterator)
生成器都是迭代器,迭代器不一定是生成器;
可迭代对象(Iterable)不一定是迭代器(Iterator),通过iter方法可以把可迭代对象变成迭代器(迭代器对象),这是因为可迭代对象里面有__iter__方法。
什么是迭代器:需要满足两个条件:(1)有iter方法(2)有next方法
from collections import Iterable,Iterator
d=[1,2,3,4,5,6]
a=iter(d)
print(a,type(a))
# print(next(a))
# # print(next(a))
# for i in a:
# print(i)
print(isinstance(d,Iterable)) #判断d是不是可迭代对象
print(isinstance(d,list)) #判断d是不是列表
print(isinstance(d,Iterate)) #判断的是不是迭代器
迭代器
Day12 Python基础之生成器、迭代器(高级函数)(十)的更多相关文章
- python基础(八)生成器,迭代器,装饰器,递归
生成器 在函数中使用yield关键字就会将一个普通的函数变成一个生成器(generator),普通的函数只能使用return来退出函数,而不执行return之后的代码.而生成器可以使用调用一个next ...
- Day11 Python基础之装饰器(高级函数)(九)
在python中,装饰器.生成器和迭代器是特别重要的高级函数 https://www.cnblogs.com/yuanchenqi/articles/5830025.html 装饰器 1.如果说装 ...
- python基础之生成器迭代器
1 生成器: 为什么要有生成器? 就拿列表来说吧,假如我们要创建一个list,这个list要求格式为:[1,4,9,16,25,36……]这么一直持续下去,直到有了一万个元素的时候为止.如果我们要创建 ...
- 十三. Python基础(13)--生成器进阶
十三. Python基础(13)--生成器进阶 1 ● send()方法 generator.send(value) Resumes the execution, and "sends&qu ...
- 十二. Python基础(12)--生成器
十二. Python基础(12)--生成器 1 ● 可迭代对象(iterable) An object capable of returning its members one at a time. ...
- Python基础之生成器、迭代器
一.字符串格式化进阶 Python的字符串格式化有两种方式: 百分号方式.format方式,由于百分号的方式相对来说比较老,在社区里讨论format方式有望取代百分号方式,下面我们分别介绍一下这两种方 ...
- 【笔记】Python基础四:迭代器和生成器
一,迭代器协议和for循环工作机制 (一),迭代器协议 1,迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stopiteration异常,以终止迭代(只能往 ...
- Python基础入门(迭代器和生成器)
1 Python迭代器 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器只能往前不会后退. 迭代器有两个基本的方法:iter() 和 ...
- python基础编程:生成器、迭代器、time模块、序列化模块、反序列化模块、日志模块
目录: 生成器 迭代器 模块 time 序列化 反序列化 日志 一.生成器 列表生成式: a = [1,2,3,3,4,5,6,7,8,9,10] a = [i+1 for i in a ] prin ...
随机推荐
- Jenkins版本升级
前言 我们的内网打包环境目前是运行在windows上,采用jenkins.msi 安装成windwos服务的形式. 升级前准备 在jenkins版本升级之后,我使用ThinBackup进行了备份,详细 ...
- IIS下MySQL停止和启动的方法
mysql服务的启动与停止:点击开始--运行,输入services.msc , 在弹出的服务窗口中,找到mysql服务,直接点击左侧对应 的就可以了 如下图所示:
- LeetCode算法题-Sum of Two Integers(Java实现)
这是悦乐书的第210次更新,第222篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第78题(顺位题号是371).计算两个整数a和b的总和,但不允许使用运算符+和 - .例 ...
- Java入门(二):注释和基本数据类型
上次通过eclipse在控制台输出了hello world,是不是有点小激动啊,今天接着介绍Java基础知识. 一.Java注释 1.Java注释语句不会被编译器运行,不用担心代码因为许多注释语句显得 ...
- CSS多行文本垂直居中
今天需要将文本垂直居中,就是一行是垂直居中,多行也是垂直居中. 效果如下 实现代码(同事提供) <!DOCTYPE html> <html> <head lang=&qu ...
- AOP的底层实现:JDK动态代理与Cglib动态代理
转载自 https://www.cnblogs.com/ltfxy/p/9872870.html SpringAOP底层的实现原理: JDK动态代理:只能对实现了接口的类产生代理.(实现接口默认JDK ...
- 微信小程序本地引用iconfont(阿里巴巴矢量图标库)
好,忙,我懂..... 首先把图标放进项目里(废话): 接下来把这些图标下载到本地(这里不介绍网络途径了,下载就完事了) 然后利用一个网站将这个ttf文件转成base64文件https://trans ...
- C#基础知识之Sender
/// <summary> /// sender就是事件发起者,e存储事件发起者的一些参数 /// 例如: /// private void button1_Click(object se ...
- spark基础知识
1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduce的通用的并行计算框架. dfsSpark基于mapreduce算法实现的分布式计算,拥有HadoopM ...
- 转://通过udev创建ASM共享磁盘(RAC)
OS:RedHat EL6.0 Oracle: Oracle 11gR2 在Oracle 11gR2,构建RAC时可以通过ASM创建asm disk,但是需要安装asmlib相关软件:对于RedH ...