1.2.3. 控制流

控制代码执行的顺序。

1.2.3.1. if/elif/else

>>> if 2**2 == 4:
... print('Obvious!')
...
Obvious!

块由缩进分隔

在Python解释器中键入以下行,并小心保持缩进深度Ipython shell在冒号:符号后自动增加缩进深度;要减小缩进深度,使用Backspace键向左移动四个空格。按Enter键两次离开逻辑块。

>>> a = 10
>>> if a == 1:
... print(1)
... elif a == 2:
... print(2)
... else:
... print('A lot')
A lot

缩进在脚本中也是强制性的。作为练习,在脚本condition.py中重新键入相同缩进的上面的行,并在Ipython中使用run condition.py执行这个脚本。

1.2.3.2. for/range

使用索引迭代:

>>> for i in range(4):
... print(i)
0
1
2
3

但是最常见的,在值上迭代更具可读性:

>>> for word in ('cool', 'powerful', 'readable'):
... print('Python is %s' % word)
Python is cool
Python is powerful
Python is readable

1.2.3.3. while/break/continue

典型的C风格while循环(Mandelbrot问题):

>>> z = 1 + 1j
>>> while abs(z) < 100:
... z = z**2 + 1
>>> z
(-134+352j)

更高级的功能

break for/while循环:

>>> z = 1 + 1j
>>> while abs(z) < 100:
... if z.imag == 0:
... break
... z = z**2 + 1

continue循环的下一次迭代

>>> a = [1, 0, 2, 4]
>>> for element in a:
... if element == 0:
... continue
... print(1. / element)
1.0
0.5
0.25

1.2.3.4. 条件表达式

if <OBJECT>:
以下值为False:
  • 任何等于零(0、0.0、0+0j)的数字,
  • 空容器(list、tuple、set、dictionary,...)
  • FalseNone
以下值为True:
  • 除了为Flase的所有其它的值
a == b

测试相等性:

>>> 1 == 1.
True
a is b:

测试身份:双方都是同一个对象:

>>> 1 is 1.
False
>>> a = 1
>>> b = 1
>>> a is b
True
a in b:

对于任何集合bb包含a

>>> b = [1, 2, 3]
>>> 2 in b
True
>>> 5 in b
False

如果b是字典,则测试ab的键。

1.2.3.5. 高级迭代

1.2.3.5.1. 迭代任何序列

你可以遍历任何序列(字符串、列表、字典中的键、文件中的行,...):

>>> vowels = 'aeiouy'
>>> for i in 'powerful':
... if i in vowels:
... print(i)
o
e
u
>>> message = "Hello how are you?"
>>> message.split() # returns a list
['Hello', 'how', 'are', 'you?']
>>> for word in message.split():
... print(word)
...
Hello
how
are
you?

少数语言(特别是科学计算的语言)允许循环任何整数/索引。使用Python,可以完全只循环感兴趣的对象,而不必麻烦你经常不关心的索引。此功能通常可用于使代码更易读。

警告

修改你正在迭代的序列是不安全的。

1.2.3.5.2. 跟踪计数

常见任务是在序列上进行迭代,同时跟踪元素编号。

  • 可以使用while循环与计数器,如上。或者for循环:

    >>> words = ('cool', 'powerful', 'readable')
    
    >>> for i in range(0, len(words)):
    ... print((i, words[i]))
    (0, 'cool')
    (1, 'powerful')
    (2, 'readable')
  • 但是,Python为此提供了一个内置函数 - enumerate - :

    >>> for index, item in enumerate(words):
    
    ... print((index, item))
    (0, 'cool')
    (1, 'powerful')
    (2, 'readable')

1.2.3.5.3. 在字典上循环

使用items

>>> d = {'a': 1, 'b':1.2, 'c':1j}
>>> for key, val in sorted(d.items()):
... print('Key: %s has value: %s' % (key, val))
Key: a has value: 1
Key: b has value: 1.2
Key: c has value: 1j

注意

字典的顺序是随机的,因此我们使用sorted()来排序键。

1.2.3.6. 列表推导式

>>> [i**2 for i in range(4)]
[0, 1, 4, 9]

练习

使用Wallis公式计算Pi的小数:

\pi = 2 \prod_{i=1}^{\infty} \frac{4i^2}{4i^2 - 1}