迭代器跟生成器,与上篇文章讲的装饰器一样,都是属于我的一个老大难问题。

通常就是遇到的时候就去搜一下,结果在一大坨各种介绍博客中看了看,回头又忘记了。

你是不是也是这样呢?

俗话说:好记性不如烂笔头,虽然现在基本不咋用笔写字了,但是还是要好好整理下,起码以后我就不用搜了。

如果现在给你一个列表list_a = [1, 2, 3, 4],让你去迭代它,相信大家都很熟悉,直接用for循环就完事儿,

list_a = [1, 2, 3, 4]

for i in list_a:
print(i)

运行

1
2
3
4
[Finished in 0.1s]

可以看到,for循环迭代了列表中的每一个元素,打印了出来。

那么for循环背后都做了什么事情呢?

一、 容器、可迭代对象、迭代器

听起来陌生,但是你绝对熟悉的词儿。

在python中,一切都是对象,对象的抽象是类,而对象的集合就是容器。

使用python中常见的容器有很多,比如:列表list:[0, 1, 2]集合set:([0, 1, 2])字典dict:{0:0, 1:1, 2:2}以及元组tuple(0, 1, 2)

这些都是多个元素集中在一起的单元,区别的是内部数据结构的实现方法。

所有的容器都是可以迭代的,你可以用for循环去迭代上述的容器试试。

那把一个个元素找出来,用到的就是迭代器。用iter()可以创建一个迭代器。

迭代器提供一个next()方法,这个方法你每次调用的时候会给你返回下一个对象,或者StopIteration,也就是没有对象可以给你了。

list_a = [1, 2, 3, 4]

it = iter(list_a) # 创建迭代器

print(next(it)) #调用next()
print(next(it))
print(next(it))
print(next(it))
print(next(it))

运行结果,前4个print可以正常返回,第5个时候就出现StopIteration错误了,因为列表中4个元素已经返回完了。

1
2
3
4
Traceback (most recent call last):
File "D:\练习\demo_iterator.py", line 9, in <module>
print(next(it))
StopIteration
[Finished in 0.1s with exit code 1]

二、生成器

什么是生成器?简单粗暴一点:生成器就是懒人版的迭代器。

在上述的创建迭代器操作中,我们显然是做了一次性生成的操作,list_a = [1, 2, 3, 4],这4个元素一次性生成好,以供next()调用。

但是生成出的这些元素都是会保存到内存中去,这只是4个元素,如果有上千万、上亿元素呢?

我并不是第一时间要用到所有的元素,我只要在我调用next()的时候产生一个返回给我就好,那么这样一次性生成就会白白占用了大量的内存。

生成器应运而生,当调用next()的时候,才会生成下一个变量。

生成器的写法很简单,用小括号,比如把一个列表生成式括起来:(i for i in range(10000)),这样就初始化了一个生成器。

print([i for i in range(10)])

print(i for i in range(10))

上面的时列表,下面的就是一个生成器了,区别就是[]()

运行结果:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
<generator object <genexpr> at 0x033383A8>
[Finished in 0.1s]

yield关键字

此外,函数也可以成为生成器,秘密就是yield关键字,比如:

def gen():
a = 0
while a < 100:
yield a
a += 1 test = gen()
print(next(test))
print(next(test))
print(next(test))
print(next(test))

运行结果:

0
1
2
3
[Finished in 0.1s]

yield关键字,可以这样理解:当函数运行到这一行的时候,程序会从这里暂停,yield相当于return会返回,

当下次迭代时候,则会从yield的下一行代码开始执行。

所以,我调用了4次print,可以从0开始依次输出。

从我工作中的使用场景出发的话,我在做一些自动化测试的时候,有些变量参数是不可以重复的,用迭代器来定义变量的生成规则,每次

调用都会产生一个新的,就不会重复了。

