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返回后继续执行。这使得生产器函数每次调用只返回一个值,穷尽调用会产生一系列的值。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> 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(…))来强制返回一个列表。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> 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()方法会返回下一个元素:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> 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的元素。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> 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基础教程:列表解析

    Python中的解析 Python支持各种解析(comprehension)操作,比如列表解析.集合解析.元组解析.字典解析.它们根据某些元素来创建(推导)出一个新的列表.集合.元组.字典等.所以有的 ...

  2. 什么是python基础教程-python基础教程之python是什么?概念解析

    Python,是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. Python是纯粹的自由软件, 源代码和解释器CP ...

  3. python基础教程电子版-Python基础教程(第2版 修订版) pdf

    Python基础教程(第2版 修订版) 目录 D11章快速改造:基础知识1 1.1安装Python1 1.1.1Windows1 1.1.2Linux和UNIX3 1.1.3苹果机(Macintosh ...

  4. python基本代码教程-Python基础教程(第3版)

    Python基础教程(第3版) 第2版前言 第1版前言 引言 1 快速上手:基础知识 1.1 交互式解释器 1.2 算法是什么 1.3 数和表达式 十六进制.八进制和二进制 1.4 变量 1.5 语句 ...

  5. python基础教程免费下载-Python基础教程(第2版)

    <Python基础教程(第2版)>内容涉及的范围较广,既能为初学者夯实基础,又能帮助程序员提升技能,适合各个层次的Python开发人员阅读参考.<Python基础教程(第2版)> ...

  6. python黑马教程ppt_,python基础教程 PPT

    python基础教程 PPT Python我这里有Python编开发,进阶,化,实战等系列视频教程,还有安装包,素材,代码内容,这里就不一一说了,全套内容一共300G左右,非常的详细,需要的请到网盘下 ...

  7. python基础教程免费下载-Python基础教程第三版PDF电子书免费下载

    <Python基础教程(第3版)>是2018年人民邮电出版社出版的图书,作者是[挪]Magnus Lie Hetland.该书全面介绍了Python的基础知识和基本概念,包括列表.元组.字 ...

  8. Python基础教程-菜鸟教程学习笔记1

    Python基础教程-菜鸟教程学习笔记1 文章目录 Python基础教程-菜鸟教程学习笔记1 前言 Python 简介 1. 第一个Python程序 2. Python 中文编码 3. 基本语法 1) ...

  9. python办公自动化知识点_Python自动化办公知识点整理汇总|python基础教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ 知乎上有人提问:用python进行办公自动化都需要学习什么知识呢? ​ 这可能是很多非IT职场人士面临的困 ...

  10. Python基础教程(第2版 修订版) pdf

    Python基础教程(第2版 修订版) 目录 D11章快速改造:基础知识1 1.1安装Python1 1.1.1Windows1 1.1.2Linux和UNIX3 1.1.3苹果机(Macintosh ...

最新文章

  1. 实例方法-扩展器-生命zhou
  2. Activiti 简易教程一 version5.10
  3. 智能雷达物位计说明书_?浅谈人工检尺法和雷达液位计在油罐液位测量中的应用...
  4. Photoshop CC 2019多边形形的抠图
  5. 一个想法:利用VHD部署系统
  6. Unity Shader 记录
  7. [Stage3D]硬件加速的径向模糊
  8. SQL Server查询结果插入表
  9. python中安装pip_Python中如何安装pip-百度经验
  10. 车牌识别的matlab程序(程序_讲解_模板),车牌识别的matlab程序(程序-讲解-模板)资料...
  11. Windows Server 2016安装SCCM2019
  12. 上传文件到服务器太大怎么办,超大文件怎么上传到云服务器
  13. MapWinGIS4.9.3的二次开发
  14. ASP.NET MVC5 实现基于Quartz.NET任务调度
  15. MySQL【数据类型】
  16. Android facebook KeyHash生成(生成发布密钥散列)
  17. ATFX:离岸人民币破6.9,距离整数关口7仅一步之遥
  18. 学习JS,实现自动打字机动效
  19. 下拉框系统甄选火星推荐_微博下拉框技术首荐15火星牛
  20. 计算机专业大学学习规划,计算机专业大学学生的学习规划.doc

热门文章

  1. 向大家推荐一个.Net游戏引擎:Artificial Engines
  2. memcached全面剖析--3.memcached的删除机制和发展方向
  3. H5开发开发利器——flex
  4. Spring AOP之异常转换
  5. oracle中导入导出数据备份数据库
  6. 还有多少时间可以用来读书
  7. php两个数组去掉相同的,php如何删除两个数组中相同的数据
  8. python连接数据库的技术_Python操作MySQL数据库的三种方法
  9. 非库存采购的自动记帐
  10. BSP(BUSINESS SERVER PAGES)完整主机名设置及实现