# 第 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 ``` 这是因为终端接收到的是用户键入的一串字符。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`; - [ ] 能回答五道思考题。