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 学习 第六篇:迭代和解析的更多相关文章

  1. Python学习第六篇——字典中的键和值

    favorite_language ={ "jen":"python", "sarah":"c", "edwa ...

  2. Python学习笔记基础篇——总览

    Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...

  3. Python 学习 第十篇 CMDB用户权限管理

    Python 学习 第十篇 CMDB用户权限管理 2016-10-10 16:29:17 标签: python 版权声明:原创作品,谢绝转载!否则将追究法律责任. 不管是什么系统,用户权限都是至关重要 ...

  4. Python学习笔记进阶篇——总览

    Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(Socket编程进阶&多线程.多进程) Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(异常处理) Pyth ...

  5. python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍

    目录 python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍. 二丶列表,其它语言称为数组 1.列表的定义,以及语法 2.列表的使用,以及常用方法. 3.列表的常用操作 ...

  6. Python学习第六课

    Python学习第六课 课前回顾 列表 创建 通过 [] :写在[]里,元素之间用逗号隔开 对应操作: 查 增 append insert 改(重新赋值) 删除(remove del pop(删除后会 ...

  7. Python学习笔记——基础篇【第七周】———类的静态方法 类方法及属性

    新式类和经典类的区别 python2.7 新式类——广度优先 经典类——深度优先 python3.0 新式类——广度优先 经典类——广度优先 广度优先才是正常的思维,所以python 3.0中已经修复 ...

  8. Python学习笔记六

    Python课堂笔记六 常用模块已经可以在单位实际项目中使用,可以实现运维自动化.无需手工备份文件,数据库,拷贝,压缩. 常用模块 time模块 time.time time.localtime ti ...

  9. Python 学习笔记---基础篇

    1. 简单测试局域网中的电脑是否连通.这些电脑的ip范围从192.168.0.101到192.168.0.200 import subprocess cmd="cmd.exe" b ...

随机推荐

  1. sqlserver 将 “用 特定字符 分隔的一个字段” 拆分成多个字段,然后两个表之间数据更新

    将源TXT文件sourceFile_table.txt导入数据库,生成新表dbo.sourceFile_table.新增字段lon.lat.shi.xian 源表dbo.sourceFile_tabl ...

  2. Android 接收系统广播(动态和静态)

    1.标准广播:是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎会在同一时刻接收到这条广播信息,它们之间没有先后顺序.效率高.无法被截断. 2.有序广播:是一种同步执行的广播,在广播发出后 ...

  3. Django电商项目---完成订单页面day5

    完成订单页面 创建订单项目 python manage.py startapp df_order manas/settings.py manas/urls.py 创建静态文件: templates/d ...

  4. 7z常用命令行&7z检测压缩包完整性&7z压缩包错误不执行rsync同步

    7Z简介&常用命令 7Z脚本使用说明 7Z检测压缩包完整性脚本 7Z压缩包错误不执行Rsync脚本 1.7Z简介&常用命令 ⑴简介: 7z,全称7-Zip, 是一款开源软件.是目前公认 ...

  5. Django框架的使用教程--站点的管理[七]

    Django的站点管理 创建超级管理员命令(密码要8位) python manage.py createsuperuser 进入站点管理 注册模型类 from django.contrib impor ...

  6. January 09th, 2018 Week 02nd Tuesday

    Use the smile to change the world. Don't let the world change your smile. 用你的笑容去改变这个世界,别让这个世界改变了你的笑容 ...

  7. asp.net core 如何集成kindeditor并实现图片上传功能

     准备工作 1.visual studio 2015 update3开发环境 2.net core 1.0.1 及以上版本  目录 新建asp.net core web项目 下载kindeditor ...

  8. [java大数据面试] 2018年4月百度面试经过+三面算法题:给定一个数组,求和为定值的所有组合.

    给定一个数组,求和为定值的所有组合, 这道算法题在leetcode应该算是中等偏下难度, 对三到五年工作经验主要做业务开发的同学来说, 一般较难的也就是这种程度了. 简述经过: 不算hr面,总计四面, ...

  9. jweixin-1.1.0.js微信接口“分享给朋友”文字和图片配置

    在npm官网找到了:微信官方 js-sdk CommonJS 版https://www.npmjs.com/package/weixin-js-sdk 步骤一:引入JS文件在需要调用JS接口的页面引入 ...

  10. kafka TimeoutException 超时问题解决

    1.报错:: java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.NotLeaderForPartition ...