while
语句看起来和 if
语句类似。不同之处是它们的行为。 if
子句
结束时,程序继续执行 if
语句之后的语句。但在 while
子句结束时,程序执行跳回
到 while
语句开始处。while
子句常被称为“ while
循环”,或就是“循环”。
计数器 = 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.
这些语句类似,if
和 while
都检查 spam
的值,
如果它小于5,就打印一条消息。但如果运行这两段代码,
它们各自的表现非常不同。对于 if
语句,
输出就是 "Hello,world."
。
但对于 while
语句,输出是 "Hello, world."
重复了5次!
带有 if
语句的代码检查条件,如果条件为 True
,就打印一次 "Hello, world."
带
有 while
循环的代码则不同,会打印5次。打印5次后停下来是因为,
在每次循环迭代末尾, spam
中的整数都增加1。这意味着循环将执行5次,
spam < 5
变为 False
。
在 while
循环中,条件总是在每次“迭代”开始时检查(也就是每次循环执行时)。
如果条件为 True
,子句就会执行,再次检查条件。当条件第一次为 False
时, while
子句就跳过。
name =''
while name != '你的名字':
print('请输入你的名字:')
name = input()
print('哈哈哈哈!')
请输入你的名字:
请输入你的名字:
请输入你的名字:
请输入你的名字:
请输入你的名字:
--------------------------------------------------------------------------- KeyboardInterrupt Traceback (most recent call last) Cell In[4], line 4 2 while name != '你的名字': 3 print('请输入你的名字:') ----> 4 name = input() 5 print('哈哈哈哈!') File /opt/conda/lib/python3.12/site-packages/ipykernel/kernelbase.py:1282, in Kernel.raw_input(self, prompt) 1280 msg = "raw_input was called, but this frontend does not support input requests." 1281 raise StdinNotImplementedError(msg) -> 1282 return self._input_request( 1283 str(prompt), 1284 self._parent_ident["shell"], 1285 self.get_parent("shell"), 1286 password=False, 1287 ) File /opt/conda/lib/python3.12/site-packages/ipykernel/kernelbase.py:1325, in Kernel._input_request(self, prompt, ident, parent, password) 1322 except KeyboardInterrupt: 1323 # re-raise KeyboardInterrupt, to truncate traceback 1324 msg = "Interrupted by user" -> 1325 raise KeyboardInterrupt(msg) from None 1326 except Exception: 1327 self.log.warning("Invalid Message:", exc_info=True) KeyboardInterrupt: Interrupted by user
首先,程序将变量 name
设置为一"空字符串。
这样,条件 name !='your name'
就会求值为 True
,程序就会进入 while
循环的子句。
这个子句内的代码要求用户输入他们的名字,然后赋给 name
变量。
因为这是语句块的最后一行,所以执行就回到 while
循环的开始,重新对条件求值。
如果 name
中的值“不等于”字符串 'your name’
,那么条件就为 True
,执行将再次进入 while
子句。
但如果用户输入 your name
,while
循环的条件就变成 'your name' != 'your name’
,
它求值为 False
。条件现在是 False
,
程序就不会再次进入 while
循环子句,而是跳过它,继续执行程序后面的部分。
如果永不输入 your name
,那么循环的条件就永远为 False
,程序将永远问下去。
这里,input()
调用让用户输入正确的字符串,以便让程序继续。
在其他程序,条件可能永远没有实际变化,这可能会出问题,那么如何跳出循环?
通常,循环会不断地执行代码块,直到条件为假或使用完序列中的所有元素。 但在有些情况下,可能想中断循环、开始新迭代(进入“下一轮”代码块执行流程)或直接结束循环。
假设要找出小于 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.
Please type your name.
Please type your name.
Please type your name.
Thank you!
第一行创建了一个“无限循环”,它是一个条件总是为 True
的 while
循环。
(表达式 True
总是求值为 True
。)
程序执行将总是进入循环,只有遇到break语句执行时才会退出(“永远不”退出的无限循环是一个常见的编程缺陷)。
像以前一样,程序要求用户输入 your name
。但是现在,虽然执行仍然在
while
循环内,但有一个 if
语句会被执行,
检查name是否等于 your name
。如果条件为 True
,
break
语句就会运行,执行就会跳出循环,
转到 print('Thank you!')
。否则,
包含 break
语句的 if
语句子句就会跳过,
让执行到达 while
循环的末尾。此时,
程序执行跳回到 while
语句的开始,重新检查条件。
因为条件是 True
,所以执行进入循环,
再次要求用户输入 yourname
。
现在用 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?
Who are you?
Hello, Joe. What is the password? (It is a fish.)
Who are you?
Who are you?
如果用户输入的名字不是 Joe
,continue
语句将导致程序执行跳回到循环开始处。
再次对条件求值时,执行总是进入循环,因为条件就是 True
。
如果执行通过了 if
语句,用户就被要求输入口令。
如果输入的口令是 swordfish
,break
语句运行,执行跳出 while
循环,打印 Access granted
。
否则,执行继续到 while
循环的末尾,又跳回到循环的开始。
无论是在 for
循环还是 while
循环中,
都可使用 continue
、break
和 else
子句。
如果运行一个有缺陷的程序,导致陷在一个无限循环中。
在交互环境下,那么请按 Ctrl-C
; 如果是使用 Jupyter 等环境,应该会有停止的控件。
这将向程序发送 Keyboardlntermpt
错误,导致它立即停止。
试一下,创建一个简单的无限循环:
while True:
print('Hello world!')
如果运行这个程序,它将永远在屏幕上打印 Hello world!
因为 while
语句的
条件总是 True
。在 IDLE
的交互式环境窗口中,只有两种办法停止这个程序:按
下 Ctrl-C
或从菜单中选择 Shell > Restart Shell
。如果希望马上停止程序,即使
它不是陷在一个无限循环中, Ctrl-C
也是很方便的。