python生成器迭代_二十、深入Python迭代器和生成器

「@Author:Runsen」

学习python的过程中,迭代器与生成器是绕不开的话题, 什么是迭代器和生成器呢?

下面我们来了解一下什么是迭代。但在了解迭代器之前,首先需要知道什么是容器。

容器

正所谓:一切都是对象,对象的抽象就是类,而对象的集合就是容器。

容器,就是有多个对象组成的东西。

比如:列表[0,1,2],元组(1,2,3),字典{’0:'0','1':"1'}集合{1,2,3}都是容器。

「所有的容器都是可迭代对象,也就是可以使用for循环遍历元素。」

# 1、for 循环迭代字符串, 字符串之间使用空格连接

for char in 'RUNSEN':

print(char, end=' ')

输出如下:

R U N S E N

# 2、for 循环迭代 list 列表,列表元素之间使用空格连接

list1 = [i for i in range(5)]  # 这里使用了列表生成表达式

for num in list1:

print(num, end=' ')

输出如下:

0 1 2 3 4

# 3、for 循环迭代 dict (字典)

dict = {'name': 'Runsen', 'age': '21', 'sex': '男'}

# 迭代 dict 中的 key(默认是迭代key)

for key in dict:

print(key, end=' ')

for value in dict.values():

print(value, end=' ')

输出如下:

name age sex

Runsen 21 男

# 4、list 中一个元素中还有多个元素

for x, y in [(1, 'a'), (2, 'b'), (3, 'c')]:

print(x, y)

输出如下:

1 a

2 b

3 c

可迭代对象

所有的容器都是可迭代对象(iterable),从专业角度来讲,只要:内部含有__iter__方法的对象,就是可迭代对象。

因此,我只要使用print('__iter__' in dir(XX)),就能判断XX是不是可迭代对象。

人们常说:列表、元组、字典、字符串都是可迭代对象。数字、布尔值都是不可迭代的。我一试便知。

list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定)

print('__iter__' in dir(list))

print('__iter__' in dir(tuple))

print('__iter__' in dir(dict))

print('__iter__' in dir(set))

print('__iter__' in dir(str))

print('__iter__' in dir(int))

print('__iter__' in dir(bool))

print('__iter__' in dir([1,2,3]))

输出如下:

True

True

True

True

True

False

False

True

除了print('__iter__' in dir(XX))判断是不是可迭代对象。还是一种通过Iterable和isinstance方法联合使用,进行判断。

from collections import Iterable

print(isinstance('abc', Iterable))

print(isinstance({1, 2, 3}, Iterable))

print(isinstance(1, Iterable))

输出如下:

True

True

False

「注意:list,string,tuple,dict 都属于可迭代对象,但不是迭代器」

迭代器

迭代器(iterator)只是提供了一个 next 的方法。调用这个方法后,你要么得到这个可迭代对象的下一个对象,要么得到一个 StopIteration的错误。

那么,如何声明一个可迭代对象,可以通过__iter__() 来生成可迭代对象,前提是__iter__()传入的参数是容器。

你看下图iter(111)是不是报错了。

43763b46629072acff67f400127b4153.png

因为111不能遍历,所以iter(111)直接报错。

取值

上面说过:迭代器提供了一个next方法,调用这个方法,得到了容器的下一个对象或者一个stopiteration 的报错,具体代码如下所示。

>>>a = iter("123")

>>>next(a)

'1'

>>>next(a)

'2'

>>>next(a)

'3'

>>>next(a)

Traceback (most recent call last):

File "", line 1, in 

StopIteration

生成器

那么什么又是生成器,和迭代器又有什么关系?

其实,生成器也是迭代器,但更加优雅。使用生成器,我们可以实现与迭代器相同的功能,但不必在类中编写iter()和next()函数

「我觉得生成器就是一个迭代器的例子。」,如果说迭代器是人,那么生成器就人中的一类人,比如黄人。

为什么会出来一个生成器,其实很简单声明一个迭代器很简单,但是很容易造成内存不够。生成器不会将集合中所有的元素都加载到内存。

