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生成连续日期(年份、月份、日期)
此随笔主在分享日常可能用到的sql函数,用于生成连续日期(年份.月份.日期) 具体的看代码及效果吧! -- ============================================= ...
- irc 关键操作
IRC 客户端: Textual 5 HexChat IRC 用户密码常用命令: 用户密码: 忘记密码 如果太长时间没登录IRC,难免会忘记密码,那IRC有重置密码的功能吗?当然有,不过也是通过命令 ...
- 将web项目部署到阿里云服务器上
一.用eclipse将写好的项目打成war包 1.右键点击项目,选择Export 选择打包之后的路径,点击Finsh. 2.购买阿里云服务器 按下图选择 3.设置云服务器防火墙 4.远程连接云服务器 ...
- puppet 横向扩展(二)
Table of Contents 1. 概述 2. 实验环境 3. 实验步骤 3.1. 机器B 的环境 3.1.1. 安装puppetmaster 以及 apache passenger 3.1.2 ...
- UUID生成随机字符串
import java.util.UUID; UUID.randomUUID().toString().replace("-", "") 生成的样子 ...
- 引用变量 php面试总结1
(1)PHP引用变量 概念:不同的变量名,访问同一个变量内容,使用& 知识点: 使用php函数 (a)memory_get_usage() 查看内存使用情况 eg // 定义一个变量 $a = ...
- centos7下kubernetes(4.kubernetes组件)
Kubenetes cluster 由master和node组成 Master是kubenetes的大脑.运行着以下进程:kube-apiserver.kube-scheduler.kube-cont ...
- 鼠标右键打开命令行cmd(管理员身份)
参考:https://blog.csdn.net/bdss58/article/details/54745380 添加到注册表 将下面命令保存为reg文件: Windows Registry Edit ...
- UVA1627-Team them up!(动态规划)
Problem UVA1627-Team them up! Total Submissions:3577 Solved:648 Time Limit: 3000 mSec Problem Descr ...
- pytorch visdom可视化工具学习—1—安装和使用
1.安装 安装命令: (deeplearning) userdeMBP:~ user$ pip install visdomCollecting visdom Downloading https:/ ...