详解Python中for循环的使用


Posted in Python onApril 14, 2015

for 循环

本系列前面 “探索 Python,第 5 部分:用 Python 编程” 一文讨论了 if 语句和 while 循环,讨论了复合语句以及适当缩进 Python 语句来指示相关 Python 代码块。该文的结尾介绍了 Python for 循环。但就其使用和功能来说,for 循环更值得关注,所以本文单独讲述该循环。

for 循环有一个简单的语法,使您可以从容器对象中提取单个项目并对其进行某些操作。简单地说,使用 for 循环,可以迭代中对象集合的项目。对象集合可以是任何 Python 容器类型,包括前面文章中讨论的 tuple、string 和 list 类型。但是容器 metaphor 的功能比这三种类型更强大。metaphor 包括其他序列类型,如 dictionary 和 set,将来的文章中将对它们进行讨论。

但是请稍等!还有更多信息:for 循环可以用于迭代支持迭代 metaphor 的任何对象,这使 for 循环非常有用。

清单 1 中显示了 for 循环的基本语法,还演示了如何在 for 循环中使用 continue 和 break 语句。
清单 1. for 循环的伪代码

for item in container:
 
  if conditionA:    # Skip this item
    continue
 
  elif conditionB:   # Done with loop
    break
 
  # action to repeat for each item in the container
 
else:
 
  # action to take once we have finished the loop.

本系列中的第二篇文章 “探索 Python,第 2 部分:探索 Python 类型的层次结构” 介绍了 Python tuple。如文中所述,tuple 类型是不可变的异构容器。这主要是说 tuple 可以存放不同类型的对象,但是它一旦创建,就无法更改。清单 2 演示了如何使用 for 循环迭代 tuple 的元素。
清单 2. for 循环和 tuple

>>> t = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) 
>>> count = 0
>>> for num in t:
...   count += num
... else:
...   print count
... 
45
>>> count = 0
>>> for num in t:
...   if num % 2:
...     continue
...   count += num
... else:
...   print count
... 
20

本例首先创建了名为 t 的 tuple,存放整数 0 至 9(包含 9)。第一个 for 循环迭代此 tuple,在 count 变量中累计 tuple 中数值的和。一旦代码已经迭代了 tuple 中的所有元素,它将进入 for 循环的 else 子句,打印 count 变量的值。

清单 2 中显示的第二个 for 循环也迭代 tuple 中的所有元素。但是,它仅累计容器中能够被 2 整除的那些项的值(请记住如果表达式为非零,if 语句将确定为真,num 不能被 2 整除时使用 % 运算符会返回非零值)。此限制通过使用适当的 if 语句和 continue 语句来完成。如前面的文章中所述,continue 语句使包含它的循环开始下一次迭代。实现相同结果的另一种方法是测试 tuple 中的当前项是否是偶数(使用 if not num % 2:),如果为真,那么将当前项添加到运行总和中。一旦代码完成 tuple 中的迭代,将调用 else 子句,打印总和。

本系列中的第三篇文章 “探索 Python:第 3 部分:探索 Python 类型的层次结构” 讨论了 Python string。string 是不可变的同构容器,这意味着它仅能存放字符且一旦建立将无法修改。清单 3 演示了如何使用 Python string 作为 for 循环的容器。
清单 3. for 循环和 string

>>> st = "Python Is A Great Programming Language!"
>>> for c in st:
...   print c,
... 
P y t h o n  I s  A  G r e a t  P r o g r a m m i n g  L a n g u a g e !
>>> count = 0
>>> for c in st:
...   if c in "aeiou":
...     count += 1
... else:
...   print count
...
10
>>> count = 0
>>> for c in st.lower():
...   if c in "aeiou":
...     count += 1
... else:
...   print count
... 
12

本例提供了三个不同的 for 循环,它们都迭代同一 string。第一个 for 循环迭代 string “Python Is A Great Programming Language!” 并一次打印 string 中的一个字符。在此例中,print 语句变量 c 后加了一个逗号。这使 print 语句打印字符值时后面跟着空格字符,而不是换行字符。如果没有后面的逗号,字符将全部打印在单独的行中,会很难读。

下两个 for 循环迭代该字符串并计算其包含多少个元音字母(“a”、“e”、“i”、“o” 或 “u”)。第二个 for 循环在迭代原始 string 时仅查找小写元音字母。第三个 for 循环迭代通过调用 string 对象的 lower 方法返回的临时 string。lower 方法将 string 中的所有字符转换为小写。因此,第三个 for 循环可找到另外两个元音字母。

本系列中的第四篇文章 “探索 Python,第 4 部分:探索 Python 类型的层次结构” 介绍了 Python list。list 是异构可变容器,这意味着它可以存放不同类型的对象且创建后可以修改。清单 4 演示了如何使用 list 和 for 循环。
清单 4. for 循环和 list

>>> mylist = [1, 1.0, 1.0j, '1', (1,), [1]]
>>> for item in mylist:
...   print item, "\t", type(item))
... 
1    <type 'int'>
1.0   <type 'float'>
1j   <type 'complex'>
1    <type 'str'>
(1,)  <type 'tuple'>
[1]   <type 'list'>

