5.5.5 跳出循环
通常,循环会不断地执行代码块,直到条件为假或使用完序列中的所有元素。但在有些情况下,你可能想中断循环、开始新迭代(进入“下一轮”代码块执行流程)或直接结束循环。
1. break
要结束(跳出)循环,可使用break。假设你要找出小于100的最大平方值(整数与自己相乘的结果),可从100开始向下迭代。找到一个平方值后,无需再迭代,因此直接跳出循环。
from math import sqrt
for n in range(99, 0, -1):
root = sqrt(n)
if root == int(root):
print(n)
break
如果你运行这个程序,它将打印81并结束。注意到我向range传递了第三个参数——步长,即序列中相邻数的差。通过将步长设置为负数,可让range向下迭代,如上面的示例所示;还可让它跳过一些数:
>>> range(0, 10, 2)
[0, 2, 4, 6, 8]
2. continue
语句continue没有break用得多。它结束当前迭代,并跳到下一次迭代开头。这基本上意味着跳过循环体中余下的语句,但不结束循环。这在循环体庞大而复杂,且存在多个要跳过它的原因时很有用。在这种情况下,可使用continue,如下所示:
for x in seq:
if condition1: continue
if condition2: continue
if condition3: continue
do_something()
do_something_else()
do_another_thing()
etc()
然而,在很多情况下,使用一条if语句就足够了。
for x in seq:
if not (condition1 or condition2 or condition3):
do_something()
do_something_else()
do_another_thing()
etc()
continue虽然是一个很有用的工具,但并非不可或缺的。然而,你必须熟悉break语句,因为在while True循环中经常用到它,这将在下一小节讨论。
3. while True/break成例
在Python中, for和while循环非常灵活,但偶尔遇到的一些问题可能让你禁不住想:如果这些循环的功能更强些就好了。例如,假设你要在用户根据提示输入单词时执行某种操作,并在用户没有提供单词时结束循环。为此,一种办法如下:
word = 'dummy'
while word:
word = input('Please enter a word: ')
# 使用这个单词做些事情:
print('The word was', word)
这些代码的运行情况如下:
Please enter a word: first
The word was first
Please enter a word: second
The word was second
Please enter a word:
这与你希望的一致,但你可能想使用单词做些比打印它更有用的事情。然而,如你所见,这些代码有点难看。为进入循环,你需要将一个哑值(未用的值)赋给word。像这样的哑值通常昭示着你的做法不太对。下面来尝试消除这个哑值。
word = input('Please enter a word: ')
while word:
# 使用这个单词做些事情:
print('The word was ', word)
word = input('Please enter a word: ')
哑值消除了,但包含重复的代码(这样也不好):需要在两个地方使用相同的赋值语句并调用input。如何避免这样的重复呢?可使用成例while True/break。
while True:
word = input('Please enter a word: ')
if not word: break
# 使用这个单词做些事情:
print('The word was ', word)
while True导致循环永不结束,但你将条件放在了循环体内的一条if语句中,而这条if语句将在条件满足时调用break。这说明并非只能像常规while循环那样在循环开头结束循环,而是可在循环体的任何地方结束循环。 if/break行将整个循环分成两部分:第一部分负责设置(如果使用常规while循环,将重复这部分),第二部分在循环条件为真时使用第一部分初始化的数据。
虽然应避免在代码中过多使用break(因为这可能导致循环难以理解,在一个循环中包含多个break时尤其如此),但这里介绍的技巧很常见,因此大多数Python程序员(包括你自己)都能够明白你的意图。
领取专属 10元无门槛券
私享最新 技术干货