比如下图(i for i in range(1000000000)通过元组方式生成生成器。如果使用迭代器,那么当声明迭代器就运行不了了。

7985049729db2f1dfd2d78ef83c9b4c9.png

5fb87fa49aba6da6ef151d5cf3f0a55a.png

[i for i in range(1000000000] 它本是一个迭代器,但因占用的内存太大了,跑不起来,于是古人引出了生成器的概念,当你用的时候,再加载到内存空间中。

在声明生成器中,还有一种方法通过yield关键字。

yield和return的区别在于yield并没有终止函数,而return返回值后不再执行函数内代码。

对于yield,在scrapy用的多,然后我在其他地方没有见到过。

引用yield,带yield的函数就叫做生成器,具体示例如下所示。

def test():

yield 1

yield 2

yield 3

t = test()

print(next(t))#output:1

print(next(t))#output:2

print(next(t))#output:3

print(next(t))#output:Traceback (most recent call last):StopIteration

今天也学到了很多东西呢,明天有什么新知识呢?真期待鸭。如果喜欢文章可以关注我哦~

本文已收录 GitHub,传送门~[1] ,里面更有大厂面试完整考点,欢迎 Star。

Reference

[1]

传送门~: https://github.com/MaoliRUNsen/runsenlearnpy100

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

批改网禁止粘贴怎么破_重大利好!教育部声明,要求家长批改作业等行为,发现一起严处一起...

前段时间,在江苏一位家长发布短视频,他在视频中怒喊:我就退出家长群怎么了!引起网上一阵热议起因是这位家长认为老师总是让家长帮忙批改作业,自己承担了太多教师应负的责任,完了还要昧着良心说老师你辛苦了…

mysql实验步骤_MySQL双方配置实验步骤

实验环境:两台MariaDB服务器,IP分别为: 172.16.2.16 和 172.16.2.17MariaDB的版本是5.5.36,使用二进制方式安装。已安装完成。/mydata/data 数据库文件存放目录/mydata/binlog/ 二进制日志文件存放位置/mydata/relaylog/ 中继日志…

mac 系统安装 eclipse 方法

经过好几天的折腾,终于在各种不靠谱的经验、说明的忽悠中把自己心爱的 mac 安装上了 eclipse,看到别人的不靠谱,我决定自己写一篇经验,为了大家能够不走我这么多的弯路,也为了自己将来可以回来看看,下次安装…

python自动化和教程_《手把手教你》系列练习篇之2-python+ selenium自动化测试(详细教程)...

1. 简介今天我们还是继续练习练习基本功,各位小伙伴要耐住住性子,要耐得住寂寞啊,不要急躁,后面你会感谢你在前边的不断练习的。到后面也是检验你前边的学习成果的一次很好实践。本文介绍如何通过link text、partial link text、c…

异常在哪一层处理_WiFi速度慢,信号不稳定,除了重启路由器外,自己能怎么处理?...

前言WiFi出了故障,速度慢,信号不稳定,自己处理,除了重启路由器,也没有什么别的招了;好在这万能重启,差不多能解决一大半的小故障;那信号不好,速度慢,不稳定&a…

linux运维、架构之路-HAProxy反向代理

一、HAProxy介绍 专业反向代理,支持双机热备支持虚拟主机,配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端节点出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入,基于TCP和HTTP应用的代理软件,开源免费、快速并且可靠的…

CSS3 3D transform变换

transform的坐标是需要了解的特性。 我们的rotateX,rotateY,rotateZ,和translateX,translateY等都是基于相同的坐标系来定位的。 3D的坐标如下入所示: 3D transform中有下面这三个方法: rotateX( angle )rotateY( angle )rotateZ( angle )理解了这三个方…

vba结束本次循环进行下次_VBA掌握循环结构,包你效率提高500倍

这是系列免费教程《Excel VBA:办公自动化》,还是老规矩,看看我们走到哪里了。1.认识VBA:什么是VBA?2.这些掌握了,你才敢说自己懂VBA3.VBA变量5年踩坑吐血精华总结4.VBA中重要的强制申明,谁看谁明…

CefSharp 支持MP4

效果图: 下载链接:https://share.weiyun.com/d1e249ef5c56b4d909b2124dc2dd8902 创建Wpf项目引用 如下: 第一步:创建项目引用CefSharp 第二步:将DLL拷贝到运行项目的Debug下 第三步:项目平台设置32位 第四…

ReentrantLock 分析

带着疑问去分析 ReentrantLock是如何实现锁管理的。ReentrantLock是如何实现重入的。ReentrantLock是如何实现公平锁与非公平锁。ReentantLock的公平锁为什么一般情况下性能都比公平锁查。ReentrantLock数据结构 ReentrantLock的底层是借助于AbstractQueuedSynchronizer实现的&…

v4l2 框架下如何设置分辨率_Linux下如何进行FTP设置

目录: 一、Redhat/CentOS安装vsftp软件二、Ubuntu/Debian安装vsftp软件一、Redhat/CentOS安装vsftp软件1.更新yum源yum update -y2.安装vsftpyum install vsftpd -y3.修改配置文件vi /etc/vsftpd/vsftpd.conf # 原有初始配置 local_umask022 dirmessage_enableYES x…

2017-2018-1 20155213 《信息安全系统设计基础》第十一周学习总结

2017-2018-1 20155213 《信息安全系统设计基础》第十一周学习总结 【学习内容:第九章——虚拟存储器】 一、课本内容梳理 1.虚拟存储器 作用: 将主存看作是一个存储在磁盘上的地址空间的高速缓存,在主存中只保护活动的区域,并根据需要在磁盘和…

vscode弹出cmd_先看看 VS Code Extension 知识点,再写个 VS Code 扩展玩玩

TL;DR文章篇幅有点长 ,可以先收藏再看 。要是想直接看看怎么写一个扩展,直接去第二部分 ,或者直接去github看源码 。第一部分 --- Extension 知识点一、扩展的启动如何保证性能 --- 扩展激活(Extension Activation) 我…

webp转换gif_用 WebP 创建尺寸更小、细节更丰富的图片,以此来提高网站的速度...

WebP 文件格式是一种基于 RIFF(资源互换文件格式)的文档格式。WebP 是 2010 年 Google 开发的一种图片格式,它为网页上的图片提供了卓越的无损和有损压缩。网站开发者们可以使用 WebP 来创建尺寸更小、细节更丰富的图片,以此来提高网站的速度。更快的加载…

python 如何判断excel单元格为空_如何用python处理excel(二)

读取excelimport xlrdworkbookxlrd.open_workbook(rC:\Users\Desktop\hebing\学生登记表.xls)sheetworkbook.sheet_by_index(0)#根据序列号来打开某一个sheetrowsheet.nrows#将excel的行数赋值给变量colsheet.ncols#将excel的列数赋值给变量print(sheet.cell_value(1,0))#打印出…

web前端到底是什么?有前途吗

web前端到底是什么? 某货: “前几年前端开发人员鱼目混杂,技术参差不齐,相对学习起来不规范,导致> 前端开发人员聚集,所以现在前端工种和工资还是没得到普遍重视,但近2年来,> …

此加载项为此计算机的所有用户安装_MDI Jade 6.5软件安装教程

软件下载▼关注微信公众号:贵州永航科技回复Jade即可获得软件安装包下载地址以及详细安装教程更多软件安装教程可点击菜单栏获取软件介绍MDI Jade是一款专门用于XRD分析的软件,XRD分析就是X射线衍射分析,MDI Jade通过对材料进行X射线衍射&…

java 线程定时器_Java线程之Timer定时器

定时/计划功能主要使用的就是Timer对象,它在内部还是使用多线程的方式进行处理,所以它和线程技术还是有非常大的关联。Timer类主要作用就是设置计划任务,但封装任务的类却是TimerTask类。TimerTask类是一个抽象类。执行任务的时间晚于当前时间…

vscode 写vue 没有js提示_如何用VSCode实现一个vue.js项目?

1,新建项目打开Visual studio code打开一个你想要创建项目的文件夹打开集成终端:查看 –> 集成终端 或者直接按 ctrl\ 如果没有安装vue-cli,在终端输入:npm install \-g vue-cli全局安装vue-cli然后新建项目vue init webpack projectNamep…

python有没有类似unity3d_像web一样使用python

使用传统的web开发技术,也就是htmljs,然后搭配一个后端语言,已经成为当今web开发的固定模式了,为此也形成了众多的toolkit,譬如ror,django,各种js图形库更是玲琅满目,从非常大程度上也加速了开发过程.但传统web应用也非常自然地有一些诟病,有些特殊效果,c端能够轻而易举地完毕,…