本文最后更新于 397 天前,其中的信息可能已经过时,如有错误请发送邮件到 wuxianglongblog@163.com
循环的作用在于将一段代码重复执行多次。
Python 会循环执行 <statesments>
,直到 <condition>
不满足为止。
例如,计算数字 0
到 1000000
的和:
| i = 0 |
| total = 0 |
| while i < 1000000: |
| total += i |
| i += 1 |
| print total |
之前提到,空容器会被当成 False
,因此可以用 while
循环来读取容器中的所有元素:
| plays = set(['Hamlet', 'Macbeth', 'King Lear']) |
| while plays: |
| play = plays.pop() |
| print 'Perform', play |
| Perform King Lear |
| Perform Macbeth |
| Perform Hamlet |
循环每次从 plays
中弹出一个元素,一直到 plays
为空为止。
for
循环会遍历完 <sequence>
中所有元素为止
上一个例子可以改写成如下形式:
| plays = set(['Hamlet', 'Macbeth', 'King Lear']) |
| for play in plays: |
| print 'Perform', play |
| Perform King Lear |
| Perform Macbeth |
| Perform Hamlet |
使用 for
循环时,注意尽量不要改变 plays
的值,否则可能会产生意想不到的结果。
之前的求和也可以通过 for
循环来实现:
| total = 0 |
| for i in range(100000): |
| total += i |
| print total |
然而这种写法有一个缺点:在循环前,它会生成一个长度为 100000
的临时列表。
生成列表的问题在于,会有一定的时间和内存消耗,当数字从 100000
变得更大时,时间和内存的消耗会更加明显。
为了解决这个问题,我们可以使用 xrange
来代替 range
函数,其效果与 range
函数相同,但是 xrange
并不会一次性的产生所有的数据:
| total = 0 |
| for i in xrange(100000): |
| total += i |
| print total |
比较一下两者的运行时间:
| %timeit for i in xrange(1000000): i = i |
| 10 loops, best of 3: 40.7 ms per loop |
| %timeit for i in range(1000000): i = i |
| 10 loops, best of 3: 96.6 ms per loop |
可以看出,xrange
用时要比 range
少。
遇到 continue
的时候,程序会返回到循环的最开始重新执行。
例如在循环中忽略一些特定的值:
| values = [7, 6, 4, 7, 19, 2, 1] |
| for i in values: |
| if i % 2 != 0: |
| |
| continue |
| print i/2 |
遇到 break
的时候,程序会跳出循环,不管循环条件是不是满足:
| command_list = ['start', |
| 'process', |
| 'process', |
| 'process', |
| 'stop', |
| 'start', |
| 'process', |
| 'stop'] |
| while command_list: |
| command = command_list.pop(0) |
| if command == 'stop': |
| break |
| print(command) |
| start |
| process |
| process |
| process |
在遇到第一个 'stop'
之后,程序跳出循环。
与 if
一样, while
和 for
循环后面也可以跟着 else
语句,不过要和 break
一起连用。
- 当循环正常结束时,循环条件不满足,
else
被执行;
- 当循环被
break
结束时,循环条件仍然满足, else
不执行。
不执行:
| values = [7, 6, 4, 7, 19, 2, 1] |
| for x in values: |
| if x <= 10: |
| print 'Found:', x |
| break |
| else: |
| print 'All values greater than 10' |
执行:
| values = [11, 12, 13, 100] |
| for x in values: |
| if x <= 10: |
| print 'Found:', x |
| break |
| else: |
| print 'All values greater than 10' |
| All values greater than 10 |