本页面仅用于内容预览,不包含动画交互效果
讲义加载中,请耐心等待……
Python 编程:从入门到实践Python 编程:从入门到实践(第三版)(第三版)Teacher Name / Email1
与《Python 编程:从入门到实践(第三版)》一书配套使用讲义中的文本及绘图采用署名-非商业性使用-相同方式共享协议CC BY-NC-SA 4.0进行许可引用的网络图片附有超链接,可用于访问来源讨论、意见、答疑、勘误、更新:https://github.com/scruel/pcc_3e_slides作者:@Scruel Tao关于本讲义关于本讲义2
77 用户输入和用户输入和 whilewhile 循环循环7.1 input() 函数的工作原理7.2 while 循环简介7.3 使用 while 循环处理列表和字典7.4 小结3
7.17.1 input()input() 函数的工作原理函数的工作原理input() 函数:让程序等待用户输入函数的接受一个参数:向用户显示的提示(promptname = input("Please enter your name: ")print(f"\nHello, {name}!")运行结果Please enter your name:4

程序等待用户输入,并在用户按回车键后继续运行。用户的输入被赋给变量 message,接下来调用 print() 将输入呈现给用户

7.17.1 input()input() 函数的工作原理函数的工作原理input() 函数:让程序等待用户输入函数的接受一个参数:向用户显示的提示(promptname = input("Please enter your name: ")print(f"\nHello, {name}!")运行结果Please enter your name:iTuring5
7.17.1 input()input() 函数的工作原理函数的工作原理input() 函数:让程序等待用户输入,并返回用户输入的文本。函数的接受一个参数:向用户显示的提示(promptname = input("Please enter your name: ")print(f"\nHello, {name}!")运行结果Please enter your name: iTuringHello, iTuring!6
7.1.17.1.1 编写清晰的提示编写清晰的提示input() 函数:让程序等待用户输入,并返回用户输入的文本。函数的接受一个参数:向用户显示的提示(prompt我们应该尽可能地编写清晰的提示:在提示的末尾加一个空格:能区分提示和用户输入,使程序更友好明确指出获取特定输入的原因,需要输入什么信息以及信息的类型提示可以超过一行可以将提示赋给一个变量超过一行的提示,有时候也可以考虑使用 print() 函数7
自赋值运算符自赋值运算符自赋值运算是一种很常见的运算,例如:对于很长的字符串,我们需要分行追加在计数时,我们需要让某个数增加 1prompt = "We need your name to personalize the messages"prompt = prompt + "\nWhat is your first name?"number = 0number = number + 18
自赋值运算符自赋值运算符这些都可以通过自赋值运算符简化:对于很长的字符串,我们需要分行追加在计数时,我们需要让某个数增加 1prompt = "We need your name to personalize the messages"prompt += "\nWhat is your first name?"number = 0number += 19
自赋值运算符自赋值运算符常用的自赋值运算符有:number += 1number -= 1number *= 1number /= 1number //= 1number **= 1...number = number + 1number = number - 1number = number * 1number = number / 1number = number // 1number = number ** 1...只需记得它们其实相当于:10
7.1.27.1.2 获取数值输入获取数值输入把文本当作数值直接使用,会导致类型错误TypeError):运行结果How old are you? 21Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: '>=' not supported between instances of 'str' and 'int'age = input("How old are you? ")print(age >= 18)11

在使用 input() 函数时,Python 会将用户输入解读为字符串。

7.1.27.1.2 获取数值输入获取数值输入int() 函数:将文本转换为数值我们可以在执行数值相关操作前,把用户的输入转换为数值类型:age = input("How old are you? ")age = int(age)print(age >= 18)运行结果How old are you? 21True12
7.1.37.1.3 求模运算符求模运算符求模运算符(%:返回两个数相除后的余数。>>> 4 % 31>>> 5 % 32>>> 6 % 30>>> 7 % 3113
7.1.37.1.3 求模运算符求模运算符求模运算符(%:将两个数相除并返回余数。取模运算有很多妙用,比如可以用它来判断一个数是否是偶数:>>> 4 % 31>>> 5 % 32>>> 6 % 30>>> 7 % 31>>> 4 % 2 == 0True>>> 5 % 2 == 0False>>> 7 % 2 == 0False>>> 0 % 2 == 0True14
7.2.17.2.1使用使用 whilewhile 循环循环for 循环用于针对集合中的每个元素执行一个代码块, while 循环则不断地运行,直到指定的条件不再满足为止。current_number = 1while current_number < 3: print(current_number) current_number += 1运行结果12代码 current_number += 1 current_number = current_ number + 1 的简写15
7.2.17.2.1使用使用 whilewhile 循环循环让我们来仔细看看这个 while 循环:16
7.2.17.2.1使用使用 whilewhile 循环循环让我们来仔细看看这个 while 循环:17
7.2.17.2.1使用使用 whilewhile 循环循环让我们来仔细看看这个 while 循环:18
7.2.17.2.1使用使用 whilewhile 循环循环让我们来仔细看看这个 while 循环:19
7.2.27.2.2 让用户选择何时退出让用户选择何时退出我们可以将条件判断设置为用户输入的值,并定义退出值只要用户输入的不是设定的退出值,程序就会一直运行:prompt = "\nTell me something, and I will repeat it back:"prompt += "\nEnter 'quit' to end the program. "message = ""while message != 'quit': message = input(prompt) print(message)程序会不断询问用户的输入,直到用户输入 'quit' 才退出20

首次遇到这个循环时,message 是一个空字符串,因此Python 进入这个循环。在执行到代码行 message = input(prompt) 时,Python 显示提示消息,并等待用户输入。不管用户输入是什么,都会被赋给变量 message 并打印出来。接下来,Python 重新检查while 语句中的条件。只要用户输入的不是单词 'quit' ,Python 就会再次显示提示消息并等待用户输入。等到用户终于输入‘quit’后,Python 停止执行while 循环,整个程序也到此结束。

7.2.37.2.3 使用标志使用标志我们可以使用标志flag)变量来控制程序的循环逻辑,这样做能使程序更易于处理多种不同事件导致的停止:prompt = "\nTell me something, and I will repeat it back:"prompt += "\nEnter 'quit' to end the program. "active = Truewhile active: message = input(prompt) if message == 'quit': active = False else: print(message)21

这个程序的输出与上一个示例相同。上一个示例将条件测试直接放在了 while 语句中,而这个程序则使用一个标志来指出程序是否处于活动状态。这样,添加测试(如elif 语句)以检查是否发生了其他导致 active 变为False 的事件,就会很容易。

在复杂的程序(比如有很多事件会导致程序停止运行的游戏)中,标志很有用:

在任意一个事件导致活动标志变成 False 时,主游戏循环将退出,此时可显示一条游戏结束的消息,并让用户选择是否要重玩。

7.2.47.2.4 使用使用 breakbreak 退出循环退出循环break 关键字:立即退出循环current_number = 0while True: if current_number > 5: break current_number += 1 print(current_number)22

在所有 Python 循环中都可使用 break 关键字。例如,可使用 break 关键字来退出遍历列表或字典的 for 循环。

(马上要介绍的 continue 关键字也一样)

在这里,只要满足条件 current_number > 5,Python 就会结束这个循环。

7.2.57.2.5 使用使用 continuecontinue 跳过循环跳过循环continue 关键字:跳过当前的循环,返回到循环的开头current_number = 0while True: current_number += 1 if current_number % 2 == 0: continue print(current_number)23

要返回循环开头,并根据条件测试的结果决定是否继续执行循环,可使用continue 语句,它不像break 语句那样不再执行余下的代码并退出整个循环。

在这里,只要满足条件 current_number % 2 == 0,Python 就会跳过当前循环,并返回到循环开头。

7.2.57.2.5 循环控制循环控制试试自己模拟一下这段代码的运行:current_number = 0while True: if current_number > 5: break current_number += 1 if current_number % 2 == 0: continue print(current_number)运行结果135你答对了吗?24
7.2.67.2.6 避免无限循环(死循环)避免无限循环(死循环)我们需要保证 while 循环有结束运行的途经,否则它会一直运行下去。比如下面的循环,我们不小心遗漏了代码行 x += 1,这个循环成为了一个死循环:x = 1while x <= 5: print(x)运行结果111...可以尝试按 Ctrl+C 来结束程序的运行25

与众多其他的编辑器一样,VS Code 也在内嵌的终端窗口中显示输出。要结束无限循环,可在输出区域中单击鼠标,再按Ctrl + C。

注:原理是产生了一个 KeyboardInterrupt 异常

7.37.3 使用使用 whilewhile 循环处理列表和字典循环处理列表和字典假设有一个列表包含新注册但还未验证的网站用户,验证这些用户后,如何将他们移到已验证用户列表中呢?一种办法是使用一个while 循环,在验证用户的同时将其从未验证用户列表中提取出来,再将其加入已验证列表。26
7.37.3 使用使用 whilewhile 循环处理列表和字典循环处理列表和字典让我们来尝试将所有待验证用户变为已验证用户:unconfirmed_users = ['alice', 'brian', 'candace']confirmed_users = []while unconfirmed_users: current_user = unconfirmed_users.pop() print(f"Verifying user: {current_user.title()}") confirmed_users.append(current_user)print("\nThe following users have been confirmed:")for confirmed_user in confirmed_users: print(confirmed_user.title())27

while 循环将不断地运行,直到列表 unconfirmed_users 变成空的。在这个循环中,箭头处 pop() 方法每次从列表 unconfirmed_users 末尾删除一个未验证的用户,并使用 append() 方法将其加入列表 confirmed_users。先是 candace,接下来是 brian,然后是 alice。

7.3.17.3.1 在列表之间移动元素在列表之间移动元素执行后,我们可以看到 confirmed_users 列表中已经存储了之前的待验证用户列表中的用户:运行结果Verifying user: CandaceVerifying user: BrianVerifying user: AliceThe following users have been confirmed:CandaceBrianAlice28
7.3.27.3.2 删除为特定值的所有列表元素删除为特定值的所有列表元素使用列表的 remove() 方法,我们仅能移除首个匹配,结合利用 while 循环,我们可以删除列表中的全部匹配:运行结果['dog', 'cat', 'dog', 'cat', 'rabbit']['dog', 'dog'', 'rabbit']pets = ['dog', 'cat', 'dog', 'cat', 'rabbit']print(pets)while 'cat' in pets: pets.remove('cat')print(pets)29

在这样一个宠物列表中,包含多个值为 ‘cat’ 的元素。要删除所有这些元素,可不断运行一个 while 循环,直到列表中不再包含值 'cat‘。

7.3.27.3.2 使用用户输入填充字典使用用户输入填充字典我们可以通过在 while 循环中不断询问并获取用户输入,来填充字典对象:responses = {}while True: name = input("\nWhat's your name? ") response = input("\nWhat's your opinion? ") responses[name] = response if input("Have more? (yes/no) ") == 'no': break自己运行试试吧!30

这里创建了一个调查程序,其中的循环在每次执行时都提示用户输入被调查者的名字和回答。

我们将收集到的数据存储在一个字典中,就能将回答与被调查者关联起来。

7.47.4 小结小结学习了如何使用 input() 让用户提供信息,并根据需要转为数学习了如何使用 while 循环,并按用户的要求不断地运行学习并见识到了多种控制 while 循环流程的方式学习了如何结合 while 循环来操作列表和字典在下一章中,我们将学习函数,函数能让我们像循环一样复用代码,并使我们编写的代码效率更高,更容易维护和排除故障。31
课后拓展课后拓展了解什么叫做类型转换尝试将用户输入转换为浮点数可选拓展了解 Python 的内置函数 type()了解强弱类型和静态类型的概念,并想想 python 语言的类型初步了解 type hints,了解设计的理念学习包含海象运算符的赋值表达式,并思考何时用合适32

赋值表达式(Python 3.8)