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 ...
随机推荐
- SQL Server最大内存设为0后的处置办法
故障说明: 远程调整实例内存时疏忽,将实例最大内存调整为了0,因此最大内存变成了128MB的最小值. 解决方式: 1.正常关闭SQL Server服务,如果是集群,需要先关停止集群角色防止故障转移,然 ...
- iis 6,7 ftp 进行用户隔离进行权限控制,不同用户查看不同文件夹
iis 6 配置点击链接 http://www.jb51.net/article/20676.htm iis 7配置 1.建立文件夹 C:\ftp, 并增加 目录 localuser(这个是必须的名字 ...
- python数据类型练习题
一.元素分类 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中.即: { ...
- Ubuntu 普通用户无法启动Google chrome
删除 /home/你的用户名/.config/google-chrome文件,再打开就好了 root@ecos:cd /home/ecos/.config root@ecos:~/.config# r ...
- 6.03-news_xpath2
import re import requests # 安装支持 解析html和XML的解析库 lxml # pip install lxml from lxml import etree url = ...
- https验证证书的三个级别
一.无条件信任证书 1. func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge ...
- [3] TensorFlow 深层神经网络
深层神经网络简称为深度学习有两个非常重要的特性1. 多层2. 非线性 线性模型的局限性 :例如前面的神经网络有两层(不算输入层),但是它和单层的神经网络井没有区别,任意线性模型的组合仍然还是线性模型, ...
- 【转】FFmpeg获取DirectShow设备数据(摄像头,录屏)
这两天研究了FFmpeg获取DirectShow设备数据的方法,在此简单记录一下以作备忘.本文所述的方法主要是对应Windows平台的. 1. 列设备 ffmpeg -list_devic ...
- ElasticSearch(站内搜索) 转发 https://www.cnblogs.com/xibei666/p/5929970.html
简介 Elasticsearch是一个实时的分布式搜索和分析引擎.它可以帮助你用前所未有的速度去处理大规模数据.它可以用于全文搜索,结构化搜索以及分析,当然你也可以将这三者进行组合.Elasticse ...
- Linux 任务计划 crontab 配置概要与常见问题
Linux 可以利用 crontab 来实现定时任务,自动化操作.本文对此进行简要说明. crontab 操作示例 列出定时任务 crontab -l #列出所有的定时任务,如果没有定时任务,返回 ...