Files
ailearning/docs/da/021.md
2020-10-19 21:08:55 +08:00

252 lines
3.8 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 循环
循环的作用在于将一段代码重复执行多次。
## while 循环
```py
while <condition>:
<statesments>
```
**Python**会循环执行`<statesments>`,直到`<condition>`不满足为止。
例如,计算数字`0``1000000`的和:
In [1]:
```py
i = 0
total = 0
while i < 1000000:
total += i
i += 1
print total
```
```py
499999500000
```
之前提到,空容器会被当成 `False` ,因此可以用 `while` 循环来读取容器中的所有元素:
In [2]:
```py
plays = set(['Hamlet', 'Macbeth', 'King Lear'])
while plays:
play = plays.pop()
print 'Perform', play
```
```py
Perform King Lear
Perform Macbeth
Perform Hamlet
```
循环每次从 `plays` 中弹出一个元素,一直到 `plays` 为空为止。
## for 循环
```py
for <variable> in <sequence>:
<indented block of code>
```
`for` 循环会遍历完`<sequence>`中所有元素为止
上一个例子可以改写成如下形式:
In [3]:
```py
plays = set(['Hamlet', 'Macbeth', 'King Lear'])
for play in plays:
print 'Perform', play
```
```py
Perform King Lear
Perform Macbeth
Perform Hamlet
```
使用 `for` 循环时,注意尽量不要改变 `plays` 的值,否则可能会产生意想不到的结果。
之前的求和也可以通过 `for` 循环来实现:
In [4]:
```py
total = 0
for i in range(100000):
total += i
print total
```
```py
4999950000
```
然而这种写法有一个缺点:在循环前,它会生成一个长度为 `100000` 的临时列表。
生成列表的问题在于,会有一定的时间和内存消耗,当数字从 `100000` 变得更大时,时间和内存的消耗会更加明显。
为了解决这个问题,我们可以使用 `xrange` 来代替 `range` 函数,其效果与`range`函数相同,但是 `xrange` 并不会一次性的产生所有的数据:
In [5]:
```py
total = 0
for i in xrange(100000):
total += i
print total
```
```py
4999950000
```
比较一下两者的运行时间:
In [6]:
```py
%timeit for i in xrange(1000000): i = i
```
```py
10 loops, best of 3: 40.7 ms per loop
```
In [7]:
```py
%timeit for i in range(1000000): i = i
```
```py
10 loops, best of 3: 96.6 ms per loop
```
可以看出,`xrange` 用时要比 `range` 少。
## continue 语句
遇到 `continue` 的时候,程序会返回到循环的最开始重新执行。
例如在循环中忽略一些特定的值:
In [8]:
```py
values = [7, 6, 4, 7, 19, 2, 1]
for i in values:
if i % 2 != 0:
# 忽略奇数
continue
print i/2
```
```py
3
2
1
```
## break 语句
遇到 `break` 的时候,程序会跳出循环,不管循环条件是不是满足:
In [9]:
```py
command_list = ['start',
'process',
'process',
'process',
'stop',
'start',
'process',
'stop']
while command_list:
command = command_list.pop(0)
if command == 'stop':
break
print(command)
```
```py
start
process
process
process
```
在遇到第一个 `'stop'` 之后,程序跳出循环。
## else语句
`if` 一样, `while``for` 循环后面也可以跟着 `else` 语句,不过要和`break`一起连用。
* 当循环正常结束时,循环条件不满足, `else` 被执行;
* 当循环被 `break` 结束时,循环条件仍然满足, `else` 不执行。
不执行:
In [10]:
```py
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'
```
```py
Found: 7
```
执行:
In [11]:
```py
values = [11, 12, 13, 100]
for x in values:
if x <= 10:
print 'Found:', x
break
else:
print 'All values greater than 10'
```
```py
All values greater than 10
```