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 ...
随机推荐
- x86服务器MCE(Machine Check Exception)问题
MCE现象 Intel在Pentium 4.Xenon和P6系列处理器中实现了机器检查(Machinecheck)架构,提供能够检测和报告硬件(机器)的错误机制,如系统总线错误.ECC错误.奇偶校验错 ...
- 如何用Jupyter notebook打开本地数据集
首先打开本地Jupyter notebook,出现类似页面并进入网页端Home. 网页端界面类似如下: 需要注意的是,Jupyter notebook只能打开当前目录下的数据集,如csv,所以需要使用 ...
- Unity 琐碎5 : 利用反射设置编辑器参数
问题 最近处理unity资源打包问题时候经常遇到的一个问题就是平台切换和Bundle编译.一般情况下,平台转换我需要依赖Cache Serbver加快转换速度,但是在Build Bundle的时候我又 ...
- 023合并K个链表并排序
#include "000库函数.h" struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), n ...
- 【Linux基础】tr命令替换和删除字符
1.tr命令 tr可以对来自标准输入的字符进行替换.压缩和删除,可以将一组字符变成另外一组字符.通过使用 tr,您可以非常容易地实现 sed 的许多最基本功能.您可以将 tr 看作为 sed 的(极其 ...
- vue自定义指令用法总结及案例
1.vue中的指令有哪些?
- 009_一行python重要工具
一.一行启动httpserver 你可以先登录容器(webssh),然后(注意必须是在/data/log/debug/pprof/目录) 例如生成 jvm dump文件 jmap -dump:form ...
- 盘点 Oracle 11g 中新特性带来的10大性能影响
Oracle的任何一个新版本,总是会带来大量引人瞩目的新特性,但是往往在这些新特性引入之初,首先引起的是一些麻烦,因为对于新技术的不了解.因为对于旧环境的不适应,从Oracle产品到技术服务运维,总是 ...
- JSONPath介绍
1. JSONPath介绍 官网地址: https://github.com/alibaba/fastjson/wiki/JSONPath fastjson 1.2.0之后的版本支持JSONPath. ...
- Java多线程(十)——线程优先级和守护线程
一.线程优先级的介绍 java 中的线程优先级的范围是1-10,默认的优先级是5.“高优先级线程”会优先于“低优先级线程”执行. java 中有两种线程:用户线程和守护线程.可以通过isDaemon( ...