Day10 · 输入与输出

Day10 · 输入与输出

阶段:阶段一 · 核心基础 | 前置:Day09 | 技术基准:Python 3.15.0

学习目标

  • 熟练掌握 print() 的五个关键参数(objects/sep/end/file/flush),能控制输出格式
  • 掌握 input() 读取键盘输入,理解它永远返回字符串这一铁律,并会做类型转换
  • 会用 sys.argv 在命令行给脚本传参
  • 了解交互式行编辑与历史回溯(Readline),知道在 Windows / macOS / Linux 上的差异
  • 能独立写出一个"简易加法器"小程序,把输入、运算、输出串起来

程序的本质是"数据的输入 → 处理 → 输出"。前面八天我们写的代码大多是"写死的数据",从今天起,程序要能和人对话了:用户从键盘敲点什么,程序算完再显示出来。这就是输入与输出(Input / Output,简称 I/O)。

一、输出:print 函数

1.1、print 的完整签名

print 在 Python 3 里是一个函数(不是关键字),完整签名如下:

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

五个参数逐个理解:

参数 含义 默认值
*objects 要输出的内容,可变参数,可以一次打多个 无
sep 多个对象之间的分隔符 一个空格 ' '
end 输出结尾追加的字符串(默认换行) 换行 '\n'
file 输出目标,默认屏幕 sys.stdout(标准输出)
flush 是否强制立刻刷新缓冲区 False

小嘉提醒:在 Python 2 里 print 是一条语句,写成 print "hello" 就行;从 Python 3 起它变成了函数,必须加括号。在 3.15 里写 print "hello" 会直接报 SyntaxError。旧教程里的这种写法请直接忽略。

1.2、基本输出与 sep、end

# Author: XiaoJia
print("跟小嘉学习 Python")                 # 输出:跟小嘉学习 Python
print(1, 2, 3)                            # 输出:1 2 3(多个对象用空格隔开)

# sep:自定义分隔符
print("2026", "10", "20", sep="-")        # 输出:2026-10-20
print("name", "小嘉", sep=" = ")          # 输出:name = 小嘉

# end:默认每次 print 结尾换一行;改成空串就不换
print("加载中", end="")
print("...")                              # 输出:加载中...(两行连成一行)

end='' 是"不换行"的常用技巧:想在同一行动态刷新进度(比如倒计时、进度条)时就靠它。

1.3、file 与 flush:把内容输出到别处

file 参数可以把内容写到文件里(Day29 会系统讲文件操作),这里先认识一下:

# Author: XiaoJia
import sys

# 输出到标准错误流(命令行里一般显示为红色)
print("这是一条警告", file=sys.stderr)

# flush=True:立刻把缓冲区内容刷出来,常用于倒计时
import time
for i in range(3, 0, -1):
    print(f"\r倒计时 {i}", end="", flush=True)
    time.sleep(1)
print("\n开始!")

不加 flush=True 时,Python 出于性能考虑会先把输出攒在缓冲区里,等攒够一批或程序结束才真正写到屏幕上——这会导致倒计时看起来"卡住不动",最后一次性跳出来。

1.4、输出格式:f-string 是首选

Day08 已经讲过字符串格式化,这里在"输出"场景下再强调一次优先级:

# Author: XiaoJia
name = "小嘉"
age = 18

# 老式 %(了解即可,不推荐新代码使用)
print("我叫%s,今年%d岁" % (name, age))

# str.format(兼容旧项目时会见到)
print("我叫{},今年{}岁".format(name, age))

# f-string(3.6+,3.15 完全支持,推荐)
print(f"我叫{name},今年{age}岁")

# 对齐与精度
print(f"左对齐:{name:<6}|")
print(f"右对齐:{age:>6}")
print(f"保留两位小数:{3.14159:.2f}")

二、输入:input 函数

2.1、input 永远返回字符串

input([prompt]) -> str

input() 会先在屏幕上打印可选的提示文字 prompt,然后阻塞等待用户敲一行、按回车,把这一行内容(去掉末尾换行符)作为字符串返回。

# Author: XiaoJia
name = input("请输入你的名字:")
print("你好," + name + "!")

# 关键事实:不管你输入什么,input 返回的永远是 str
age = input("请输入你的年龄:")
print(type(age))      # <class 'str'>   哪怕你输入的是 18

小嘉提醒:这是新手最容易踩的坑——输入 18 拿到的是字符串 "18",不是数字 18。直接拿去做加法 age + 1 会报 TypeError: can only concatenate str (not "int") to str。必须先转换。

2.2、类型转换:把字符串变成你要的类型

# Author: XiaoJia
age = int(input("请输入你的年龄:"))        # 转成整数
height = float(input("请输入你的身高(米):"))  # 转成小数

print(f"明年你 {age + 1} 岁")
print(f"身高 {height:.2f} 米")

对应转换关系(Day13 还会再系统讲):int() 转整型、float() 转浮点、str() 转回字符串。

2.3、简易加法器(本天小练习)

把输入、转换、运算、输出串起来:

# Author: XiaoJia
# 简易加法器:读入两个数,输出它们的和
a = float(input("请输入第一个数:"))
b = float(input("请输入第二个数:"))

print(f"{a} + {b} = {a + b}")

运行示例(斜杠后为你在键盘上敲的内容):

请输入第一个数:/ 3.5
请输入第二个数:/ 6.5
3.5 + 6.5 = 10.0

2.4、关于 raw_input:Python 2 遗留,已移除

很多网上的老教程会写 raw_input()。这里明确说明:

  • Python 2 里:raw_input() 返回字符串,input() 会试图把输入当表达式求值(输入不加引号的字符串还会抛 NameError),所以推荐用 raw_input()。
  • Python 3(含 3.15):raw_input() 已被彻底移除,现在只有一个 input(),它的行为就是当年 Python 2 里 raw_input() 的行为——永远返回字符串。

