跟一些比较牛 X 的程序员交流,经常听到他们嘴里冒出一个不标准的英文单词,而 loop、iterate、traversal 和 recursion 如果不在其内,总觉得他还不够牛 X。当让,真正牛 X 的绝对不会这么说的,他们只是说“循环、迭代、遍历、递归”,然后再问“这个你懂吗?”。哦,这就是真正牛 X 的程序员。不过,他也仅仅是牛 X 罢了,还不是大神。大神程序员是什么样儿呢?他是扫地僧,大隐隐于市。

先搞清楚这些名词再说别的:

  • 循环(loop),指的是在满足条件的情况下,重复执行同一段代码。比如,while 语句。
  • 迭代(iterate),指的是按照某种顺序逐个访问列表中的每一项。比如,for 语句。
  • 递归(recursion),指的是一个函数不断调用自身的行为。比如,以编程方式输出著名的斐波纳契数列。
  • 遍历(traversal),指的是按照一定的规则访问树形结构中的每个节点,而且每个节点都只访问一次。

对于这四个听起来高深莫测的词汇,其实前面,已经涉及到了一个——循环(loop),本节主要介绍一下迭代(iterate),看官在网上 google,就会发现,对于迭代和循环、递归之间的比较的文章不少,分别从不同角度将它们进行了对比。这里暂不比较,先搞明白 python 中的迭代。

逐个访问

在 python 中,访问对象中每个元素,可以这么做:(例如一个 list)

>>> lst
['q', 'i', 'w', 's', 'i', 'r']
>>> for i in lst:
...     print i,
...
q i w s i r

除了这种方法,还可以这样:

>>> lst_iter = iter(lst)    #对原来的 list 实施了一个 iter()
>>> lst_iter.next()         #要不厌其烦地一个一个手动访问
'q'
>>> lst_iter.next()
'i'
>>> lst_iter.next()
'w'
>>> lst_iter.next()
's'
>>> lst_iter.next()
'i'
>>> lst_iter.next()
'r'
>>> lst_iter.next()
Traceback (most recent call last):File "<stdin>", line 1, in <module>
StopIteration

iter()是一个内建函数,其含义是:

上面的 next()就是要获得下一个元素,但是做为一名优秀的程序员,最佳品质就是“懒惰”,当然不能这样一个一个地敲啦,于是就:

>>> while True:
...     print lst_iter.next()
...
Traceback (most recent call last):      #居然报错,而且错误跟前面一样?什么原因File "<stdin>", line 2, in <module>
StopIteration

先不管错误,再来一遍。

>>> lst_iter = iter(lst)                #上面的错误暂且搁置,回头在研究
>>> while True:
...     print lst_iter.next()
...
q                                       #果然自动化地读取了
i
w
s
i
r
Traceback (most recent call last):      #读取到最后一个之后,报错,停止循环File "<stdin>", line 2, in <module>
StopIteration

首先了解一下上面用到的那个内置函数:iter(),官方文档中有这样一段话描述之:

iter(o[, sentinel])

Return an iterator object. The first argument is interpreted very differently depending on the presence of the second argument. Without a second argument, o must be a collection object which supports the iteration protocol (the iter() method), or it must support the sequence protocol (the getitem() method with integer arguments starting at 0). If it does not support either of those protocols, TypeError is raised. If the second argument, sentinel, is given, then o must be a callable object. The iterator created in this case will call o with no arguments for each call to its next() method; if the value returned is equal to sentinel, StopIteration will be raised, otherwise the value will be returned.

大意是说...(此处故意省略若干字,因为我相信看此文章的看官英语水平是达到看文档的水平了,如果没有,也不用着急,找个词典什么的帮助一下。)

尽管不翻译了,但是还要提炼一下主要的东西:

  • 返回值是一个迭代器对象
  • 参数需要是一个符合迭代协议的对象或者是一个序列对象
  • next() 配合与之使用

什么是“可迭代的对象”呢?在前面学习的时候,曾经提到过,如果忘记了请往前翻阅。

一般,我们常常将哪些能够用诸如循环语句之类的方法来一个一个读取元素的对象,就称之为可迭代的对象。那么用来循环的如 for 就被称之为迭代工具。

用严格点的语言说:所谓迭代工具,就是能够按照一定顺序扫描迭代对象的每个元素(按照从左到右的顺序)。

显然,除了 for 之外,还有别的可以称作迭代工具。

那么,刚才介绍的 iter() 的功能呢?它与 next() 配合使用,也是实现上述迭代工具的作用。

在 Python 中,甚至在其它的语言中,迭代这块的说法比较乱,主要是名词乱,刚才我们说,那些能够实现迭代的东西,称之为迭代工具,就是这些迭代工具,不少程序员都喜欢叫做迭代器。当然,这都是汉语翻译,英语就是 iterator。

