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('哈哈哈哈!')
首先,程序将变量 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!')
第一行创建了一个“无限循环”,它是一个条件总是为 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.')
如果用户输入的名字不是 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
也是很方便的。