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 "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']
两个要点:
sys.argv[0]是脚本文件名本身,真正的业务参数从sys.argv[1]开始。- 命令行参数同样都是字符串,要做数值运算还得自己
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)
这段是"锦上添花"的配置,初学者了解即可,不必现在折腾。
练习题
- 写一段代码,分别用
,、sep="*"、end=""三种方式输出1 2 3,观察它们的区别。 - 写一个"摄氏度转华氏度"程序:用
input()读入摄氏温度,换算成华氏度(公式F = C * 9 / 5 + 32)并保留两位小数输出。 - 写一个程序,用
input()连续读入你的姓名、年龄、城市,然后用 f-string 输出一句自我介绍;故意把年龄输入成数字后先打印type(age),验证它是str。 - 写一个
say_hello.py,用sys.argv接收一个名字参数(如python say_hello.py 小嘉),输出"你好,小嘉!";若没传参数则提示用法。 - 思考:为什么
input()拿到"18"后直接写age + 1会报错?应该怎么改? - (选做)用
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()隐藏回显。
扩展阅读
- 官方文档 Built-in Functions · print/input:https://docs.python.org/3/library/functions.html
- 官方教程 · 交互式输入与行编辑历史:https://docs.python.org/3/tutorial/interactive.html
- 标准库 getpass:https://docs.python.org/3/library/getpass.html

浙公网安备 33010602011771号