看官看上面的所有例子会发现,如果用 for 来迭代,当到末尾的时候,就自动结束了,不会报错。如果用 iter()...next() 迭代,当最后一个完成之后,它不会自动结束,还要向下继续,但是后面没有元素了,于是就报一个称之为 StopIteration 的错误(这个错误的名字叫做:停止迭代,这哪里是报错,分明是警告)。

看官还要关注 iter()...next() 迭代的一个特点。当迭代对象 lst_iter 被迭代结束,即每个元素都读取了一遍之后,指针就移动到了最后一个元素的后面。如果再访问,指针并没有自动返回到首位置,而是仍然停留在末位置,所以报 StopIteration,想要再开始,需要重新载入迭代对象。所以,当我在上面重新进行迭代对象赋值之后,又可以继续了。这在 for 等类型的迭代工具中是没有的。

文件迭代器

现在有一个文件,名称:208.txt,其内容如下:

Learn python with qiwsir.
There is free python course.
The website is:
http://qiwsir.github.io
Its language is Chinese.

用迭代器来操作这个文件,我们在前面讲述文件有关知识的时候已经做过了,无非就是:

>>> f = open("208.txt")
>>> f.readline()        #读第一行
'Learn python with qiwsir.\n'
>>> f.readline()        #读第二行
'There is free python course.\n'
>>> f.readline()        #读第三行
'The website is:\n'
>>> f.readline()        #读第四行
'http://qiwsir.github.io\n'
>>> f.readline()        #读第五行,也就是这真在读完最后一行之后,到了此行的后面
'Its language is Chinese.\n'
>>> f.readline()        #无内容了,但是不报错,返回空。
''

以上演示的是用 readline() 一行一行地读。当然,在实际操作中,我们是绝对不能这样做的,一定要让它自动进行,比较常用的方法是:

>>> for line in f:     #这个操作是紧接着上面的操作进行的,请看官主要观察
...     print line,    #没有打印出任何东西
... 

这段代码之所没有打印出东西来,是因为经过前面的迭代,指针已经移到了最后了。这就是迭代的一个特点,要小心指针的位置。

>>> f = open("208.txt")     #从头再来
>>> for line in f:
...     print line,
...
Learn python with qiwsir.
There is free python course.
The website is:
http://qiwsir.github.io
Its language is Chinese.

这种方法是读取文件常用的。另外一个 readlines() 也可以。但是,需要有一些小心的地方,看官如果想不起来小心什么,可以在将关于文件的课程复习一边。

上面过程用 next() 也能够读取。

>>> f = open("208.txt")
>>> f.next()
'Learn python with qiwsir.\n'
>>> f.next()
'There is free python course.\n'
>>> f.next()
'The website is:\n'
>>> f.next()
'http://qiwsir.github.io\n'
>>> f.next()
'Its language is Chinese.\n'
>>> f.next()
Traceback (most recent call last):File "<stdin>", line 1, in <module>
StopIteration

如果用 next(),就可以直接读取每行的内容。这说明文件是天然的可迭代对象,不需要用 iter() 转换了。

再有,我们用 for 来实现迭代,在本质上,就是自动调用 next(),只不过这个工作,已经让 for 偷偷地替我们干了,到这里,列位是不是应该给 for 取另外一个名字:它叫雷锋。

还有,列表解析也能够做为迭代工具,在研究列表的时候,看官想必已经清楚了。那么对文件,是否可以用?试一试:

>>> [ line for line in open('208.txt') ]
['Learn python with qiwsir.\n', 'There is free python course.\n', 'The website is:\n', 'http://qiwsir.github.io\n', 'Its language is Chinese.\n']

至此,看官难道还不为列表解析所折服吗?真的很强大,又强又大呀。

其实,迭代器远远不止上述这么简单,下面我们随便列举一些,在 Python 中还可以这样得到迭代对象中的元素。

>>> list(open('208.txt'))
['Learn python with qiwsir.\n', 'There is free python course.\n', 'The website is:\n', 'http://qiwsir.github.io\n', 'Its language is Chinese.\n']>>> tuple(open('208.txt'))
('Learn python with qiwsir.\n', 'There is free python course.\n', 'The website is:\n', 'http://qiwsir.github.io\n', 'Its language is Chinese.\n')>>> "$$$".join(open('208.txt'))
'Learn python with qiwsir.\n$$$There is free python course.\n$$$The website is:\n$$$http://qiwsir.github.io\n$$$Its language is Chinese.\n'>>> a,b,c,d,e = open("208.txt")
>>> a
'Learn python with qiwsir.\n'
>>> b
'There is free python course.\n'
>>> c
'The website is:\n'
>>> d
'http://qiwsir.github.io\n'
>>> e
'Its language is Chinese.\n'

