1.2.3. 控制流

控制代码执行的顺序。

1.2.3.1. if/elif/else

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

代码块由缩进区分

提示

在你的 Python 解释器中输入以下几行,并注意**缩进深度**。 Ipython shell 在冒号 : 之后会自动增加缩进深度;要减少缩进深度,请使用退格键向左移动四个空格。 按两次回车键退出逻辑块。

>>> 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 循环(曼德博集合问题)

>>> 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)

  • 空容器(列表、元组、集合、字典、…)

  • False, None

评估为 True
  • 其他一切

a == b:

测试相等性,使用逻辑运算符

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

测试同一性:两边是同一个对象

>>> a = 1
>>> b = 1.
>>> a == b
True
>>> a is b
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. 高级迭代

迭代任何序列

你可以迭代任何序列(字符串、列表、字典中的键、文件中的行、…)

>>> 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 中,你可以直接循环遍历感兴趣的对象,而不用担心你通常不关心的索引。 这个特性可以使代码更易读。

警告

不要修改你正在迭代的序列。

跟踪枚举编号

常见任务是在迭代序列时跟踪项目的编号。

  • 可以使用带有计数器的 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')

循环遍历字典

使用**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]