既然 list 是很灵活的 Python 容器类型(您将在本系列其余的文章中多次看到它),本例看起来可能过于简单了。但是,这是一部分要点:使用 for 循环使处理容器中的每个项目非常简单,甚至处理包含各种不同对象的 list 也是如此。本例迭代 Python list 中的所有项目,并在单独的行中打印每一项及其相对应的 Python 类型。
迭代和可变容器

Python list 是一个可变序列,提供了一种令人好奇的可能性:for 循环主体可以修改其正在迭代的 list。正如您可能认为的,这样并不好,如果进行此操作,Python 解释器将无法很好地工作,如清单 5 所示。
清单 5. 在 for 循环中修改容器

>>> mylist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for item in mylist:
...   if item % 2:
...     mylist.insert(0, 100)
... 
^CTraceback (most recent call last):
 File "<stdin>", line 3, in ?
KeyboardInterrupt
>>> print mylist
[100, ...., 100, 100, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # Many lines deleted for clarity
>>> mylist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for item in mylist[:]:
...   if item % 2:
...     mylist.insert(0, 100)
... 
>>> print mylist
[100, 100, 100, 100, 100, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

本例中的第一个 for 循环只要在原始 list 中发现奇数,它就在 list 的开始插入数值 100。当然,这是一种演示此问题的不同寻常的方式,但却非常好。一旦在三个点的 Python 提示后按 Enter 键,Python 解释器就处于无限循环的混乱中。要停止这种混乱,必须通过按 Ctrl-C(其在 Python 输出中显示为 ^C)来中断进程,然后会出现 KeyboardInterrupt 异常。如果打印出修改的 list,将看到 mylist 现在包含大量的值为 100 的元素(新元素的准确数量取决于您中断循环的速度)。

本例中的第二个 for 循环演示了如何避免此问题。使用切片运算符创建原始 list 的副本。现在 for 循环将迭代该副本,而对原始 list 进行修改。最终的结果是修改后的原始 list,它现在以五个值为 100 的新元素开始。

for 循环和序列索引

如果您用过其他编程语言,Python for 循环可能看起来有点儿古怪。您可能认为它更像 foreach 循环。基于 C 的编程语言具有 for 循环,但它的设计目的是对一系列操作执行特定次数。Python for 循环可以通过使用内置的 range 和 xrange 方法来模拟该行为。清单 6 中演示了这两种方法。
清单 6. range 和 xrange 方法

>>> r = range(10)
>>> print r
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> type(r)
<type 'list'>
>>> xr = xrange(10)
>>> print xr
xrange(10)
>>> type(xr)
<type 'xrange'>

本例首先演示了 range 方法,它创建一个包含一系列整数的新 list。调用 range 方法的一般形式是提供单个值,用作整数 list 的上限。零为起始值。因此,调用 range(10) 将创建包含整数 0 至 9(包含 9)的 list。range 方法接受起始索引以及步长。所以,调用 range(11,20) 将创建从 11 至 19(包含 19)的整数 list,而调用 range(12, 89, 2) 将创建从 12 至 88 的偶数 list。

由于 xrange 方法也创建整数 list(其使用相同参数),所以它与 range 方法非常相似。但是,xrange 方法仅在需要时才在 list 中创建整数。例如,在清单 6 中,尝试打印出新创建的 xrange 时除了 xrange 的名称,不会显示任何数据。当需要迭代大量整数时,xrange 方法更适用,因为它不会创建极大的 list,那样会消耗大量计算机内存。

清单 7 演示了如何在 for 循环内使用 range 方法来创建整数 1 至 10(包含 10)的乘法表。
清单 7. 创建乘法表

>>> for row in range(1, 11):
...   for col in range(1, 11):
...     print "%3d " % (row * col),
...   print
... 
 1  2  3  4  5  6  7  8  9  10 
 2  4  6  8  10  12  14  16  18  20 
 3  6  9  12  15  18  21  24  27  30 
 4  8  12  16  20  24  28  32  36  40 
 5  10  15  20  25  30  35  40  45  50 
 6  12  18  24  30  36  42  48  54  60 
 7  14  21  28  35  42  49  56  63  70 
 8  16  24  32  40  48  56  64  72  80 
 9  18  27  36  45  54  63  72  81  90 
 10  20  30  40  50  60  70  80  90 100

本例使用两个 for 循环,外面的 for 循环关注乘法表中的每一行,嵌套的 for 循环关注每行内的列。每个循环都迭代包含整数 1 至 10(包含 10)的 list。最里面的 print 语句使用了一个名为 字符串格式化 的新概念来创建格式设置精美的表。字符串格式化是一种非常有用的技术,用于以格式设置精美的布局创建由不同数据类型组成的 string。现在详细信息并不重要,将来的文章中将讲述这些内容(了解 C 编程语言的 printf 方法的任何人都会很熟悉这些内容)。在本例中,字符串格式化指定将从整数创建新 string 且需要保留三个字符来存放该整数(如果该整数小于三个字符,将在左边用空格填补,从而使数据排列整齐)。第二个 print 语句用于打印新行,从而使乘法表中的下一行被打印在新的行中。

range 方法还可用于迭代容器,通过使用适当的索引访问序列中的每一项。要进行此操作,需要包含容器的允许范围索引值的整数 list,这可以通过使用 range 方法和 len 方法来轻松实现,如清单 8 所示。
清单 8. 在 for 循环内索引容器

>>> st = "Python Is A Great Programming Language!"
>>> for index in range(len(st)): 
...   print st[index],
... 
P y t h o n  I s  A  G r e a t  P r o g r a m m i n g  L a n g u a g e !
>>> for item in st.split(' '):
...   print item, len(item)
... 
Python 6
Is 2
A 1
Great 5
Programming 11
Language! 9

这个最后的示例演示了如何使用 len 方法作为 range 方法的参数,创建可用于单独访问 string 中每个字符的整数 list。第二个 for 循环还显示了如何将 string 分割为子字符串的 list(使用空格字符来指示子字符串的边界)。for 循环迭代子字符串 list,打印每个子字符串及其长度。

结束语

本文讨论了 Python for 循环并演示了它的一些使用方式。可以将 for 循环与提供迭代器的任何 Python 对象结合使用,这些对象包括 tuple、string 和 list 等内置序列类型。for 循环和 list 序列一起使用时具有强大的功能,您会发现自己在许多情况中都要使用它们。Python 提供了用于组合这两个概念的简单机制,称为列表理解,将来的文章中将讲述该内容。

Python 相关文章推荐
介绍Python中的fabs()方法的使用
May 14 Python
python Socket之客户端和服务端握手详解
Sep 18 Python
完美解决python中ndarray 默认用科学计数法显示的问题
Jul 14 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
Feb 16 Python
Python3使用TCP编写一个简易的文件下载器功能
May 08 Python
python中单下划线(_)和双下划线(__)的特殊用法
Aug 29 Python
使用wxpy实现自动发送微信消息功能
Feb 28 Python
基于Python共轭梯度法与最速下降法之间的对比
Apr 02 Python
Python数据可视化实现多种图例代码详解
Jul 14 Python
深入浅析Python代码规范性检测
Jul 31 Python
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
Oct 16 Python
使用Django框架创建项目
Jun 10 Python
Python中join和split用法实例
Apr 14 #Python
Python中__name__的使用实例
Apr 14 #Python
Python中的列表知识点汇总
Apr 14 #Python
Python中使用copy模块实现列表(list)拷贝
Apr 14 #Python
复习Python中的字符串知识点
Apr 14 #Python
Python内置函数dir详解
Apr 14 #Python
Python最基本的数据类型以及对元组的介绍
Apr 14 #Python
You might like
PHP网站备份程序代码分享
2011/06/10 PHP
PHP类与对象中的private访问控制的疑问
2012/11/01 PHP
php简单统计字符串单词数量的方法
2015/06/19 PHP
php实现微信发红包功能
2018/07/13 PHP
快速保存网页中所有图片的方法
2006/06/23 Javascript
对象特征检测法判断浏览器对javascript对象的支持
2009/07/25 Javascript
JQery jstree 大数据量问题解决方法
2010/03/09 Javascript
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
javascript控制swfObject应用介绍
2012/11/29 Javascript
jquery Mobile入门—外部链接切换示例代码
2013/01/08 Javascript
javascript判断css3动画结束 css3动画结束的回调函数
2015/03/10 Javascript
JS实现的左侧竖向滑动菜单效果代码
2015/10/19 Javascript
分享经典的JavaScript开发技巧
2015/11/21 Javascript
整理Javascript基础入门学习笔记
2015/11/29 Javascript
你有必要知道的25个JavaScript面试题
2015/12/29 Javascript
jQuery图片轮播(二)利用构造函数和原型创建对象以实现继承
2016/12/06 Javascript
jQuery中图片展示插件highslide.js的简单dom
2018/04/22 jQuery
vue-router实现编程式导航的代码实例
2019/01/19 Javascript
使用ESLint禁止项目导入特定模块的方法步骤
2019/03/04 Javascript
Vue中通过vue-router实现命名视图的问题
2020/04/23 Javascript
JS实现简易日历效果
2021/01/25 Javascript
Windows下安装python2.7及科学计算套装
2015/03/05 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
2017/09/28 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
对python多线程中Lock()与RLock()锁详解
2019/01/11 Python
python 在指定范围内随机生成不重复的n个数实例
2019/01/28 Python
Selenium webdriver添加cookie实现过程详解
2020/08/12 Python
屈臣氏菲律宾官网:Watsons菲律宾
2020/06/30 全球购物
网上卖盒饭创业计划书范文
2014/02/07 职场文书
爱情寄语大全
2014/04/09 职场文书
市级优秀班主任事迹材料
2014/05/13 职场文书
小学家长学校培训材料
2014/08/24 职场文书
2014年十八届四中全会思想汇报范文
2014/10/17 职场文书
党风廉正建设个人工作总结
2015/03/06 职场文书
小学班级标语口号大全
2015/12/26 职场文书
导游词之西安大清真寺
2019/12/17 职场文书