如何在 Python 中从键盘读取用户输入
您可能经常希望通过动态响应用户的输入来使 Python 程序更具交互性。学习如何从键盘读取用户输入可以释放令人兴奋的可能性,并且可以使您的代码更加有用。
使用 Python 收集键盘输入的能力使您能够构建能够根据不同用户提供的偏好、决策或数据进行独特响应的程序。通过获取输入并将其分配给变量,您的代码可以对可调整的条件做出反应,而不仅仅是执行静态逻辑流。这可以为个人用户提供个性化的程序。
input()
函数是 Python 中从用户获取键盘数据的最简单方法。调用时,它会要求用户输入您指定的提示,并等待用户键入响应并按 Enter 键,然后再继续。此响应字符串由 input()
返回,因此您可以将其保存到变量或直接使用它。
仅使用 Python,您就可以开始构建交互式程序,在终端内接受用户的可定制数据。获取用户输入是一项基本技能,它可以解锁更动态的 Python 编码,并允许您将简单的脚本提升为个性化应用程序。
如何在 Python 中使用 input()
读取键盘输入
您可以利用 input()
创建健壮且交互式的程序。它为创建基于可调整条件、个性化数据和用户实时决策动态响应的脚本提供了可能性。当您想使用 Python 读取键盘输入时,这是一个理想的选择。
入门非常简单。只需启动 Python 解释器 shell,您就可以立即利用 input()
进行基本交互。
要尝试它,首先打开终端并通过输入 python
并按 Enter 启动 Python REPL。这将显示熟悉的 >>>
Python 提示符,指示 REPL 已准备就绪。使用 input()
,传递括号中的任何字符串:
>>> input("What is your name? ")
What is your name? Vincent
'Vincent'
执行代码后,您在 input()
中指定的字符串将呈现在屏幕上,您将能够输入任何响应。当您按下 Enter 后,您的回复也会打印到屏幕上。这是因为 REPL 自动打印返回值,在本例中为 input()
返回的值。
使用 input()
时的最佳实践是将其分配给稍后可以在代码中使用的变量。例如,您可以要求用户输入他们的名字。将 input()
分配给 name
变量:
>>> name = input("What is your name? ")
What is your name? Vincent
这将打印提示 What is your name? 并暂停,等待键盘输入。用户输入名称并按 Enter 后,文本字符串将存储在 name
变量中。这次,您的输入不会自动打印在 REPL 中,因为变量会存储该值。
现在,您可以在同一会话中的代码的任何部分使用该变量,例如打印个性化问候语:
>>> print(f"Hello there, {name}!")
Hello there, Vincent!
您的程序根据您提供的自定义名称做出反应。它使用您在 input()
请求中提供的名称。
这是使用 Python 键盘输入时的基本模式:
- 调用
input()
并提示解释要输入的内容。 - 将结果分配给一个描述性命名的变量。
- 稍后在代码中使用该变量。
通过遵循此模板,您可以开始构建针对不同用户的自定义数据定制的所有类型的交互式脚本。您的程序可以收集所有类型的输入,例如名称、数字和列表,这使得它在处理用户数据时非常方便。
注意:使用input()
将所有输入处理为字符串文字,用户的输入不会作为代码执行。但是,您应该警惕用户的输入,并在程序中执行它们、在数据库查询中使用它们或以其他方式信任它们之前对其进行评估。
这只是您在交互式程序中使用 input()
时可以采取的初始步骤。您还可以进行其他修改,以确保该函数采用所有方式的数据类型。
使用输入函数读取特定数据类型
input()
的一般规则是收集文本输入并传递字符串。您的代码通常需要数字、布尔值或其他数据类型。例如,您可能需要获取用于数学运算的整数、用于小数计算的浮点数或用于逻辑条件的布尔值。
由于 input()
返回字符串,因此您需要将所有输入转换为目标所需的数据类型,然后再在代码中使用它。如果您要求输入数字,结果仍将以字符串形式返回:
>>> age = input("How old are you? ")
How old are you? 35
>>> type(age)
<class 'str'>
输入函数接受数值。当您检查age
变量时,它的类型是字符串。这是该函数的默认行为。但是如果您需要对这些数字进行计算怎么办?您可以将字符串输入转换为整数和浮点数。
幸运的是,Python 可以轻松地将输入字符串转换为所需的任何数据类型。您可以将 input()
结果传递到类型转换函数,例如 int()
、float()
或 bool()
根据需要对其进行转换。例如,使用 int()
类型转换会将输入转换为所需的整数类型:
>>> age = int(input("How old are you? "))
How old are you? 35
>>> type(age)
<class 'int'>
您将 input()
包装在类型转换函数 int()
中。这会将任何数字字符串转换为整数。现在,当您检查 age
变量的类型时,它会返回 int
。
您可以使用相同的方法将数字输入转换为浮点数。例如,您可能想要记录用户的体重:
>>> weight = float(input("What is your weight in pounds? "))
What is your weight in pounds? 165
>>> weight
165.0
>>> type(weight)
<class 'float'>
在示例中,您将 "165"
转换为浮点值 165.0
。您检查 weight
的类型以确认转换是否按预期进行。
每当需要数值时,您都可以使用 int()
或 float()
。输入始终以字符串开头,但您可以根据需要将其转换为数字。这是需要注意的重要一点,以确保您从交互式程序中获得所需的结果。
在 Python 中使用 input()
处理错误
如果您将 input()
包装在转换函数中,并且它收到的数据类型与预期不同,则可能会发生错误。然后程序将引发 ValueError
并终止。这不是您希望程序运行的方式。尝试下一个示例,看看程序如何拒绝不同的数据类型输入:
>>> age = int(input("How old are you? "))
How old are you? Thirty-five
Traceback (most recent call last):
...
ValueError: invalid literal for int() with base 10: 'Thirty-five'
此代码会引发 ValueError
,因为 Python 无法将 "Thirty- Five"
转换为整数。您的用户可能无法理解该错误。
要处理这种情况,您可以在用户看到异常之前捕获该异常。在下一个示例中,您将在 Python 文件中编写脚本。在您的首选目录中创建一个文件夹。
打开您最喜欢的编辑器并创建一个新的 Python 文件,您应该将其保存到刚刚创建的文件夹中。您可以将其命名为任何您想要的名称。在本例中,它被命名为integer_input.py
。输入以下代码:
while True:
try:
age = int(input("How old are you? "))
except ValueError:
print("Please enter a number for your age.")
else:
break
print(f"Next year, you'll be {age + 1} years old")
上面的代码使用了 try
… except
代码块来处理异常。 try
块内的内容是可能引发错误的代码。在此示例中,代码尝试将用户输入转换为整数。 except
块是在相应的 try 块中出现错误时执行的内容。例如,它可能会捕获 ValueError
。
保存文件,然后在终端中导航到保存此 Python 文件的位置。您可以使用以下命令执行它:
PS> python integer_input.py
How old are you? Thirty-five
Please enter a number for your age.
How old are you? 35
Next year, you'll be 36 years old
您的文件内容将加载,并询问您您多大了?。现在,如果您输入像“Thirty- Five”这样的字符串,您的程序将优雅地处理错误并为您提供有关输入不成功的原因的信息。它会给你另一个机会输入正确的值,并且它将执行到最后。
使用 int()
和 float()
转换输入使您可以灵活地接受数字和文本输入。当输入不正确的类型时,处理 ValueError
案例可以使程序更加健壮和用户友好,并且向用户提供有意义的错误消息。
从用户输入中读取多个条目
在某些情况下,您的程序需要用户输入多个条目。当您的用户对某个问题可能有多个答案时,可能会出现这种情况。
在 Python 中,list
数据类型允许您存储和组织元素序列。列表擅长存储用户的多个条目。您可以请求用户输入多个输入,您的程序可以将这些输入存储在列表中。打开文件夹并创建一个新的 Python 文件 list_input.py
。输入以下代码:
user_colors = input("Enter the three secondary colors separated by commas: ")
colors = [s.strip() for s in user_colors.split(",")]
print(f"List of colors: {colors}")
此 Python 代码接受用户的输入,需要三种用逗号分隔的辅助颜色。您可以使用列表理解来迭代以逗号分隔的子字符串。对于每个子字符串,.strip()
方法会删除任何前导或尾随空格。然后打印出处理后的颜色列表。
在终端中,运行 Python 文件以查看正在运行的代码:
PS> python list_input.py
Enter the three secondary colors separated by commas: orange, purple, green
List of colors: ['orange', 'purple', 'green']
您的程序会将用户输入的任何内容作为字符串放入列表中。然后它会在终端上打印列表。在这种情况下,程序不会检查条目是否正确。例如,您可以输入red、yellow、blue
,它会将它们呈现在终端上。
如果您想在终端上打印之前检查条目并将其与正确答案进行比较,该怎么办?这是可能的。
您可以将 input()
与列表、集合或字典结合使用来制作更加动态的程序,例如测验。创建一个名为 multiple_inputs.py
的新 Python 文件并将其保存在您的文件夹中。在此文件中,添加以下代码以要求用户提供多个输入:
print("Name at least 3 colors in the Kenyan flag.")
kenya_flag_colors = {"green", "black", "red", "white"}
user_colors = set()
while len(user_colors) < 3:
color = input("Enter a color on the Kenyan flag: ")
user_colors.add(color.lower())
if user_colors.issubset(kenya_flag_colors):
print(
"Correct! These colors are all in the Kenyan flag: "
+ ", ".join(user_colors)
)
else:
print(
"Incorrect. The colors of the Kenyan flag are: "
+ ", ".join(kenya_flag_colors)
)
此代码要求用户输入肯尼亚国旗的三种颜色,并通过将输入与 kenya_flag_colors
集进行比较来检查用户是否猜测正确。它使用 while
循环重复提示用户输入颜色并将其添加到 user_colors
中。只要 user_colors
的项目少于三个,循环就会运行。
您可以使用 .lower()
字符串方法将所有输入转换为小写字符串。通过将每种颜色转换为小写,您可以确保比较过程中不区分大小写的匹配,因为 kenya_flag_colors
中的所有颜色也是小写的。
例如,如果用户输入绿色,由于统一的小写转换,比较仍会将其识别为正确答案。
循环结束后,代码会检查用户的每个猜测是否是实际颜色之一。如果是这样,则会打印一条成功消息以及用户的颜色。如果没有,则会使用实际的肯尼亚国旗颜色打印一条失败消息。
现在,您可以在终端中运行 multiple_inputs.py
文件来查看正在运行的代码:
PS> python multiple_inputs.py
Name at least 3 colors in the Kenyan flag.
Enter a color on the Kenyan flag: Red
Enter a color on the Kenyan flag: Yellow
Enter a color on the Kenyan flag: Green
Incorrect. The colors of the Kenyan flag are: green, red, black, white
在这些示例中,您将 input()
与列表或集合一起使用,以重复提示用户输入并收集结果。然后,您可以根据预期值验证输入,以向用户提供反馈。
这是另一个示例,说明如何收集用户输入而不重复提示用户,如上一个示例。它是可扩展的,因为您可以向程序添加更多的多重答案问题。创建另一个 Python 文件并将其命名为 quiz.py
。在文件中,输入以下代码:
questions = {
"What are the four colors of the Kenyan flag? ": {
"green", "black", "red", "white"
},
"What are the three colors of the French flag? ": {
"blue", "red", "white"
},
"How do you spell the first three numbers in Norwegian? ": {
"en", "to", "tre"
},
}
for question, correct in questions.items():
while True:
answers = {
answer.strip().lower() for answer in input(question).split(",")
}
if len(answers) == len(correct):
break
print(f"Please enter {len(correct)} answers separated by comma")
if answers == correct:
print("Correct")
else:
print(f"No, the correct answer is {', '.join(correct)}")
在上面的代码中,您询问用户问题,检查他们的答案并提供反馈。您定义一个名为 questions
的字典,其中包含作为键的问题和作为集合中的值的正确答案。您可以向词典添加更多问题和答案。
该代码使用 .items()
循环遍历字典项目。在循环内部,它进入一个 while True 循环,反复提示用户输入正确数量的答案。
首先使用 .split()
将用户的输入转换为列表,然后将其转换为 set
。然后比较该组的长度,看看用户是否给出了预期的答案数量。如果没有,您将打印一条消息,告诉用户要提供多少个答案并重复循环。一旦答案数量正确,您就可以继续下一个问题。
然后,您可以使用 ==
将用户的答案集与正确的答案集进行比较。如果它们匹配,您将打印一条正确消息。否则,将显示一条消息,显示正确答案。您现在可以在终端中运行该文件来查看正在运行的测验代码:
PS> python quiz.py
What are the four colors of the Kenyan flag? red, white, black
Please enter 4 answers separated by comma
What are the four colors of the Kenyan flag? red, white, black, green
Correct
What are the three colors of the French flag? blue, red, green
No, the correct answer is red, blue, white
How do you spell the first three numbers in Norwegian? en, to, tre
Correct
查看测验教程,了解如何创建更完整的测验应用程序。这还将向您展示如何在更大、更复杂的项目中利用 input()
。
保护敏感用户输入的安全
在某些情况下,您希望隐藏用户在终端上的输入。例如密码、API 密钥、甚至电子邮件地址等输入。在这种情况下,你可以使用标准库包getpass
来达到预期的效果。
getpass
模块是专门为保护终端中的敏感条目而创建的。使用此包时,键盘输入不会打印在屏幕上。你甚至可能认为什么也没发生,但事实确实如此。在以下示例中,您将使用电子邮件条目来展示如何保护程序中的敏感信息。
注意:在使用密码和其他敏感信息(例如 API 密钥)时,您必须确保永远不会将它们提交到 GitHub 或以其他方式泄露它们。使用 getpass
仅保护敏感信息的输入。您仍然需要安全地存储信息。
在教程文件夹中创建一个 Python 文件并将其命名为 sensitive.py
。在此文件中,键入以下代码:
import os
import getpass
def verify_email(email):
allowed_emails = [
email.strip() for email in os.getenv("ALLOWED_EMAILS").split(",")
]
return email in allowed_emails
def main():
email = getpass.getpass("Enter your email address: ")
if verify_email(email):
print("Email is valid. You can proceed.")
else:
print("Incorrect email. Access denied.")
if __name__ == "__main__":
main()
此脚本导入 getpass
并使用它来隐藏电子邮件地址的条目。您还有一个环境变量,它存储在脚本外部。您可以使用环境变量来避免将敏感信息直接添加到代码中。您可以使用 os
模块中的 getenv()
访问环境变量。
您可以使用 name-main 习惯用法来检查 Python 脚本是否正在运行或导入。如果是正在执行的主脚本,那么它会调用 main()
。
getpass.getpass()
函数的作用类似于 input()
函数,但在您键入时不会在屏幕上显示任何内容。在运行该文件之前,您需要将电子邮件值存储在此文件之外。在您的终端中,添加以下内容:
第一个代码片段应在 Windows 上使用,第二个代码片段适用于 Linux + macOS:
PS> set ALLOWED_EMAILS=info@example.com
$ export ALLOWED_EMAILS=info@example.com
这是确保敏感信息不会出现在主程序中的基本方法。组织与项目相关的环境变量的一种方法是将它们存储在 .env
文件中。您必须确保此文件永远不会上传到公共空间,例如 GitHub 或云。
现在运行 sensitive.py
文件并输入您在环境变量中设置的电子邮件:
PS> python sensitive.py
Enter your email:
Email is correct. You can proceed.
当您键入电子邮件地址时,您在终端上看不到任何值。这可确保没有窥探者能够看到您的敏感信息。确认后,您将进入该计划的下一步。如果您的电子邮件地址错误,那么您将无法进入该计划的下一阶段。
使用 PyInputPlus 自动评估用户输入
您可以基于 input()
函数编写健壮且复杂的程序。但是,如果您必须处理所有错误、检查输入类型并处理结果,则此任务会变得复杂。
第三方库可以增强您在终端中接受和处理用户键盘输入的能力。 PyInputPlus 就是这样的库之一,它为您提供了无缝接受和处理用户输入的方便工具。
PyInputPlus 模块是一个 Python 包,它构建并增强了 input()
,用于验证和重新提示用户输入。它由《Automate the Boring Stuff with Python》一书的作者 Al Sweigart 于 2019 年创建,旨在通过提供一系列输入类型和验证选项来减少繁琐的输入验证代码。
您可以在检索输入时指定 min
、max
、greaterThan
等参数以及其他参数。如果用户的输入未通过测试,它将重新提示用户。这意味着您不必编写循环和验证来不断询问用户,直到他们提供有效的输入。其他功能包括超时限制、自定义验证功能以及拒绝输入之前可选的重试限制。
总体而言,PyInputPlus 无需手动处理代码中的无效输入情况。通过在输入函数调用中合并验证和重新提示,PyInputPlus 减少了代码重复,并有助于在 Python 中创建更强大的命令行程序和交互式提示。
以下示例将展示该模块如何减轻您的工作量。首先,您需要在终端中安装 PyInputPlus 库。您应该在虚拟环境中执行此操作。
虚拟环境将阻止库在您的计算机上全局安装,并将仅限于您的项目。在提示符下,输入以下命令来创建虚拟环境:
PS> python -m venv venv
您已创建一个名为 venv
的文件夹。使用以下命令激活此虚拟环境:
第一个代码片段应在 Windows 上使用,第二个代码片段适用于 Linux + macOS:
PS> venv\Scripts\activate
(venv) PS>
$ source venv/bin/activate
(venv)
激活虚拟环境后,您可以安装 PyInputPlus。您将使用 pip
在环境中安装该包。在您的终端中,输入以下命令:
(venv) PS> python -m pip install pyinputplus
成功安装该包后,您可以将其导入到接下来要创建的文件中。
创建一个 Python 文件并将其命名为 inputplus.py
。在文件中,输入以下代码将帮助您试验 PyInputPlus:
import pyinputplus as pyip
age = pyip.inputInt(prompt="Enter your age: ", min=0, max=120)
print(f"Your age is: {age}")
使用此代码,您可以设置您在程序中接受的年龄范围。如果用户输入该范围内的数字,那么您的程序将在控制台中打印年龄,然后终止。如果没有,程序会重新提示用户再次输入年龄:
PS> python inputplus.py
Enter your age: -1
Number must be at minimum 0.
Enter your age: 125
Number must be at maximum 120.
Enter your age: 35
Your age is: 35
正如您在上面看到的,如果用户输入的年龄小于 0 且大于 120(如代码中指定),程序将重新提示用户。一旦提供了可接受的输入,代码就会继续并通过打印年龄来执行。
使用 PyInputPlus,您可以降低使用基本形式的 input()
的复杂性。代码也简短明了,确保您可以构建复杂的交互式程序。
在下一个示例中,您将创建一个在终端中运行的银行应用程序。该示例将展示您可以使用该库来增强input()
。
现在,在同一文件夹中创建另一个 Python 文件。您可以将其命名为 banking_app.py
。在该文件中,您可以键入以下代码:
import pyinputplus as pyip
account_balance = 1000
print("Welcome to REALBank.")
while True:
print(f"\nYour account balance: ${account_balance}")
transaction_type = pyip.inputChoice(["Deposit", "Withdraw", "Exit"])
if transaction_type == "Exit":
break
elif transaction_type == "Deposit":
deposit_amount = pyip.inputInt(
prompt="Enter amount (max $10,000): $", min=0, max=10000
)
account_balance += deposit_amount
print(f"Deposited ${deposit_amount}.")
elif transaction_type == "Withdraw":
withdrawal_amount = pyip.inputInt(
prompt="Enter amount: $", min=0, max=account_balance
)
account_balance -= withdrawal_amount
print(f"Withdrew ${withdrawal_amount}.")
print("\nThank you for choosing REALBank. We hope to see you again soon!")
保存文件后,您可以在终端中运行它。您的虚拟银行应用程序将启动,提示您输入不同的选项。
初始银行账户余额设置为 1000 美元。您可以将其更改为任何正数。程序进入无限循环,显示当前帐户余额并提供三个选项:存款、提款和退出。
系统会提示用户使用 pyip.inputChoice() 选择其中一个选项。 如果用户选择退出,则循环终止,并且程序打印一条告别消息。这种交互性可以允许用户执行多个交易:
PS> python banking_app.py
Welcome to REALBank.
Your account balance: $1000
Please select one of: Deposit, Withdraw, Exit
Deposit
Enter amount (max $10,000): $5000
Deposited $5000.
Your account balance: $6000
Please select one of: Deposit, Withdraw, Exit
如果用户选择存款,则程序会提示他们输入存款金额,限额为 10,000 美元,并且帐户余额会在同一会话中相应更新。
从银行账户提款时也能实现相同的交互性。如果仍在同一会话中,应用程序将自动更新银行余额:
Your account balance: $6000
Please select one of: Deposit, Withdraw, Exit
Withdraw
Enter amount: $4000
Withdrew $4000.
Your account balance: $2000
Please select one of: Deposit, Withdraw, Exit
如果您的用户决定提取的金额超过其银行余额怎么办?您的程序将能够优雅地处理异常,并发出易于理解的消息:
Your account balance: $2000
Please select one of: Deposit, Withdraw, Exit
Withdraw
Enter amount: $4000
Number must be at maximum 2000.
Enter amount: $2000
Withdrew $2000.
Your account balance: $0
Please select one of: Deposit, Withdraw, Exit
根据该代码,用户无法输入高于当前银行余额的金额进行提款。该程序将要求允许的金额继续进行。您还可以选择退出选项继续。因此,PyInputPlus 使您的程序变得动态。
结论
现在,您对在 Python 中处理用户输入有了全面的了解,并且您已经探索了各种技术和模块来增强您的交互式编程技能。
您首先深入研究基础知识,使用 input()
函数收集用户输入并探索确定和操作数据类型的方法。这些基础知识对于创建能够适应不同用户输入的多功能程序至关重要。
接下来,您练习了错误处理策略,确保您的程序优雅地处理意外输入,增强用户体验和程序稳健性。然后,您使用了 getpass
模块,该模块提供了一种安全的方式来接受密码等敏感信息,而无需将其显示在屏幕上。
最后,您使用 PyInputPlus 创建了一个银行应用程序。这不仅增强了您对输入验证的理解,而且展示了这些概念在构建交互式和动态程序中的实际应用。
现在,您可以对银行等现实生活中的实体进行建模,并在终端中制作具有多个答案的复杂的交互式程序。这些知识为创建引人入胜、用户友好的应用程序打开了大门,这些应用程序可以智能地响应用户输入,为您的 Python 编程之旅奠定坚实的基础。
祝贺您完成本教程,并祝您能将这些新发现的技能应用到您未来的项目中!