379 lines
9.8 KiB
Markdown
379 lines
9.8 KiB
Markdown
# 第 1-3 课:输入与输出
|
||
|
||
## 一、本课目标
|
||
|
||
完成本课后,你应该能够:
|
||
|
||
1. 解释程序的输入、处理和输出;
|
||
2. 使用 `input()` 接收用户输入;
|
||
3. 理解 `input()` 得到的结果始终是字符串;
|
||
4. 将输入的数字文本转换成整数或浮点数;
|
||
5. 使用 f-string 输出包含变量的完整句子;
|
||
6. 使用 `print()` 的 `sep` 和 `end` 调整简单的输出格式;
|
||
7. 编写一个能与用户进行基础交互的小程序。
|
||
|
||
## 二、前置知识
|
||
|
||
开始本课前,你应该已经掌握:
|
||
|
||
- 使用 `print()` 输出内容;
|
||
- 创建和使用变量;
|
||
- 区分 `str`、`int`、`float` 和 `bool`;
|
||
- 使用 `int()`、`float()` 和 `str()` 进行简单类型转换;
|
||
- 使用 f-string 将变量放入字符串。
|
||
|
||
## 三、程序的输入、处理和输出
|
||
|
||
很多程序都可以简化成三个阶段:
|
||
|
||
```text
|
||
输入(Input) → 处理(Process) → 输出(Output)
|
||
```
|
||
|
||
例如,一个计算明年年龄的程序:
|
||
|
||
1. 输入:用户输入当前年龄;
|
||
2. 处理:当前年龄加 `1`;
|
||
3. 输出:显示明年的年龄。
|
||
|
||
第一课中的程序只有固定输出。学会输入后,程序就能根据不同用户提供的数据生成不同结果。
|
||
|
||
## 四、使用 `input()` 接收输入
|
||
|
||
最简单的输入代码如下:
|
||
|
||
```python
|
||
user_name = input("请输入你的名字:")
|
||
print(f"你好,{user_name}!")
|
||
```
|
||
|
||
运行到 `input()` 时,程序会暂停并等待用户输入。用户输入内容并按下回车键后,程序才会继续向下执行。
|
||
|
||
`input()` 圆括号中的字符串称为提示语,用于告诉用户应该输入什么。
|
||
|
||
执行过程如下:
|
||
|
||
```text
|
||
程序显示:请输入你的名字:
|
||
用户输入:Bruce
|
||
用户按下回车键
|
||
变量 user_name 保存字符串 "Bruce"
|
||
程序显示:你好,Bruce!
|
||
```
|
||
|
||
## 五、`input()` 的结果始终是字符串
|
||
|
||
无论用户输入看起来像文字、整数还是小数,`input()` 返回的结果都是字符串 `str`。
|
||
|
||
```python
|
||
age = input("请输入你的年龄:")
|
||
print(type(age))
|
||
```
|
||
|
||
如果输入 `18`,类型仍然是:
|
||
|
||
```text
|
||
<class 'str'>
|
||
```
|
||
|
||
这是因为终端接收到的是用户键入的一串字符。Python 不会擅自判断这串字符应该表示姓名、年龄、电话号码还是其他内容。
|
||
|
||
## 六、输入数字后进行类型转换
|
||
|
||
如果输入内容需要参与数学计算,就要先进行类型转换。
|
||
|
||
### 6.1 转换为整数
|
||
|
||
```python
|
||
age_text = input("请输入你的年龄:")
|
||
age = int(age_text)
|
||
next_year_age = age + 1
|
||
|
||
print(f"明年你将 {next_year_age} 岁。")
|
||
```
|
||
|
||
这里特意使用两个变量:
|
||
|
||
- `age_text` 保存用户输入的原始字符串;
|
||
- `age` 保存转换后的整数。
|
||
|
||
这样命名能清楚表达数据转换前后的区别。
|
||
|
||
也可以写成:
|
||
|
||
```python
|
||
age = int(input("请输入你的年龄:"))
|
||
```
|
||
|
||
这种写法更短,但初学阶段不容易观察每一步。建议先掌握分步写法,理解后再使用组合写法。
|
||
|
||
### 6.2 转换为浮点数
|
||
|
||
如果用户可能输入小数,可以使用 `float()`:
|
||
|
||
```python
|
||
daily_hours_text = input("你计划每天学习多少小时:")
|
||
daily_hours = float(daily_hours_text)
|
||
weekly_hours = daily_hours * 7
|
||
|
||
print(f"按照计划,你每周将学习 {weekly_hours} 小时。")
|
||
```
|
||
|
||
## 七、转换失败时会发生什么
|
||
|
||
如果程序执行 `int("十八")`,Python 无法把中文“十八”直接转换成整数,会产生类似错误:
|
||
|
||
```text
|
||
ValueError: invalid literal for int()
|
||
```
|
||
|
||
`ValueError` 可以理解为“数据的值不适合当前操作”。
|
||
|
||
本课练习时,请按照提示输入正确格式的数据。以后学习异常处理时,我们会让程序在用户输入错误后给出友好提示,而不是直接结束。
|
||
|
||
## 八、使用 f-string 组织输出
|
||
|
||
从用户取得数据后,常常要把多个变量组合成容易阅读的结果:
|
||
|
||
```python
|
||
user_name = "Bruce"
|
||
learning_days = 3
|
||
daily_hours = 2.5
|
||
|
||
print(f"{user_name} 已学习 Python {learning_days} 天,每天计划学习 {daily_hours} 小时。")
|
||
```
|
||
|
||
f-string 中:
|
||
|
||
- 引号内的普通文字会原样显示;
|
||
- 花括号中的变量会替换成变量保存的数据;
|
||
- 花括号中也可以放简单计算。
|
||
|
||
例如:
|
||
|
||
```python
|
||
print(f"一周计划学习 {daily_hours * 7} 小时。")
|
||
```
|
||
|
||
为了让代码更容易阅读,较重要或较复杂的计算通常先保存到变量中,再进行输出。
|
||
|
||
## 九、一次接收多个输入
|
||
|
||
程序可以连续调用多次 `input()`:
|
||
|
||
```python
|
||
user_name = input("请输入你的名字:")
|
||
learning_goal = input("请输入你的学习目标:")
|
||
|
||
print(f"学习者:{user_name}")
|
||
print(f"学习目标:{learning_goal}")
|
||
```
|
||
|
||
每次遇到 `input()`,程序都会等待一次输入。输入顺序必须与程序询问顺序一致。
|
||
|
||
## 十、进一步认识 `print()`
|
||
|
||
### 10.1 一次输出多个内容
|
||
|
||
`print()` 可以接收多个内容,中间使用英文逗号分隔:
|
||
|
||
```python
|
||
print("Python", "FastAPI", "Django")
|
||
```
|
||
|
||
默认输出:
|
||
|
||
```text
|
||
Python FastAPI Django
|
||
```
|
||
|
||
注意:代码中的英文逗号负责分隔多个数据,默认显示结果会使用空格连接它们。
|
||
|
||
### 10.2 使用 `sep` 设置分隔符
|
||
|
||
`sep` 是 separator 的缩写,表示多个输出内容之间的分隔符:
|
||
|
||
```python
|
||
print("Python", "FastAPI", "Django", sep=" -> ")
|
||
```
|
||
|
||
输出:
|
||
|
||
```text
|
||
Python -> FastAPI -> Django
|
||
```
|
||
|
||
`sep` 不是需要显示的普通内容,而是传给 `print()` 的命名参数。函数和参数将在后续课程系统讲解,本课先掌握这种常用写法。
|
||
|
||
### 10.3 使用 `end` 设置结尾
|
||
|
||
`print()` 默认在输出结束后换行。可以通过 `end` 改变结尾:
|
||
|
||
```python
|
||
print("正在学习", end=":")
|
||
print("Python")
|
||
```
|
||
|
||
输出:
|
||
|
||
```text
|
||
正在学习:Python
|
||
```
|
||
|
||
第一条 `print()` 没有立即换行,因此第二条内容接在后面。
|
||
|
||
现阶段不要过度使用 `sep` 和 `end`。只有当它们能让输出格式更清楚时才使用。
|
||
|
||
## 十一、空字符串
|
||
|
||
如果用户看到输入提示后没有输入任何内容,直接按下回车键,`input()` 会返回空字符串:
|
||
|
||
```python
|
||
""
|
||
```
|
||
|
||
空字符串是一个长度为零的字符串。它不是 `0`,也不是 `False` 本身。
|
||
|
||
以后学习条件判断时,我们会检查用户是否输入了内容。本课练习时,请按提示提供非空数据。
|
||
|
||
## 十二、运行本课示例
|
||
|
||
在 PowerShell 中执行:
|
||
|
||
```powershell
|
||
cd D:\Code\Python\01_python基础\1_3_输入与输出
|
||
python input_output.py
|
||
```
|
||
|
||
程序会依次要求你输入:
|
||
|
||
1. 姓名或称呼;
|
||
2. 已学习 Python 的天数;
|
||
3. 每天计划学习的小时数;
|
||
4. 学习目标。
|
||
|
||
可以参考以下输入:
|
||
|
||
```text
|
||
Bruce
|
||
3
|
||
2.5
|
||
开发 LLM Agent
|
||
```
|
||
|
||
输入整数和小数时暂时不要使用中文数字或附加单位。例如输入 `3`,不要输入 `3天`。
|
||
|
||
## 十三、示例程序执行过程
|
||
|
||
`input_output.py` 大致完成以下步骤:
|
||
|
||
1. 接收姓名并保存为字符串;
|
||
2. 接收学习天数的原始文本;
|
||
3. 把学习天数转换为整数;
|
||
4. 接收每天学习小时数的原始文本;
|
||
5. 把学习小时数转换为浮点数;
|
||
6. 接收学习目标;
|
||
7. 计算每周计划学习时间;
|
||
8. 使用 f-string 输出个人学习计划。
|
||
|
||
请对照源代码,找出每一步对应的代码。
|
||
|
||
## 十四、常见错误
|
||
|
||
### 14.1 程序像是停止了
|
||
|
||
如果最后显示输入提示但没有出现新的 PowerShell 提示符,程序通常不是卡住,而是在等待你输入内容并按回车键。
|
||
|
||
### 14.2 数字后添加了单位
|
||
|
||
输入:
|
||
|
||
```text
|
||
3天
|
||
```
|
||
|
||
不能直接通过 `int()` 转换。提示要求输入数字时,应只输入:
|
||
|
||
```text
|
||
3
|
||
```
|
||
|
||
单位由程序在输出时添加。
|
||
|
||
### 14.3 把 `input` 写成大写
|
||
|
||
Python 区分大小写。正确名称是 `input`,不是 `Input` 或 `INPUT`。
|
||
|
||
### 14.4 忘记保存输入结果
|
||
|
||
```python
|
||
input("请输入名字:")
|
||
print(user_name)
|
||
```
|
||
|
||
上面的输入没有赋给 `user_name`,之后使用该变量会产生 `NameError`。
|
||
|
||
正确写法:
|
||
|
||
```python
|
||
user_name = input("请输入名字:")
|
||
```
|
||
|
||
### 14.5 字符串不能直接与整数相加
|
||
|
||
```text
|
||
age_text = input("请输入年龄:")
|
||
next_year_age = age_text + 1
|
||
```
|
||
|
||
`age_text` 是字符串,必须先使用 `int()` 转换后再参与加法计算。
|
||
|
||
## 十五、课堂练习
|
||
|
||
打开 `practice.py`,编写一个“Agent 开发学习计划生成器”。程序需要接收用户输入,完成简单计算,并输出一份格式清晰的学习计划。
|
||
|
||
运行命令:
|
||
|
||
```powershell
|
||
python practice.py
|
||
```
|
||
|
||
请至少使用一次:
|
||
|
||
- `input()`;
|
||
- `int()`;
|
||
- `float()`;
|
||
- f-string;
|
||
- 有明确含义的英文变量名。
|
||
|
||
## 十六、思考题
|
||
|
||
1. 为什么用户输入 `18` 后,`input()` 返回的仍然是字符串?
|
||
2. 什么时候应使用 `int()`,什么时候应使用 `float()`?
|
||
3. 如果用户输入 `2.5`,能否使用 `int()` 直接转换?
|
||
4. `print("A", "B", sep="-")` 会输出什么?
|
||
5. 为什么输入数字时不建议让用户同时输入“天”“小时”等单位?
|
||
|
||
## 十七、本课小结
|
||
|
||
- 许多程序都包含输入、处理和输出三个阶段;
|
||
- `input()` 会显示提示并等待用户输入;
|
||
- `input()` 返回的数据始终是字符串;
|
||
- 数字文本参与计算前,通常需要使用 `int()` 或 `float()` 转换;
|
||
- f-string 可以将用户输入、计算结果和固定文字组合起来;
|
||
- `print()` 可以一次输出多个数据;
|
||
- `sep` 可以设置多个数据之间的分隔符;
|
||
- `end` 可以设置输出结尾;
|
||
- 转换数字时,输入内容必须符合对应格式。
|
||
|
||
## 十八、验收标准
|
||
|
||
- [ ] 能使用 `input()` 接收并保存用户输入;
|
||
- [ ] 能证明 `input()` 返回的是字符串;
|
||
- [ ] 能把数字文本转换为整数或浮点数;
|
||
- [ ] 能使用输入的数据进行简单计算;
|
||
- [ ] 能使用 f-string 输出完整句子;
|
||
- [ ] 能使用 `sep` 或 `end` 调整一次输出;
|
||
- [ ] 能完成并运行 `practice.py`;
|
||
- [ ] 能回答五道思考题。
|