08-Python迭代器与生成器
迭代器
什么是迭代器
- 迭代是Python最强大的功能之一,是访问序列中元素的一种方式。
- 迭代器是一个可以记住遍历的位置的对象。
- 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
- 迭代器有两个基本的方法:iter() 和 next()。
可迭代对象
- 字符串、列表、元组对象等都是可迭代对象
- 字符串、列表、元组对象等都可以创建迭代器
也就是说:
字符串、列表、元组对象等暂时不是迭代器,暂时不能被迭代。但是,它们成为迭代器之后就可以被迭代了,如for循环。
利用可迭代对象Iterable创建迭代器Iterator
l=[1,2,3,4] #l:可迭代对象
i=iter(l) #i:迭代器
print(next(i)) #输出1
print(next(i)) #输出2
print(i.__next__()) #输出3
解释:
- iter()函数可以将可迭代对象创建为迭代器
- 利用next函数可以得到下一个元素值
- 迭代器能够记住遍历的位置,所以可以依次调用next()
- 可迭代对象:Iterable
- 迭代器:Iterator
- 可迭代对象不能被迭代,不能调用next()。成为迭代器之后才可以。
注意:
遍历完毕后,若再次调用next()函数,则会抛出异常:StopIteration,处理此异常即可。
处理StopIteration异常
try:
l=[1,2]
i=iter(l)
print(next(i)) #输出1
print(next(i)) #输出2
print(next(i)) #抛出异常
except StopIteration as stopIteration:
print("遍历完成")
刨析for循环
for循环实现了序列的遍历,那它怎么实现的呢?
for循环做的三件事:
- 创建迭代器
- 调用next方法
- 处理StopIteration异常
模拟for循环:
a=[100,200,300,400,500]
j=None
i=iter(a) #1.创建迭代器
while(True):
try:
j=next(i) #2.调用next方法
except StopIteration as stopIteration: #3.处理StopIteration异常
break
print(j)
结果:
100
200
300
400
500
生成器
什么是生成器?
- 生成器是一种特殊的迭代器。
- 普通的迭代器将所有数据存放在内存中,极其占用内存空间。
- 生成器不将数据存入内存,而是通过计算得到数据。
生成式生成器
a=(x*x for x in range(4))
print(next(a)) #输出0
print("---------------------")
for i in a: #输出1、4、9
print(i)
解释:
- 生成式生成器的语法与列表生成式相似,但用小括号( )包裹。列表生成式用[ ]包裹。
- 数据不会存放在内存中,每一个调用next函数,就会计算一次数据。
- 使用生成器的好处是:节约内存空间。
函数生成器
- 函数生成器使用关键字yield来产生数据。
- 通过next()来得到yield产生的数据
def get():
yield 1
yield 2
g=get()
print(next(g)) #输出1
print(next(g)) #输出2
解释:
- 依次产生1和2,第三次调用next()则报错
- 运行yield语句后,python立即设置断点,停止运行此函数,等待下一次调用next()
- 每次运行,将从上一次的断点处(即上一个yield后)开始运行。
函数生成器-send
- 通过send函数得到下一个值
- send函数还可以传入一个值,这个值将被yield接收到
def func():
count1 = yield 1
print("count1=" , count1)
count2 = yield 2
print("count2=" , count2)
yield 3
g = func()
print(g.send(None))
print(g.send(2))
结果:
1
count1= 2
2
解释:
count1 = yield 1
是赋值语句,先执行等号右边。- 运行yield语句后,暂停运行此函数,所以第一次并没有接收值。所以第一次通过send得到值需要用send(None)。
- 此处的知识可以运用到协程上。
应用-斐波那契序列
可以得到无限多个斐波那契序列中的元素:
def fib():
a=1
b=1
yield a
yield b
while(True):
yield a+b
temp=a+b
a=b
b=temp
f = fib()
for i in range(10):
print(next(f),end=" ")
结果:
1 1 2 3 5 8 13 21 34 55
08-Python迭代器与生成器的更多相关文章
- Python 迭代器和生成器(转)
Python 迭代器和生成器 在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的, ...
- 一文搞懂Python迭代器和生成器
很多童鞋搞不懂python迭代器和生成器到底是什么?它们之间又有什么样的关系? 这篇文章就是要用最简单的方式让你理解Python迭代器和生成器! 1.迭代器和迭代过程 维基百科解释道: 在Python ...
- Python - 迭代器与生成器 - 第十三天
Python 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问 ...
- 怎么理解Python迭代器与生成器?
怎么理解Python迭代器与生成器?在Python中,使用for ... in ... 可以对list.tuple.set和dict数据类型进行迭代,可以把所有数据都过滤出来.如下: ...
- Python迭代器,生成器--精华中的精华
1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大 ...
- python迭代器与生成器详解
迭代器与生成器 迭代器(iterator)与生成器(generator)是 Python 中比较常用又很容易混淆的两个概念,今天就把它们梳理一遍,并举一些常用的例子. for 语句与可迭代对象(ite ...
- Python—迭代器与生成器
迭代器与生成器 生成器(generator) 先来了解一下列表生成器: list = [i*2 for i in range(10)] print(list)>>>>[0, 2 ...
- python -迭代器与生成器 以及 iterable(可迭代对象)、yield语句
我刚开始学习编程没多久,对于很多知识还完全不知道,而有些知道的也是一知半解,我想把学习到的知识记录下来,一是弥补记忆力差的毛病,二也是为了待以后知识能进一步理解透彻时再回来做一个补充. 参考链接: 完 ...
- python迭代器,生成器
1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大 ...
- Python迭代器和生成器你学会了吗?
在了解什么是迭代器和生成器之前,我们先来了解一下容器的概念.对于一切皆对象来说,容器就是对象的集合.例如列表.元祖.字典等等都是容器.对于容器,你可以很直观地想象成多个元素在一起的单元:而不同容器的区 ...
随机推荐
- 集群监管-USDP(智能大数据平台)
UCloud Smart Data Platform(简称 USDP),是 UCloud 推出的智能化.轻量级.适用于私有化部署至客户本地的大数据基础服务平台,通过自研的 USDP Manager 管 ...
- 开启 ssh 服务
开启 ssh 服务 vim /etc/ssh/sshd_config 重启 ssh 服务:/etc/init.d/ssh restart 设置服务自启动:update-rc.d ssh enable
- ruby执行周期性任务 whenever
ruby执行周期性任务 下面看看怎么将任务写入cron服务. $ whenever #不带参数的whenever会显示转换程cron任务的代码,不写入cron任务表 $ whenever -w #写入 ...
- ansible(2)--ansible的安装与配置文件管理
目录 1 ansible的安装 1.1 yum安装 1.2 pip安装 2 ansible相关文件 2.1 ansible配置文件 2.2 ansible配置文件的优先级 2.3 ansible的主机 ...
- nim 5. 读写文件
读文件 假设nim程序相同的文件夹下,有个people.txt文件,内容如下: Alice A. Bob B. Carol C. 读取这个文件的代码 import strutils let conte ...
- GPS坐标、火星坐标、百度坐标之间的转换--提供javascript版本转换代码
1.国内几种常用坐标系说明 WG-S84: GPS仪器记录的经纬度信息,Google Earth采用,Google Map中国范围外使用,高德地图中国范围外使用.GCJ-02: 火星坐标系,中国国家测 ...
- Java 中的深拷贝和浅拷贝你了解吗?
前言 Java 开发中,对象拷贝是常有的事,很多人可能搞不清到底是拷贝了引用还是拷贝了对象.本文将详细介绍相关知识,让你充分理解 Java 拷贝. 一.对象是如何存储的? 方法执行过程中,方法体中的数 ...
- k8s 怎么精准获取deployment关联的pods?
标签获取 我们获取那些pods属于某个deployment时最先想到的可能是通过标签获取,其实这个是不准确的.因为标签并不是唯一的,也就是说不同deployment其实是能有相同标签的. replic ...
- 领域驱动设计(Domain-Driven Design,简称DDD)【简介 个人学习笔记】
找到了第 1 篇资料:领域驱动设计详解:是什么.为什么.怎么做? - 知乎 找到了第 2 篇资料:领域驱动架构(DDD)建模中的模型到底是什么? - 知乎 找到了第 3 篇资料:一文看懂DDD 领域驱 ...
- Kubernetes Cluster部署
1.基本环境说明 ip: 192.168.115.149 主机名:node1 CentOS Linux release 7.9.2009,内核版本为3.10.0-1160.81.1.el7.x8 ...