Python 学习 第六篇:迭代和解析
Python中的迭代是指按照元素的顺序逐个调用的过程,迭代概念包括:迭代协议、可迭代对象和迭代器三个概念。
迭代协议是指有__next__()函数的对象会前进到下一个结果,而到达系列的末尾时,则会引发StopIteration异常。为了支持迭代协议,Python内置了两个函数:iter()和next()函数。iter()从可迭代对象中获得一个迭代器,迭代器含有next()函数。next()函数的作用就是调用对象的__next__()函数,从而递进进到下一项。
在Python中,任何支持迭代协议的对象都是可迭代的。如果对象是序列类型,或者在迭代工具中一次产生一个结果,那么就是可迭代的,这就以为着,序列(字符串、元组和列表)是可迭代对象。
迭代器是Python中实现迭代协议的对象,具体指的是iter()返回的,支持next()函数的对象。
Python中的迭代工具会自动调用iter()和next()函数以实现迭代,迭代工具主要有:for循环、列表解析、in成员关系测试以及map内置函数等。
一,手动迭代
列表不是自身的迭代器,对于这样的可迭代对象,可以调用iter()函数来启动迭代,调用next()函数递进到下一项:
>>> a=list(range(0,5))
>>> a is iter(a)
False
>>> a=iter(a)
>>> next(a)
0
像for循环等迭代工具,会自动调用iter()和next()函数,以实现序列的自动迭代:
>>> for i in range(0,5): print(i,end=' ')
0 1 2 3 4
二,生成器
生产器是一个延迟产生结果的工具,在需要的时候才产生结果,而不是立即产生结果。
1,生成器函数
Python提供了yield语句以实现生成器函数,以实现在需要的时候才产生结果,而不是立即产生结果。Python的生产器函数是指:编写为常规的def语句,但是使用yield语句,一次返回一个结果,在每个结果之间挂起和继续的状态。
生产器函数自动实现迭代协议,每次调用只返回一个值,下次调用时,会从其退出的地方继续执行。
生产器函数和常规函数的不同之处在于:生产器yield一个值,而不是return一个值。yield语句挂起该函数,并向调用者发送一个值,但是,保留足够的状态以使得函数能够从它离开的地方继续执行。当继续时,函数在上一个yield返回后继续执行。这使得生产器函数每次调用只返回一个值,穷尽调用会产生一系列的值。
>>> def seq_int(n):
for i in range(n):
yield i**2 >>> for i in seq_int(5):
print(i,end =' ') 0 1 4 9 16
生产器函数返回的对象就是迭代器,可以使用next()前进到下一项:
>>> func=seq_int(5)
>>> iter(func) is func
True
>>> next(func)
0
2,生产器表达式
另外一个实现生产器的对象是生产器表达式,从语法上讲,生成器表达式是在小括号中的表达式。从执行过程来讲,生产器表达式不在内存中构建结果,而是返回一个生成器对象,这个对象支持迭代协议。
>>> a=(x**2 for x in range(0,5))
>>> a is iter(a)
True
三,解析
解析分为列表解析,集合解析和字典解析。
- 列表解析的格式是:[ f(x) for x in seq ],对应的生成器表达式是:list( f(x) for x in seq )
- 集合解析的格式是:{ f(x) for x in seq },对应的生成器表达式是:set(f(x) for x in seq )
- 字典解析的格式是:{key:value for (key, value) in zip(keys,values)},对应的生成器表达式是:dict((x,f(x)) for x in items )
从语法上讲,列表解析是在中括号中的表达式;从执行过程来讲,列表解析对序列中的每一个元素执行一个操作;从执行的结果来讲,列表解析产生的一个新的列表对象。
由于列表解析产生的结果是一个列表对象,包含所有的序列项,不属于延迟产生结果的工具。
>>> a=[x**2 for x in range(0,5)]
>>> isinstance(a,list)
True
四,内置的迭代器函数
这一节,总结Python 3.0中内置的迭代器函数,除了range()函数之外,其余的函数都会产生迭代器对象,延迟产生结果。
1,range 迭代对象
range返回一个可迭代对象,该迭代对象根据需要产生范围中的数字,而不是在内存中构建一个列表。如果需要一个范围列表的话,必须使用list( range(...))来强制返回一个列表。
>>> r = range(0,5)
>>> iter(r) is r
False
>>> list(r)
[0, 1, 2, 3, 4]
>>> r=iter(r)
>>> next(r)
0
2,zip实现并行遍历
zip()函数用于合并序列,按照序列中元素的位置,把序列的元素组合成元组,元组项的数量就是zip合并的序列的个数。当序列的长度不同时,zip会以最短序列的长度为准来截断所得到的元组。
例如,zip把序列a和b合并为一个序列c,c的元素的元组(0,5),(1,6),(2,7),(3,8),(4,9)。
>>> a = range(0,5)
>>> b = range(5,10)
>>> c = zip(a,b)
>>> iter(c) is c
True
>>> next(c)
(0, 5)
>>> list(c)
[(1, 6), (2, 7), (3, 8), (4, 9)]
3,map对序列应用函数
map()函数对一个序列的各个元素应用函数,返回函数调用的结果序列。
>>> m=map(ord,'abcd')
>>> iter(m) is m
True
>>> list(m)
[97, 98, 99, 100]
4,产生偏移和元素
enumerate是Python内置的函数,作用于每一个序列项,获取每一个序列项偏移,并把偏移和序列项组合成元组(index, item)返回。原始序列的每个元素及其索引都能得到。
enumerate()函数返回一个迭代器对象,使用next()方法会返回下一个元素:
>>> t=enumerate('abcd')
>>> iter(t) is t
True
>>> list(t)
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
在for循环结构中,每次迭代,for循环都会自动调用next()函数以返回下一个元组(index,item):
>>> [c * i for (i,c) in enumerate('abcd')]
['', 'b', 'cc', 'ddd']
5,filter迭代器
filter()函数对一个序列的各个元素应用函数,返回结果为True的元素。
>>> f=filter(bool, ['a','','b',None])
>>> iter(f) is f
True
>>> list(f)
['a', 'b']
6,reduce() 函数
注意:reduce()函数并不是一个迭代器,它是functools模块中的一个工具函数。
reduce()用于对序列的元素依次应用函数,并把函数调用的结果作为参数传递给函数,最终返回函数调用的结果。
>>> from functools import reduce
>>> reduce((lambda x,y:x+y),range(0,5))
10
reduce()函数执行流程等价于下面的代码块:
x=list(range(0,5)]
res=x[0]
for i in x[1:] :
res+=i
参考文档:
Python 学习 第六篇:迭代和解析的更多相关文章
- Python学习第六篇——字典中的键和值
favorite_language ={ "jen":"python", "sarah":"c", "edwa ...
- Python学习笔记基础篇——总览
Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...
- Python 学习 第十篇 CMDB用户权限管理
Python 学习 第十篇 CMDB用户权限管理 2016-10-10 16:29:17 标签: python 版权声明:原创作品,谢绝转载!否则将追究法律责任. 不管是什么系统,用户权限都是至关重要 ...
- Python学习笔记进阶篇——总览
Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(Socket编程进阶&多线程.多进程) Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(异常处理) Pyth ...
- python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍
目录 python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍. 二丶列表,其它语言称为数组 1.列表的定义,以及语法 2.列表的使用,以及常用方法. 3.列表的常用操作 ...
- Python学习第六课
Python学习第六课 课前回顾 列表 创建 通过 [] :写在[]里,元素之间用逗号隔开 对应操作: 查 增 append insert 改(重新赋值) 删除(remove del pop(删除后会 ...
- Python学习笔记——基础篇【第七周】———类的静态方法 类方法及属性
新式类和经典类的区别 python2.7 新式类——广度优先 经典类——深度优先 python3.0 新式类——广度优先 经典类——广度优先 广度优先才是正常的思维,所以python 3.0中已经修复 ...
- Python学习笔记六
Python课堂笔记六 常用模块已经可以在单位实际项目中使用,可以实现运维自动化.无需手工备份文件,数据库,拷贝,压缩. 常用模块 time模块 time.time time.localtime ti ...
- Python 学习笔记---基础篇
1. 简单测试局域网中的电脑是否连通.这些电脑的ip范围从192.168.0.101到192.168.0.200 import subprocess cmd="cmd.exe" b ...
随机推荐
- sqlserver 将 “用 特定字符 分隔的一个字段” 拆分成多个字段,然后两个表之间数据更新
将源TXT文件sourceFile_table.txt导入数据库,生成新表dbo.sourceFile_table.新增字段lon.lat.shi.xian 源表dbo.sourceFile_tabl ...
- Android 接收系统广播(动态和静态)
1.标准广播:是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎会在同一时刻接收到这条广播信息,它们之间没有先后顺序.效率高.无法被截断. 2.有序广播:是一种同步执行的广播,在广播发出后 ...
- Django电商项目---完成订单页面day5
完成订单页面 创建订单项目 python manage.py startapp df_order manas/settings.py manas/urls.py 创建静态文件: templates/d ...
- 7z常用命令行&7z检测压缩包完整性&7z压缩包错误不执行rsync同步
7Z简介&常用命令 7Z脚本使用说明 7Z检测压缩包完整性脚本 7Z压缩包错误不执行Rsync脚本 1.7Z简介&常用命令 ⑴简介: 7z,全称7-Zip, 是一款开源软件.是目前公认 ...
- Django框架的使用教程--站点的管理[七]
Django的站点管理 创建超级管理员命令(密码要8位) python manage.py createsuperuser 进入站点管理 注册模型类 from django.contrib impor ...
- January 09th, 2018 Week 02nd Tuesday
Use the smile to change the world. Don't let the world change your smile. 用你的笑容去改变这个世界,别让这个世界改变了你的笑容 ...
- asp.net core 如何集成kindeditor并实现图片上传功能
准备工作 1.visual studio 2015 update3开发环境 2.net core 1.0.1 及以上版本 目录 新建asp.net core web项目 下载kindeditor ...
- [java大数据面试] 2018年4月百度面试经过+三面算法题:给定一个数组,求和为定值的所有组合.
给定一个数组,求和为定值的所有组合, 这道算法题在leetcode应该算是中等偏下难度, 对三到五年工作经验主要做业务开发的同学来说, 一般较难的也就是这种程度了. 简述经过: 不算hr面,总计四面, ...
- jweixin-1.1.0.js微信接口“分享给朋友”文字和图片配置
在npm官网找到了:微信官方 js-sdk CommonJS 版https://www.npmjs.com/package/weixin-js-sdk 步骤一:引入JS文件在需要调用JS接口的页面引入 ...
- kafka TimeoutException 超时问题解决
1.报错:: java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.NotLeaderForPartition ...