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. 底层原理

  1. input()函数实际上是sys.stdin.readline()的封装

  2. 调用流程:

    • 显示提示信息(如果有)
    • 从标准输入读取一行
    • 去除末尾的换行符
    • 返回结果字符串
  3. 可以重定向sys.stdin来改变输入源:

    import sys
    from io import StringIO
    
    sys.stdin = StringIO("预设输入\n第二行\n")
    a = input()  # 获取"预设输入"
    b = input()  # 获取"第二行"
    

7. 性能考虑

  1. 大量输入时,考虑使用sys.stdin直接读取:

    import sys
    data = sys.stdin.read()  # 读取所有输入
    
  2. 对于文件输入,直接读取文件比通过input()逐行读取更高效

8. 跨平台注意事项

  1. 换行符处理:

    • Windows使用\r\n
    • Unix使用\n
    • input()会自动处理这些差异
  2. 编码问题:

    • 在非UTF-8环境中可能需要特别处理
    • 解决方案:
      import sys
      import codecs
      sys.stdin = codecs.getreader('utf8')(sys.stdin.detach())
      

9. 调试技巧

  1. 模拟用户输入进行测试:

    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")
    
  2. 记录用户输入:

    def logged_input(prompt):
        response = input(prompt)
        with open("input_log.txt", "a") as f:
            f.write(f"{prompt}{response}\n")
        return response
    

你可能感兴趣的:(python知识简述,python,开发语言)