浅谈Python中的生成器和迭代器
作者:BlackMonkey 发布时间:2023-04-08 02:23:46
标签:Python,生成器,迭代器
迭代器
迭代器协议
对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么返回一个异常来终止本次迭代。(只能往前走,不能往后退!)
迭代器对象
遵循了(实现了)迭代器协议的对象。(对象内部实现了一个__next__方法,以实现迭代器协议)称为一个迭代器对象。他们的作用是逐个遍历容器中的对象。迭代器对象一定是可迭代对象
>>> from collections import Iterable, Iterator
>>> l = list([1,2,3]) # 定义列表
>>> l_iter = l.__iter__() # 调用列表的 __iter__ 方法
>>> isinstance(l, Iterable) # 列表可迭代对象
True
>>> isinstance(l, Iterator) # 列表不是迭代器
False
>>> isinstance(l_iter, Iterable) # 列表的__iter__ 方法返回 是可迭代对象
True
>>> isinstance(l_iter, Iterator) # 列表的__iter__ 方法返回 也是是迭代器对象
True
可迭代对象(iterable)
可迭代对象有很多种形式,只要满足可以每次取到容器对象中下一个对象的,都称为可迭代对象。
实现了 __iter__方法的对象称为可迭代对象。
range() 对象也是可迭代对象。
生成器对象也是可迭代对象。
>>> from collections import Iterable, Iterator
>>> isinstance(range(10), Iterator)
False
>>> isinstance(range(10), Iterable)
True
# 生成器对象一定是迭代器对象, 那么他也必然是可迭代对象
>>> isinstance((i for i in range(10)), Iterator)
True
>>> isinstance((i for i in range(10)), Iterable)
True
总结补充
列表、元组、集合、字符串、字典都是可迭代对象。
for 循环的本质:使用迭代器协议访问可迭代对象中的每一个对象。
生成器
生成器类似于一种数据类型,这种数据类型自动实现了迭代器协议,所以生成器也是迭代器。
生成器分类及在python中的表现形式:(Python有两种不同的方式提供生成器)
生成器函数
常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
>>> def generator(n):
... for i in range(n):
... yield i
...
>>> gener_obj = generator(10)
>>> gener_obj.__next__()
0
>>> gener_obj.__next__()
1
>>> gener_obj.__next__()
2
>>> type(gener_obj)
<class 'generator'>
生成器表达式
类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表,按需取出对象
注意生成器 用()包裹起来
>>> generator = (i for i in range(10))
>>> generator.__next__()
0
>>> generator.__next__()
1
>>> type(generator)
<class 'generator'>
来源:https://www.cnblogs.com/monkey-code/p/13158889.html


猜你喜欢
- 0、前言在以前读书的时候,实验室里面要求每天都要关电脑,有时候出去玩得晚了,懒得回实验室关电脑,又没有同学帮忙。于是就想,能不能通过什么手段
- HTML 的空白符处理规则HTML 中的“空白符”包括空格 (space)、制表符 (tab)、换行符 (CR/LF) 三种。我们知道,在默
- 前言最近公司项目从vue2迁移到vue3,感觉自己对Object.defineProperty和Proxy的了解还是在浅尝辄止的地步,所以今
- JAVA程序想要访问数据库,需要进行如下准备:1.安装一个数据库(这里使用mysql免安装版)2.下载该数据库的驱动包(这里使用mysql官
- 我们在前面的几节中分别讲了提高网站性能中内容、服务器、JavaScript和CSS等方面的内容。除此之外,图片和Coockie也是我们网站中
- 以前写过《 10条影响CSS渲染速度的写法与建议》,今天放些数据出来,供参考;首先说明一点,CSS对网页的最后渲染出来的速度影响非
- 本文介绍了写给新手同学的vuex快速上手指北小结,分享给大家,具体如下引入//store.jsimport Vue from 'vu
- pickle 是一个 python 中, 压缩/保存/提取 文件的模块,字典和列表都是能被保存的.但必须注意的是python2以ASCII形
- 1. 前言相信参与使用Oracle数据库进行项目开发、运维的同学常常被Oracle JDBC驱动的Maven依赖折磨。现在这一情况在今年二月
- 1、首先安装火狐浏览器有单独文章分享怎么安装2、搭建python环境安装python,安装的时候把path选好,就不用自己在配置,安装方法有
- 复制表结构及其数据下面这个语句会拷贝数据到新表中。注意:这个语句其实只是把select语句的结果建一个表,所以新表不会有主键,索引。crea
- 1. 引言在Python中有很多好玩的花式打印,对厉害的高手来说可能是小菜一碟,对入门的小白来说往往让人望而退步,我们今天就来挑战下面三个常
- 在实际开发过程中,对数据库的操作无非就“增删改查”。就最为普遍的单表操作而言,除了表和字段不同外,语句都是类似的,开发人员需要写大量类似而枯
- 例一:使用httplib访问某个url然后获取返回的内容:import httplibconn=httplib.HTTPConne
- profile是什么当我们要对某一条sql的性能进行分析时,可以使用它。Profiling是从 mysql5.0.3版本以后才开放的。启动p
- 本文记录了RHEL7.5下mysql 8.0.11安装教程,具体内容如下首先去mysql官网下载mysql-8.0.11-el7-x86_6
- 第一种np矩阵可以直接与标量运算>>>import numpy as np>>>arr1 = np.ar
- “输入框( Input )应当符合逻辑地划分为小组,这样大脑就可以很好的处理大堆区域间的关系。”– 《HTML权威指南》Web 应用程序总是
- ASP,一种最先广泛的流行在WEB行业的编程语言。严格的说,ASP还算不上的编程语言。不过,因为微软的大力支持,ASP这一路,走得非常顺利。
- 函数作用:该函数的作用即按字面意思理解,topk:取数组的前k个元素进行排序。通常该函数返回2个值,第一个值为排序的数组,第二个值为该数组中