2e194343d5202c0f0c0fd927e3fac9d7
零基础学习 Python 之初识迭代

写在之前

在前面的文章中很多次的提到「迭代」 这个词,但是一直没有专门去写它,那么今天终于把它排上号了。当然了,迭代的这个话题要真的认真说起来的话会很多,本着循序渐进的原则,本篇文章先介绍比较初级的。

准备

在学习迭代之前,我们先来搞清楚下面这些名词:

1.循环(loop)

循环是指在满足条件的情况下,重复执行同一段代码,比如我们之前学过的 while 语句,忘记的请看这篇文章 — 零基础学习 Python 之 while 循环语句

2.迭代(Iterate)

迭代是指按照某种顺序逐个访问对象中的每一项,比如我们之前学过的 for 语句,忘记的请看这篇文章 — 零基础学习 Python 之 for 循环语句

3.递归(recursion)

递归是指一个函数不断调用自身的行为,比如我们很熟悉的斐波那契数列,如果不熟悉请自行搜索,很简单的。

4.遍历(traversal)

遍历是指按照一定的规则访问树形结构中的每个节点,而且每个节点都只访问一次,其实 for 循环就是一种遍历,至于什么是树形结构,emmmm…不是我们在这里讨论的重点。

上述的四个词可能看起来有点高深莫测,其实我们在前面已经讲过关于循环的内容,你要是在网上搜过的话,你会发现网上充斥着大量的讲关于迭代,循环和递归区别的文章,这里我们暂时先不比较,我们在本篇文章中先搞明白 Python 中的迭代。

逐个访问

在 Python 中,如果你想要访问对象中的每个元素,可以像下面这样做,我在这以列表举例:

>>> my_list = ['r','o','c','k','y']
>>> for i in my_list:
...    print(i,end=' ')
... 
r o c k y 
>>>

除了上述方法以外,还可以像下面这样:

>>> my_iter = iter(my_list)
>>> my_iter.__next__()
'r'
>>> my_iter.__next__()
'o'
>>> my_iter.__next__()
'c'
>>> my_iter.__next__()
'k'
>>> my_iter.__next__()
'y'
>>> my_iter.__next__()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
StopIteration

上面的 iter() 是一个内建函数,返回的就是一个迭代器对象,我在后面会专门再讲迭代器。

在 Python3 中,所有的迭代器对象都有 next() 方法,迭代器,当然是可迭代的,在上面的例子中,next() 就是要获得下一个对象,但是作为一个 “懒惰” 的程序员来说,上面的那种方法一个个的敲太麻烦了,所以就有了下面的方法:

>>> while True:
...    print(my_iter.__next__())
... 
Traceback (most recent call last):
 File "<stdin>", line 2, in <module>
StopIteration

上面出现了错误,我们先不管,再来它一次:

>>> my_iter = iter(my_list)
>>> while True:
...    print(my_iter.__next__())
... 
r
o
c
k
y
Traceback (most recent call last):
 File "<stdin>", line 2, in <module>
StopIteration

看了上面演示的例子可以发现,如果我们用 for 循环来写的话,当到了末尾的时候就自动结束了,但是用了 next() 的话,当完成最后一个的时候它不会自动结束,还会向下继续,但是后面已经没有元素了,所以就发出了一个 StopIteration 的信息,即停止迭代。

在这我们还要再关注一下迭代器对象的另一个特点,看上上个的那个例子就可以知道,对象 my_iter 被迭代结束后,即每个元素都读取了一遍之后,指针就移到了最后一个元素后面,如果想要再访问的话,指针并没有自动移动到初始位置,所以会报 StopIteration,如果想要重新开始的话,就需要重新载入迭代对象。

到现在,对迭代器暂且有上述的了解,迭代器其实还要更深层次的使用,但是有一个典型的例子 -- 文件,这就是为什么我先把文件放在之前两天的文章来讲。

文件迭代器

现在有一个 “test.txt” 的文件,文件内容是:

My name is Rocky
I love Python
a,hhhhhhh

现在用迭代器来尝试操作这个文件,我们其实在之前两天讲述有关文件的知识的时候已经讲过了,就是用 readline() 一行一行的读,当然在实际操作中,我们是绝对不会这样做的,因为我们 “懒” 啊,一定要让它自动进行,比较常用的方法如下:

>>> f = open('test.txt')
>>> for line in f:
...    print(line,end=' ')
... 
My name is Rocky
I love Python
a,hhhhhhh >>>

上面的过程当然用 next() 也能够读取:

>>> f = open('test.txt')
>>> f.__next__()
'My name is Rocky\n'
>>> f.__next__()
'I love Python\n'
>>> f.__next__()
'a,hhhhhhh'
>>> f.__next__()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
StopIteration

如果用 next() 就可以直接读取每行的内容,这就说明文件是天生可迭代的对象,不需要用 iter() 转换。再者,我们用 for 来实现迭代,本质上就是自动调用 next() ,只不过这个工作被 for 偷偷的做了,所以 for 是活雷锋无疑了。

写在之后

初识迭代就到这结束了,其实迭代器远不止上述的那么简单,以后我们还会不断的遇到,我会在后续为大家带来深入理解迭代的文章。

© 著作权归作者所有
这个作品真棒,我要支持一下!
你好,这里是「零基础学习 Python 专栏」,更多内容,欢迎去往公众号「Python空间」。 欢迎加我微信...
0条评论
top Created with Sketch.