Python中的for语句与其他语言区别较大,更像其他语言的foreach循环,为Python提供了强大的循环结构,可以遍历序列成员,可以用在列表解析和生成器表达式中。for语句能够在后台自动调用迭代器的next方法,捕获StopIteration异常并结束循环。
for语句的使用格式:
迭代对象可以是序列、迭代器或其他支持迭代的对象。每次循环时,迭代变量表示可迭代对象的当前元素,一次循环结束,再表示迭代对象的下一个元素,直至所有元素迭代完毕。
下面编程输出“我是歌手”节目第三季第一场中出场歌手的次序和姓名(ch3-9.py)。歌手姓名按照出场次序保存在元组中,利用for循环依次输出。
运行程序,运行结果如下:
1.enumerate函数
在ch3-9.py中,借助了变量n来显示歌手的出场次序,其实自Python 2.3后,Python就新增加了enumerate 函数,不仅可以访问可迭代对象的元素,还可以访问其索引(从零开始)。
下面用enumerate 函数改写ch3-9.py代码(ch3-10.py)。程序直接利用enumerate 函数的返回值获得歌手出场次序及姓名。
运行程序,运行结果如下:
2.range函数
在Python中for语句与range函数搭配可以实现其他语言中for循环的功能。在本书前面章节中也用到过range函数,本小节将对range函数做详细介绍。
range函数的使用格式:
range函数会返回一个包含“(终值-初值)/步长”个元素的有序列表,各元素的值大于或等于初值且小于终值,range函数的三个参数(初值,终值,步长)都要求是整型数字,步长省略则默认为1,初值省略则默认为0,如:
注意:元素值必须小于终值。步长不可以为0,否则会引发错误,如:
例如,下面的程序利用for语句和range函数 计算1+2+3+…+100(ch3-11.py)。为了range中的元素能取到100,range的终值参数应该设为101。
运行程序,运行结果为:
本例中虽然代码很简洁,但是range(1,101)要产生100个元素的列表,占有较多的内存,如果需要处理更大范围列表时,range函数的缺点显而易见。为此Python提供了xrange函数。
3.xrange函数
xrange函数与range函数类似,但不会在内存中创建列表的完整副本。它只能用于for循环中,在for循环外,xrange函数毫无意义。
xrange函数的调用格式与range函数相同。
如:
4.迭代器
for循环不仅可以遍历序列,也可以访问迭代器。用for循环访问迭代器与访问序列的方法差不多。迭代器对象都有一个next方法,调用后会返回下一个条目。所有条目迭代完后,迭代器会引发StopIteration异常告诉程序循环结束。for语句会自动(不需要程序员处理)调用迭代器的next方法,捕获StopIteration异常并结束循环。当用for语句循环迭代一个对象条目时,不需要区分对象是迭代器还是序列,因为for语句操作序列和迭代器在前台是没有区别的。
(1)创建迭代器
Python的内建函数iter可以返回一个迭代器对象。iter函数有两种使用格式,分别为:
(www.xing528.com)
要求参数collection必须是序列或者是实现了_iter_()方法和next()方法的类。
这种形式中callable会不断被调用,直至遇到sentinel
(2)序列迭代器
对序列调用iter函数即返回序列迭代器,如:
由上例可以看到迭代器存在限制,不能向后移动,不能回到开始,也不能复制一个迭代器。在上例中建立迭代器iyz后,调用了一次next方法,回头再用for循环迭代iyz时,是从第2项list开始的。
(3)字典迭代器
字典可以通过键(iterkeys())、值(itervalues())或者键-值(iteritems())对来迭代。在只给出字典名的情况下,for循环会遍历字典的键,即:
等价于
下面编程显示电话簿中所有信息(ch3-12.py)。
分析:利用字典来存储电话簿,利用for语句遍历输出电话簿信息。
运行程序,运行结果如下:
使用iterkeys()方法改写程序,代码如下(ch3-12-1.py):
使用iteritems()方法改写程序,代码如下(ch3-12-2.py):
在Python 3.x中,字典对象不再支持iterkeys()、itervalues()和iteritems(),取而代之的是key()、values()和item()。
(4)文件迭代器
文件对象生成的迭代器会自动调用readline()方法,即:
等价于
下面读出并显示文本文件中的所有内容(ch3-13.py)
分析:打开文件后,用for语句遍历文件每一行并输出。
文件ch3_13.txt中的内容如图3-2所示:
图3-2 文本文件中的内容
运行程序,输出结果如下
5.列表解析
for语句也可以用于列表解析中。列表解析是一个非常简洁高效的工具,可以动态地创建列表。列表解析的使用格式如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。