【python】迭代器与生成器到底是什么?看完你就知道的更多相关文章

  1. 一文搞懂Python迭代器和生成器

    很多童鞋搞不懂python迭代器和生成器到底是什么?它们之间又有什么样的关系? 这篇文章就是要用最简单的方式让你理解Python迭代器和生成器! 1.迭代器和迭代过程 维基百科解释道: 在Python ...

  2. Python 迭代器和生成器(转)

    Python 迭代器和生成器 在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的, ...

  3. Python - 迭代器与生成器 - 第十三天

    Python 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问 ...

  4. 怎么理解Python迭代器与生成器?

    怎么理解Python迭代器与生成器?在Python中,使用for ... in ... 可以对list.tuple.set和dict数据类型进行迭代,可以把所有数据都过滤出来.如下:         ...

  5. Python迭代器,生成器--精华中的精华

    1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大 ...

  6. python迭代器,生成器

    1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大 ...

  7. python -迭代器与生成器 以及 iterable(可迭代对象)、yield语句

    我刚开始学习编程没多久,对于很多知识还完全不知道,而有些知道的也是一知半解,我想把学习到的知识记录下来,一是弥补记忆力差的毛病,二也是为了待以后知识能进一步理解透彻时再回来做一个补充. 参考链接: 完 ...

  8. Python迭代器和生成器你学会了吗?

    在了解什么是迭代器和生成器之前,我们先来了解一下容器的概念.对于一切皆对象来说,容器就是对象的集合.例如列表.元祖.字典等等都是容器.对于容器,你可以很直观地想象成多个元素在一起的单元:而不同容器的区 ...

  9. python迭代器与生成器详解

    迭代器与生成器 迭代器(iterator)与生成器(generator)是 Python 中比较常用又很容易混淆的两个概念,今天就把它们梳理一遍,并举一些常用的例子. for 语句与可迭代对象(ite ...

随机推荐

  1. JS 下拉菜单案例

    css代码 .nav { width: 300px; height: 400px; list-style: none; padding:; margin: 0 auto; } .nav>li { ...

  2. DotNet Core

    安装 dotnet add package Pomelo.EntityFrameworkCore.MySql 使用 MySQL 作为后端     在继承 DbContext 类中重写 OnConfig ...

  3. 【工具】之002-Mac下常用工具

    写在前面 我很懒,,,不想敲一个命令一个命令敲... "偷懒是有前提的,不是之前,就是之后." 常用命令 测试端口是否畅通 nc -z 10.254.3.86 30003 查看端口 ...

  4. 【Gin-API系列】配置文件和数据库操作(三)

    我们前面已经实现了API的基础版本,能对参数校验和返回指定数据,这一章,我们将对主机和交换机进行建模,存入数据库. 考虑到数据库安装和使用的简便性,我们采用文档存储结构的MongoDB数据库. Mon ...

  5. C#LeetCode刷题-分治算法

    分治算法篇 # 题名 刷题 通过率 难度 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组的中位数(Median of Two Sorted Arrays)-该题未达最优解 30 ...

  6. C#设计模式之2-抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/391 ...

  7. Vue 大量data及rules的data选项结构组织

    如果Vue文件需要很多的data成员及表单验证,建议使用类似结构 export default{ data(){ const model = { username: 'suzhen', passwor ...

  8. Docker服务开放了这个端口,服务器分分钟变肉机

    之前有很多朋友提过,当使用docker-maven-plugin打包SpringBoot应用的Docker镜像时,服务器需要开放2375端口.由于开放了端口没有做任何安全保护,会引起安全漏洞,被人入侵 ...

  9. Spring事务专题(五)聊聊Spring事务到底是如何实现的

    前言 本专题大纲: 本文为本专题倒数第二篇文章. 在上篇文章中我们一起学习了Spring中的事务抽象机制以及动手模拟了一下Spring中的事务管理机制,那么本文我们就通过源码来分析一下Spring中的 ...

  10. 只要动手就能学到东西4 JSON.stringify

    今天在调试javascript时,需要将不可显示字符如\r\n在console显示出来,查了下,原来可以用JSON.stringify().这个方法以前也用过,但都是将javascript对象变成js ...