上述方式,在编程实践中不一定用得上,只是向看官展示一下,并且看官要明白,可以这么做,不是非要这么做。

python学习笔记(六)循环、迭代相关推荐

  1. Python学习笔记六——画小猪佩奇

    目录 Python学习笔记六--画小猪佩奇 画布 画笔 属性设置 操纵命令 运动命令 画笔控制命令 全局控制命令 其他命令 Python学习笔记六--画小猪佩奇 使用Python的turtle库可以绘 ...

  2. Python学习笔记——for循环和range函数

    Python学习笔记--for循环和range函数 Python的for循环 for 目标 in 表达式 :循环体 案例一 >>> example = 'abcdef' >&g ...

  3. Python学习笔记(六)

    1. IO编程 1.1 文件读写 1.2 StringIO和BytesIO 1.3 操作文件和目录 1.4 序列化 2. 进程和线程 2.1 多进程 2.2 多线程 2.3 ThreadLocal 2 ...

  4. Python学习笔记:循环语句

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  5. 【懒懒的Python学习笔记六】

    大多数程序旨在最终解决用户问题,为此通常需要从用户那里输入信息,在本章学习中,我们将学习Python的raw_input()函数接受用户输入以及学习while循环来控制程序的运行. 函数raw_inp ...

  6. python学习笔记二— 循环

    程序结构 •三种结构◾顺序 ◾循环 ◾分支 分支结构 •分支结构基本语法◾if (如果) 条件表达式: ◾语句1 ◾语句2 ◾语句3 ◾- •条件表达式就是计算机结果必须为 布尔值 的表达式 •表达式 ...

  7. python学习笔记六 初识面向对象上(基础篇)

    python面向对象 面向对象编程(Object-Oriented Programming )介绍 对于编程语言的初学者来讲,OOP不是一个很容易理解的编程方式,虽然大家都知道OOP的三大特性是继承. ...

  8. Python 学习笔记9 循环语句 For in

    For in 循环主要适用于遍历一个对象中的所有元素.我们可以使用它遍历列表,元组和字典等等. 其主要的流程如下:(图片来源于: https://www.yiibai.com/python/pytho ...

  9. Python学习笔记六(Python time模块)

    通过python time模块提供的函数和方法可以获取与时间相关的操作,例如:获取系统时间,统计程序执行时间,WEB程序的响应时间等. 1)time.time(),该函数返回从1970年1月1日0点0 ...

  10. Python学习笔记(六)Python基础_数据类型——字符串

    文章目录 字符串 字符串输入 字符串拼接 字符串操作 字符串格式化 访问字符串中的值 字符串切片 字符串遍历 常用的字符串方法 字符串 字符串是 Python 中最常用的数据类型:一般以使用引号' ' ...

最新文章

  1. intellij_我最喜欢的IntelliJ IDEA功能
  2. SAP CRM WebClient UI session restart
  3. android弹窗不能手动关闭_vue3.0系列:Vue3自定义PC端弹窗组件V3Layer
  4. Loadrunner进行HTTPS协议性能测试
  5. [改善Java代码]枚举项的数量限制在64个以内
  6. js赋值时特殊字符完美处理方案
  7. java 正则表达式 替换 html,java 正则表达式 替换 html
  8. 规范并优化Nginx配置文件
  9. APP支付(微信、支付宝)
  10. 微信小程序连接低功率蓝牙控制单片机上硬件设备
  11. java使用httpclient简单模拟登陆微信公众开放平台
  12. Oracle Data Integrator(ODI)简介
  13. 《数据结构》 李春葆 第一章-绪论
  14. 零基础入门金融风控-贷款违约预测
  15. leetcode 1647
  16. ES module和commonJS循环引用问题
  17. linux-系统日志文件
  18. 计算机硬件交通灯课程设计,交通灯计算机硬件课程设计(附件).doc
  19. Python3,异常进阶写法之retrying。
  20. Linux内核分析(七)系统调用execve处理过程

热门文章

  1. 蓝桥杯 试题 入门训练 序列求和——6行代码AC
  2. [leetcode]剑指offer32-1.从上到下打印二叉树
  3. 对肺结节几何矩的特征提取
  4. Java与C、C++的区别
  5. java队列课程_Java 实例 – 队列(Queue)用法
  6. oracle json字符串转数组,json字符串转化成json对象(原生方法)
  7. CiscoOSPF的选路原理
  8. JAVA 串口编程 (一)
  9. 计算机应用基础第二版在线作业c,计算机应用基础作业二(答案)
  10. 怎么在数据库服务器解压文件,数据库服务器9怎么解压