>>> from env_helper import info; info()
页面更新时间: 2021-08-29 21:57:27
运行环境:
    Linux发行版本: Debian GNU/Linux 11 (bullseye)
    操作系统内核: Linux-5.10.0-8-amd64-x86_64-with-glibc2.31
    Python版本: 3.9.2

2.10. while循环与if循环

可以看到,while 语句看起来和 if 语句类似。不同之处是它们的行为。 if 子句 结束时,程序继续执行 if 语句之后的语句。但在 while 子句结束时,程序执行跳回 到 while 语句开始处。while 子句常被称为“ while 循环”,或就是“循环”。

2.10.1. 查看实例

让我们来看一个 if 语句和一个 while循环。它们使用同样的条件,并基于该条 件做出同样的动作。下面是 if语句的代码:

>>> 计数器 = 0
>>> if 计数器 < 5:
>>>     print( 'Hello, world.')
>>>     计数器 = 计数器 + 1
Hello, world.

下面是 while 语句的代码:

>>> spam = 0
>>> while spam < 5:
>>>     print( 'Hello, world.')
>>>     spam = spam + 1
Hello, world.
Hello, world.
Hello, world.
Hello, world.
Hello, world.

这些语句类似,ifwhile 都检查 spam 的值, 如果它小于5,就打印一条消息。但如果运行这两段代码, 它们各自的表现非常不同。对于 if 语句, 输出就是 "Hello,world." 。 但对于 while 语句,输出是 "Hello, world." 重复了5次! 看一看这两段代码 的流程图,图2-9和2-10, 找一找原因。

带有 if 语句的代码检查条件,如果条件为 True ,就打印一次 "Hello, world." 带 有 while 循环的代码则不同,会打印5次。打印5次后停下来是因为,在每次循环 迭代末尾, spam 中的整数都增加1。这意味着循环将执行5次,然后 spam < 5 变为 False

while循环中,条件总是在每次“迭代”开始时检查(也就是每次循环执行 时)。如果条件为 True ,子句就会执行,然后,再次检查条件。当条件第一次为 False 时, while 子句就跳过。

2.10.2. 恼人的循环

这里有一个小例子,它不停地要求你输入 "your name" (就是这个字符串,而不是你的名字)。选择File > New Window, 打开一个新的文件编辑器窗口,输入以下代码,将文件保存为 yourName.py

>>> name =''
>>> while name != '你的名字':
>>>     print('请输入你的名字:')
>>>     name = input()
>>> print('哈哈哈哈!')
请输入你的名字:
asfd
请输入你的名字:
sadf
请输入你的名字:
你的名字
哈哈哈哈!

首先,程序将变量 name 设置为一”空字符串。 这样,条件 name !='your name' 就会求值为 True ,程序就会进入 while 循环的子句。 这个子句内的代码要求用户输入他们的名字,然后赋给 name 变量。 因为这是语句块的最后一行,所以执行就回到 while 循环的开始,重新对条件求值。 如果 name 中的值“不等于”字符串 'your name’ ,那么条件就为 True ,执行将再次进入 while子句。

但如果用户输入 your namewhile 循环的条件就变成 'your name' != 'your name’ , 它求值为 False 。条件现在是 False , 程序就不会再次进入 while 循环子句,而是跳过它,继续执行程序后面的部分。

如果永不输入 your name ,那么循环的条件就永远为 False ,程序将永远问下去。 这里,input()调用让用户输入正确的字符串,以便让程序继续。 在其他程序,条件可能永远没有实际变化,这可能会出问题。让我们来看看如何跳出循环。

2.10.3. 跳出循环

通常,循环会不断地执行代码块,直到条件为假或使用完序列中的所有元素。 但在有些情况下,你可能想中断循环、开始新迭代(进入“下一轮”代码块执行流程)或直接结束循环。

break 语句

有一个捷径,让执行提前跳出 while 循环子句。 如果执行遇到 break 语句,就会马上退出 while 循环子句。 在代码中,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

非常简单,对吗?这里有一个程序,和前面的程序做一样的事情, 但使用了 break 语句来跳出循环。 输入以下代码,将文件保存为 yourName2.py

>>> while True:
>>>     print('Please type your name.')
>>>     name = input()
>>>     if name == 'your name':
>>>         break
>>> print('Thank you!')
Please type your name.
dfs
Please type your name.
your name
Thank you!

第一行创建了一个“无限循环”,它是一个条件总是为 Truewhile 循环。 (表达式 True 总是求值为 True 。) 程序执行将总是进入循环,只有遇到break语句执行时才会退出(“永远不”退出的无限循环是一个常见的编程缺陷)。

像以前一样,程序要求用户输入 your name 。但是现在,虽然执行仍然在 while 循环内,但有一个 if 语句会被执行, 检查name是否等于 your name 。如果条件为 Truebreak 语句就会运行,执行就会跳出循环, 转到 print('Thank you!') 。否则, 包含 break 语句的 if 语句子句就会跳过, 让执行到达 while 循环的末尾。此时, 程序执行跳回到 while 语句的开始,重新检查条件。 因为条件是 True ,所以执行进入循环, 再次要求用户输入 yourname

continue 语句

语句continue没有break用得多。它结束当前迭代,并跳到下一次迭代开头。 这基本上意味着跳过循环体中余下的语句,但不结束循环。 这在循环体庞大而复杂,且存在多个要跳过它的原因时很有用。 在这种情况下,可使用continue,如下所示:

让我们用 continue 写一个程序,要求输入名字和口令。 在一个新的文件编辑窗口中输入以下代码,将程序保存为 swordfish.py

>>> while True:
>>>     print('Who are you?')
>>>     name = input()
>>>     if name != 'Joe':
>>>         continue
>>>     print('Hello, Joe. What is the password? (It is a fish.) ')
>>>     password = input()
>>>     if password == 'swordfish':
>>>         break
>>> print('Access granted.')
Who are you?
asdf
Who are you?
sadf
Who are you?
sfd
Who are you?
Joe
Hello, Joe. What is the password? (It is a fish.)
asdf
Who are you?
Joe
Hello, Joe. What is the password? (It is a fish.)
swordfish
Access granted.

如果用户输入的名字不是 Joecontinue 语句将导致程序执行跳回到循环开始处。 再次对条件求值时,执行总是进入循环,因为条件就是 True 。 如果执行通过了 if 语句,用户就被要求输入口令。 如果输入的口令是 swordfishbreak语句运行,执行跳出 while 循环,打印 Access granted。 否则,执行继续到 while 循环的末尾,又跳回到循环的开始。

无论是在for循环还是while循环中,都可使用continue、break和else子句。

2.10.4. 陷在无限循环中?

如果你运行一个有缺陷的程序,导致陷在一个无限循环中。 在交互环境下,那么请按 Ctrl-C ; 如果是使用 Jupyter 等环境,应该会有停止的控件。 这将向程序发送 Keyboardlntermpt 错误,导致它立即停止。 试一下,创建一个简单的无限循环:

while True:
    print('Hello world!')

如果运行这个程序,它将永远在屏幕上打印 Hello world! 因为 while 语句的 条件总是 True。在 IDLE 的交互式环境窗口中,只有两种办法停止这个程序:按 下 Ctrl-C 或从菜单中选择 Shell > Restart Shell 。如果你希望马上停止程序,即使 它不是陷在一个无限循环中, Ctrl-C 也是很方便的。