Python中input函数全面解析
input() 是 Python 中用于从用户获取输入的内置函数。它非常有用,特别是在编写需要与用户交互的应用程序时。
1. 基本语法
input([prompt])
2. 参数详解
2.1 prompt 参数
name = input("请输入您的姓名: ")
age = input("请输入您的年龄: ")
3. 基本用法
3.1 简单输入
user_input = input() # 等待用户输入,按回车结束
3.2 带提示的输入
name = input("What's your name? ")
print(f"Hello, {name}!")
3.3 输入类型转换
input()始终返回字符串,需要手动转换类型:
age = int(input("How old are you? ")) # 转换为整数
height = float(input("Your height (in meters): ")) # 转换为浮点数
4. 高级用法
4.1 多行输入处理
print("Enter/Paste your content. Ctrl-D (Unix) or Ctrl-Z (Windows) to save it.")
contents = []
while True:
try:
line = input()
except EOFError:
break
contents.append(line)
4.2 输入验证
while True:
try:
age = int(input("Please enter your age (1-120): "))
if 1 <= age <= 120:
break
print("Age must be between 1 and 120")
except ValueError:
print("Please enter a valid integer")
4.3 密码输入(不显示内容)
import getpass
password = getpass.getpass("Enter your password: ")
4.4 超时输入
import signal
def timeout_handler(signum, frame):
raise TimeoutError("Input timed out")
signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(5) # 5秒超时
try:
user_input = input("You have 5 seconds to answer: ")
except TimeoutError:
user_input = None
finally:
signal.alarm(0) # 取消定时器
5. 安全考虑
5.1 注入风险
直接使用input()获取的内容可能存在安全风险:
# 危险示例 - 不要在实际代码中这样做
user_input = input("Enter something: ")
eval(user_input) # 可能导致任意代码执行
5.2 安全实践
getpass模块6. 底层原理
-
input()函数实际上是sys.stdin.readline()的封装 -
调用流程:
- 显示提示信息(如果有)
- 从标准输入读取一行
- 去除末尾的换行符
- 返回结果字符串
-
可以重定向
sys.stdin来改变输入源:import sys from io import StringIO sys.stdin = StringIO("预设输入\n第二行\n") a = input() # 获取"预设输入" b = input() # 获取"第二行"
7. 性能考虑
-
大量输入时,考虑使用
sys.stdin直接读取:import sys data = sys.stdin.read() # 读取所有输入 -
对于文件输入,直接读取文件比通过
input()逐行读取更高效
8. 跨平台注意事项
-
换行符处理:
- Windows使用
\r\n - Unix使用
\n input()会自动处理这些差异-
编码问题:
- 在非UTF-8环境中可能需要特别处理
- 解决方案:
import sys import codecs sys.stdin = codecs.getreader('utf8')(sys.stdin.detach())
9. 调试技巧
-
模拟用户输入进行测试:
from unittest.mock import patch with patch('builtins.input', side_effect=['John', '25']): name = input("Name: ") age = input("Age: ") print(f"{name} is {age} years old") -
记录用户输入:
def logged_input(prompt): response = input(prompt) with open("input_log.txt", "a") as f: f.write(f"{prompt}{response}\n") return response
作者:门前灯