所以你在 3.15 里只需要记住一个函数:input()。看到老教程里的 raw_input(),直接把它替换成 input() 即可。

2.5、输入不可见:getpass

密码这类敏感信息不希望在屏幕上显示出来,用标准库 getpass:

# Author: XiaoJia
import getpass

username = input("用户名:")
password = getpass.getpass("密码:")     # 输入时屏幕上不回显
print(f"你好 {username},密码长度 {len(password)} 位")

三、命令行参数:sys.argv

有时候我们不想让程序运行起来再慢慢提问,而是希望在启动时一次性把参数塞进去,比如:

python demo.py 10 20

这些启动参数就在 sys.argv 这个列表里:

# Author: XiaoJia
import sys

print("脚本文件名:", sys.argv[0])
print("参数个数(不含脚本名):", len(sys.argv) - 1)
print("参数列表:", sys.argv[1:])

用 python demo.py 10 20 hello 运行,输出:

脚本文件名: demo.py
参数个数(不含脚本名): 3
参数列表: ['10', '20', 'hello']

两个要点:

  1. sys.argv[0] 是脚本文件名本身,真正的业务参数从 sys.argv[1] 开始。
  2. 命令行参数同样都是字符串,要做数值运算还得自己 int()/float()。

下面这个"命令行加法器"和上面交互式的版本形成对照:

# Author: XiaoJia
import sys

if len(sys.argv) != 3:
    print("用法:python add.py 数字1 数字2")
else:
    a = float(sys.argv[1])
    b = float(sys.argv[2])
    print(f"{a} + {b} = {a + b}")

四、交互式行编辑与历史回溯

在 >>> 交互模式里敲代码时,其实背后有一套"行编辑 + 历史回溯"机制,熟练之后效率翻倍。

4.1、常用按键

按键 作用
上/下方向键 翻阅历史命令(上一条 / 下一条)
左/右方向键 在当前行内移动光标
Home / End 跳到行首 / 行尾
Ctrl+C 中断当前输入或正在运行的程序
Ctrl+D 退出交互模式(Linux/macOS);Windows 是 Ctrl+Z 再回车
Tab 自动补全(IDLE / 现代 REPL)

4.2、Readline:Emacs 风格快捷键(类 Unix 环境)

在 Linux、macOS 或 Windows 的 Cygwin 环境下,解释器借助 GNU Readline 库支持 Emacs 风格的行编辑。几个最实用的组合键:

快捷键 作用
Ctrl+A 光标跳到行首
Ctrl+E 光标跳到行尾
Ctrl+B / Ctrl+F 光标左移 / 右移一个字符
退格 / Ctrl+D 删除光标左 / 右边字符
Ctrl+K 删掉光标到行尾的内容
Ctrl+Y 粘贴刚才删除的内容
Ctrl+P / Ctrl+N 历史记录上一行 / 下一行

平台说明:Readline 是类 Unix 环境的可选组件;Windows 自带的命令提示符 / PowerShell 控制台不走 Readline,历史回溯靠方向键 ↑↓ 即可。IDLE 又是另一套自己的编辑机制。所以不用刻意背这套 Emacs 键,方向键 + Home/End 已经够日常用了。

4.3、把历史记录保存到文件(进阶)

Readline 环境下,可以用 readline 模块把历史命令存下来,下次开终端还能接着用(Windows 上 readline 模块不存在,下面这段只在类 Unix 环境有意义):

# Author: XiaoJia
# 类 Unix 环境下,把下面几行放进 PYTHONSTARTUP 指向的启动文件即可
import readline
import atexit
import os

history_path = os.path.expanduser("~/.pyhistory")

def _save_history():
    readline.write_history_file(history_path)

if os.path.exists(history_path):
    readline.read_history_file(history_path)

atexit.register(_save_history)

这段是"锦上添花"的配置,初学者了解即可,不必现在折腾。

练习题

  1. 写一段代码,分别用 ,、sep="*"、end="" 三种方式输出 1 2 3,观察它们的区别。
  2. 写一个"摄氏度转华氏度"程序:用 input() 读入摄氏温度,换算成华氏度(公式 F = C * 9 / 5 + 32)并保留两位小数输出。
  3. 写一个程序,用 input() 连续读入你的姓名、年龄、城市,然后用 f-string 输出一句自我介绍;故意把年龄输入成数字后先打印 type(age),验证它是 str。
  4. 写一个 say_hello.py,用 sys.argv 接收一个名字参数(如 python say_hello.py 小嘉),输出"你好,小嘉!";若没传参数则提示用法。
  5. 思考:为什么 input() 拿到 "18" 后直接写 age + 1 会报错?应该怎么改?
  6. (选做)用 getpass 写一个"假装登录"小程序:输入用户名和密码,只要密码长度不少于 6 位就打印"登录成功"。

小结

  • print() 是函数,五个核心参数:objects、sep、end、file、flush;end='' 不换行,flush=True 立即刷新。
  • 输出格式化优先用 f-string(3.15 完全支持)。
  • input() 永远返回字符串,做数值运算前必须 int()/float() 转换。
  • raw_input() 是 Python 2 遗留写法,3.15 已移除,统一用 input()。
  • 命令行参数通过 sys.argv 获取,argv[0] 是脚本名,业务参数从 argv[1] 开始,同样是字符串。
  • 交互式编辑靠方向键翻历史;Readline 的 Emacs 快捷键只在类 Unix 环境生效。
  • 敏感输入用 getpass.getpass() 隐藏回显。

扩展阅读

posted @ 2026-11-02 17:49  小嘉游戏  阅读(2)  评论(0)    收藏  举报