feat: 初始化 Python 零基础教学课程
This commit is contained in:
16
.gitignore
vendored
Normal file
16
.gitignore
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
# PyCharm 和 IntelliJ 系列编辑器生成的本地项目配置。
|
||||
# 这些文件可能包含个人路径和界面设置,不应作为通用教学范例提交。
|
||||
.idea/
|
||||
|
||||
# Python 运行时生成的字节码缓存。
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
|
||||
# Python 虚拟环境目录。
|
||||
.venv/
|
||||
venv/
|
||||
|
||||
# 本地环境变量文件可能包含密码、密钥或个人配置。
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
366
01_python基础/1_1_hello_world/README.md
Normal file
366
01_python基础/1_1_hello_world/README.md
Normal file
@@ -0,0 +1,366 @@
|
||||
# 第 1-1 课:Hello World——认识 Python 并运行第一个程序
|
||||
|
||||
## 一、本课目标
|
||||
|
||||
完成本课后,你应该能够:
|
||||
|
||||
1. 用自己的话解释 Python、程序和解释器分别是什么;
|
||||
2. 在 PowerShell 中检查 Python 是否可用;
|
||||
3. 看懂一条最基础的 `print()` 语句;
|
||||
4. 使用 `python 文件名.py` 运行 Python 文件;
|
||||
5. 独立编写一个可以输出文字的 Python 程序;
|
||||
6. 根据常见错误信息检查命令、路径、引号和文件扩展名。
|
||||
|
||||
## 二、开始前需要知道什么
|
||||
|
||||
本课不要求你有任何编程基础。
|
||||
|
||||
你只需要知道:电脑中的文件通常有文件名和扩展名。例如:
|
||||
|
||||
- `README.md` 是 Markdown 文档;
|
||||
- `hello_world.py` 是 Python 源代码文件;
|
||||
- `.py` 是 Python 源代码文件常用的扩展名。
|
||||
|
||||
“源代码”就是程序员写给计算机执行的一组文本指令。
|
||||
|
||||
## 三、Python 是什么
|
||||
|
||||
Python 是一种编程语言。编程语言是人与计算机沟通时使用的一套规则。
|
||||
|
||||
人类日常使用中文、英文等自然语言交流;编写程序时,则要使用 Python 能够理解的语法。Python 以语法清晰、容易阅读著称,因此很适合作为第一门编程语言。
|
||||
|
||||
Python 可以用于很多领域,例如:
|
||||
|
||||
- 编写自动化脚本;
|
||||
- 处理 Excel、文本和图片;
|
||||
- 分析数据;
|
||||
- 开发网站后端;
|
||||
- 开发接口;
|
||||
- 人工智能与机器学习;
|
||||
- 编写测试工具。
|
||||
|
||||
本项目主要沿着“Python 基础 → 数据库 → Web 后端”的路线学习。
|
||||
|
||||
## 四、程序、编程语言和解释器
|
||||
|
||||
### 4.1 程序
|
||||
|
||||
程序是一组按照一定顺序执行的指令。
|
||||
|
||||
例如,“显示一句欢迎语”虽然非常简单,但仍然是一个程序。它包含一条明确的指令:把指定文字显示在屏幕上。
|
||||
|
||||
### 4.2 编程语言
|
||||
|
||||
编程语言规定了源代码应该怎样书写。我们必须按照 Python 的语法规则编写代码,否则 Python 无法正确理解我们的意图。
|
||||
|
||||
### 4.3 Python 解释器
|
||||
|
||||
Python 解释器是一个负责读取并执行 Python 代码的软件。
|
||||
|
||||
可以暂时把它想象成一名翻译:
|
||||
|
||||
```text
|
||||
你编写的 Python 代码
|
||||
↓
|
||||
Python 解释器读取并执行
|
||||
↓
|
||||
计算机完成操作并显示结果
|
||||
```
|
||||
|
||||
只创建 `.py` 文件还不够。要运行里面的代码,电脑上还需要安装 Python 解释器。
|
||||
|
||||
## 五、检查当前 Python 环境
|
||||
|
||||
本项目已经检查过当前电脑,结果如下:
|
||||
|
||||
```text
|
||||
Python 版本:Python 3.13.5
|
||||
解释器位置:C:\ProgramData\miniconda3\python.exe
|
||||
可用命令:python
|
||||
不可用命令:py
|
||||
```
|
||||
|
||||
这里的“版本”可以理解为软件的代次。`3.13.5` 分为主版本号、次版本号和修订号。本阶段暂时不需要记忆版本号的细节。
|
||||
|
||||
### 5.1 打开 PowerShell
|
||||
|
||||
PowerShell 是 Windows 中用于输入命令的工具,也称为命令行或终端。
|
||||
|
||||
打开 PowerShell 后输入:
|
||||
|
||||
```powershell
|
||||
python --version
|
||||
```
|
||||
|
||||
正常情况下会显示:
|
||||
|
||||
```text
|
||||
Python 3.13.5
|
||||
```
|
||||
|
||||
命令中的 `--version` 表示“显示版本信息”。
|
||||
|
||||
> 注意:当前电脑不能使用 `py` 命令,所以本教程现阶段统一使用 `python`。
|
||||
|
||||
## 六、认识项目路径
|
||||
|
||||
第一课目录是:
|
||||
|
||||
```text
|
||||
D:\Code\Python\01_python基础\1_1_hello_world
|
||||
```
|
||||
|
||||
在 PowerShell 中,可以使用 `cd` 命令进入该目录:
|
||||
|
||||
```powershell
|
||||
cd D:\Code\Python\01_python基础\1_1_hello_world
|
||||
```
|
||||
|
||||
`cd` 是 Change Directory 的缩写,意思是“切换目录”。
|
||||
|
||||
切换后,可以输入以下命令查看当前目录中的文件:
|
||||
|
||||
```powershell
|
||||
Get-ChildItem
|
||||
```
|
||||
|
||||
你应该能看到:
|
||||
|
||||
```text
|
||||
README.md
|
||||
hello_world.py
|
||||
practice.py
|
||||
```
|
||||
|
||||
## 七、第一个 Python 程序
|
||||
|
||||
打开本课目录中的 `hello_world.py`,可以看到最核心的一行代码:
|
||||
|
||||
```python
|
||||
print("Hello, World!")
|
||||
```
|
||||
|
||||
运行程序:
|
||||
|
||||
```powershell
|
||||
python hello_world.py
|
||||
```
|
||||
|
||||
预期输出如下:
|
||||
|
||||
```text
|
||||
Hello, World!
|
||||
欢迎开始学习 Python!
|
||||
这是我的第一个 Python 程序。
|
||||
```
|
||||
|
||||
## 八、逐步理解第一行代码
|
||||
|
||||
```python
|
||||
print("Hello, World!")
|
||||
```
|
||||
|
||||
可以把这行代码拆成四部分:
|
||||
|
||||
### 8.1 `print`
|
||||
|
||||
`print` 的常见中文含义是“打印”。在 Python 中,它用于把内容输出到屏幕。
|
||||
|
||||
这里的“打印”不是让打印机打印纸张,而是在终端中显示内容。
|
||||
|
||||
### 8.2 圆括号 `()`
|
||||
|
||||
圆括号中放的是希望交给 `print` 处理的内容。
|
||||
|
||||
现在可以先把它理解为:告诉 `print` 要显示什么。函数的完整概念会在后续课程中专门讲解。
|
||||
|
||||
### 8.3 双引号 `""`
|
||||
|
||||
双引号包围的内容是一段文字。在 Python 中,这类文字称为“字符串”(String)。
|
||||
|
||||
例如:
|
||||
|
||||
```python
|
||||
"Hello, World!"
|
||||
"我正在学习 Python"
|
||||
"123"
|
||||
```
|
||||
|
||||
第三个例子虽然看起来是数字,但因为它被引号包围,所以当前应把它看作文字。数据类型会在下一课详细学习。
|
||||
|
||||
### 8.4 感叹号和逗号
|
||||
|
||||
引号里面的逗号和感叹号只是需要显示的文字内容,不是 Python 的特殊指令。
|
||||
|
||||
## 九、代码是怎样执行的
|
||||
|
||||
执行下面的命令时:
|
||||
|
||||
```powershell
|
||||
python hello_world.py
|
||||
```
|
||||
|
||||
大致会经历以下过程:
|
||||
|
||||
1. PowerShell 找到名为 `python` 的解释器;
|
||||
2. Python 解释器打开 `hello_world.py`;
|
||||
3. 解释器通常从上到下读取代码;
|
||||
4. 每遇到一条 `print()` 语句,就输出对应内容;
|
||||
5. 所有代码执行结束后,程序退出,PowerShell 重新等待命令。
|
||||
|
||||
因此,交换几条 `print()` 语句的位置,输出顺序也会发生变化。
|
||||
|
||||
## 十、中文、英文和引号
|
||||
|
||||
Python 3 可以直接处理中文文字:
|
||||
|
||||
```python
|
||||
print("你好,Python!")
|
||||
```
|
||||
|
||||
字符串也可以使用单引号:
|
||||
|
||||
```python
|
||||
print('你好,Python!')
|
||||
```
|
||||
|
||||
本课程初期示例统一优先使用英文双引号,保持代码风格一致。
|
||||
|
||||
需要特别注意:代码中的引号和括号应使用英文半角符号。
|
||||
|
||||
正确:
|
||||
|
||||
```python
|
||||
print("你好")
|
||||
```
|
||||
|
||||
错误:
|
||||
|
||||
```text
|
||||
print(“你好”)
|
||||
```
|
||||
|
||||
错误示例使用了中文全角括号和中文引号,Python 无法把它们识别为正确语法。
|
||||
|
||||
## 十一、注释是什么
|
||||
|
||||
Python 中以半角井号 `#` 开头的内容称为注释。
|
||||
|
||||
```python
|
||||
# 这是一行注释,Python 不会把它当作需要执行的指令。
|
||||
print("这行代码会执行")
|
||||
```
|
||||
|
||||
注释的主要作用是帮助人理解代码。Python 解释器运行程序时,会忽略注释内容。
|
||||
|
||||
好的注释应解释代码的目的或容易误解的地方。后续课程中的示例会保留详细中文注释,帮助你理解代码。
|
||||
|
||||
## 十二、常见错误与解决方法
|
||||
|
||||
### 12.1 找不到 `python` 命令
|
||||
|
||||
可能看到类似提示:
|
||||
|
||||
```text
|
||||
python 不是内部或外部命令
|
||||
```
|
||||
|
||||
这通常表示 Python 没有安装,或者解释器路径没有加入系统环境变量。当前电脑已经可以使用 `python`,正常情况下不会遇到该问题。
|
||||
|
||||
### 12.2 找不到代码文件
|
||||
|
||||
可能看到:
|
||||
|
||||
```text
|
||||
can't open file 'hello_world.py'
|
||||
```
|
||||
|
||||
常见原因是当前 PowerShell 所在目录不正确,或者文件名拼写错误。
|
||||
|
||||
先进入正确目录,再运行文件:
|
||||
|
||||
```powershell
|
||||
cd D:\Code\Python\01_python基础\1_1_hello_world
|
||||
python hello_world.py
|
||||
```
|
||||
|
||||
### 12.3 `SyntaxError`
|
||||
|
||||
`SyntaxError` 表示“语法错误”,说明代码不符合 Python 的书写规则。
|
||||
|
||||
初学阶段常见原因包括:
|
||||
|
||||
- 漏写右括号;
|
||||
- 漏写一侧引号;
|
||||
- 使用中文括号或中文引号;
|
||||
- 不小心输入了多余字符。
|
||||
|
||||
### 12.4 文件实际是 `.py.txt`
|
||||
|
||||
Windows 有时会隐藏已知文件的扩展名。看起来叫 `hello_world.py` 的文件,实际可能是 `hello_world.py.txt`。
|
||||
|
||||
可以在文件资源管理器中开启“查看 → 显示 → 文件扩展名”,确认文件真实名称。
|
||||
|
||||
### 12.5 不要害怕错误信息
|
||||
|
||||
错误信息不是对学习者的批评,而是 Python 提供的排查线索。遇到错误时,可以按下面的顺序处理:
|
||||
|
||||
1. 找到错误信息最后几行;
|
||||
2. 确认出错的文件名和行号;
|
||||
3. 检查该行及上一行的引号、括号和拼写;
|
||||
4. 修改后重新运行;
|
||||
5. 如果仍无法解决,保留完整错误信息并进行提问。
|
||||
|
||||
## 十三、课堂练习
|
||||
|
||||
打开 `practice.py`,根据文件中的中文注释完成以下任务:
|
||||
|
||||
1. 输出你的名字或称呼;
|
||||
2. 输出“我正在学习 Python”;
|
||||
3. 输出你学习 Python 的一个目标;
|
||||
4. 使用一条 `print()` 输出由星号组成的分隔线;
|
||||
5. 运行程序,并观察输出顺序是否与代码顺序一致。
|
||||
|
||||
运行练习文件:
|
||||
|
||||
```powershell
|
||||
python practice.py
|
||||
```
|
||||
|
||||
本次不提前提供答案。你完成后可以把代码交给我检查,我会先指出做得正确的地方,再解释可以改进的内容。
|
||||
|
||||
## 十四、思考题
|
||||
|
||||
请先自己思考,不需要立即查资料:
|
||||
|
||||
1. 为什么只有 `.py` 文件,却没有 Python 解释器时,程序不能运行?
|
||||
2. `print("123")` 中的 `123` 目前应该看作数字还是文字?为什么?
|
||||
3. 如果把三条 `print()` 语句的顺序颠倒,输出会发生什么变化?
|
||||
4. 注释会不会显示在程序运行结果中?
|
||||
|
||||
## 十五、本课小结
|
||||
|
||||
本课最重要的知识点是:
|
||||
|
||||
- Python 是一种编程语言;
|
||||
- Python 解释器负责读取和执行 `.py` 文件;
|
||||
- 当前电脑使用 `python` 命令运行 Python 3.13.5;
|
||||
- `print()` 可以把内容输出到终端;
|
||||
- 引号包围的文字称为字符串;
|
||||
- Python 通常按照代码从上到下的顺序执行;
|
||||
- `#` 开头的注释用于帮助人阅读代码,不会作为指令执行;
|
||||
- 遇到错误时,应关注文件名、行号和错误类型。
|
||||
|
||||
## 十六、验收标准
|
||||
|
||||
完成以下所有事项,即可认为通过第一课:
|
||||
|
||||
- [ ] 能在 PowerShell 中执行 `python --version`;
|
||||
- [ ] 能进入本课目录;
|
||||
- [ ] 能成功运行 `python hello_world.py`;
|
||||
- [ ] 能解释 `print()`、圆括号和引号的大致作用;
|
||||
- [ ] 能独立完成 `practice.py` 中的练习;
|
||||
- [ ] 能成功运行练习文件;
|
||||
- [ ] 能回答四道思考题。
|
||||
|
||||
完成后,把 `practice.py` 的内容或运行结果发给我。检查通过后,我们再进入第 1-2 课“变量与数据类型”。
|
||||
12
01_python基础/1_1_hello_world/hello_world.py
Normal file
12
01_python基础/1_1_hello_world/hello_world.py
Normal file
@@ -0,0 +1,12 @@
|
||||
# 本文件是整个课程的第一个 Python 示例程序。
|
||||
# 以半角井号开头的内容是注释,Python 运行程序时会忽略注释。
|
||||
|
||||
# print() 用于把圆括号中的内容输出到终端。
|
||||
# 双引号包围的内容是一段文字,在 Python 中称为字符串。
|
||||
print("Hello, World!")
|
||||
|
||||
# Python 3 支持直接输出中文,不需要进行额外设置。
|
||||
print("欢迎开始学习 Python!")
|
||||
|
||||
# Python 通常按照代码从上到下的顺序执行,因此这句话最后显示。
|
||||
print("这是我的第一个 Python 程序。")
|
||||
25
01_python基础/1_1_hello_world/practice.py
Normal file
25
01_python基础/1_1_hello_world/practice.py
Normal file
@@ -0,0 +1,25 @@
|
||||
# 第 1-1 课课堂练习
|
||||
#
|
||||
# 完成方式:
|
||||
# 1. 阅读每道题上方的中文注释。
|
||||
# 2. 在注释下方独立编写一条 print() 语句。
|
||||
# 3. 不要删除题目注释,它们可以帮助你核对是否完成了全部任务。
|
||||
# 4. 完成后在当前目录运行:python practice.py
|
||||
|
||||
|
||||
# 练习一:输出你的名字或希望别人称呼你的名称。
|
||||
# 请在下一行开始编写代码。
|
||||
|
||||
# 练习二:输出文字“我正在学习 Python”。
|
||||
# 请在下一行开始编写代码。
|
||||
|
||||
# 练习三:输出你学习 Python 的一个目标。
|
||||
# 示例目标可以是“我希望能独立开发一个网站后端”,但请尽量写你自己的目标。
|
||||
# 请在下一行开始编写代码。
|
||||
|
||||
# 练习四:输出一条由多个星号组成的分隔线。
|
||||
# 预期形式类似:********************
|
||||
# 请在下一行开始编写代码。
|
||||
|
||||
# 练习五:运行本文件,观察终端中的输出顺序是否与代码顺序一致。
|
||||
# 这道题不需要新增代码,请在运行后思考并记录自己的结论。
|
||||
472
01_python基础/1_2_变量与数据类型/README.md
Normal file
472
01_python基础/1_2_变量与数据类型/README.md
Normal file
@@ -0,0 +1,472 @@
|
||||
# 第 1-2 课:变量与数据类型
|
||||
|
||||
## 一、本课目标
|
||||
|
||||
完成本课后,你应该能够:
|
||||
|
||||
1. 解释变量是什么,以及为什么程序需要变量;
|
||||
2. 使用赋值符号 `=` 创建变量;
|
||||
3. 区分字符串、整数、浮点数和布尔值;
|
||||
4. 使用 `type()` 查看数据类型;
|
||||
5. 遵守 Python 变量命名的基本规则;
|
||||
6. 使用变量进行简单计算和文字输出;
|
||||
7. 使用 `int()`、`float()`、`str()` 完成简单类型转换;
|
||||
8. 看懂变量重新赋值后发生的变化。
|
||||
|
||||
## 二、前置知识
|
||||
|
||||
开始本课前,你应该已经能够:
|
||||
|
||||
- 使用 `python 文件名.py` 运行 Python 程序;
|
||||
- 使用 `print()` 输出文字;
|
||||
- 知道引号包围的内容是字符串;
|
||||
- 知道 `#` 开头的内容是注释。
|
||||
|
||||
## 三、变量是什么
|
||||
|
||||
变量(Variable)是程序中用于保存数据的名称。
|
||||
|
||||
可以把变量想象成一个贴有标签的盒子:
|
||||
|
||||
```text
|
||||
标签:user_name
|
||||
盒子中的数据:"Bruce"
|
||||
```
|
||||
|
||||
在 Python 中可以这样写:
|
||||
|
||||
```python
|
||||
user_name = "Bruce"
|
||||
```
|
||||
|
||||
这行代码表示:把字符串 `"Bruce"` 保存起来,并使用名称 `user_name` 指向它。
|
||||
|
||||
之后只要使用变量名,就能取得对应的数据:
|
||||
|
||||
```python
|
||||
print(user_name)
|
||||
```
|
||||
|
||||
变量的价值在于:数据可以被保存、重复使用和修改,不必在每个地方重复写相同内容。
|
||||
|
||||
## 四、认识赋值符号
|
||||
|
||||
下面代码中的 `=` 称为赋值符号:
|
||||
|
||||
```python
|
||||
age = 18
|
||||
```
|
||||
|
||||
赋值操作按照“先看右边,再交给左边”的方式理解:
|
||||
|
||||
1. Python 先得到右边的整数 `18`;
|
||||
2. 再让左边的变量名 `age` 指向这个数据。
|
||||
|
||||
这里的 `=` 暂时不要理解成数学中的“左右相等”。Python 中判断两个值是否相等会使用 `==`,将在条件判断课程中学习。
|
||||
|
||||
## 五、四种基础数据类型
|
||||
|
||||
数据类型用于描述一个数据属于哪一类,以及它通常可以参与哪些操作。
|
||||
|
||||
### 5.1 字符串 `str`
|
||||
|
||||
字符串(String,类型名为 `str`)用于表示文字:
|
||||
|
||||
```python
|
||||
user_name = "Bruce"
|
||||
learning_goal = "开发 LLM Agent"
|
||||
```
|
||||
|
||||
字符串必须使用成对的单引号或双引号包围。
|
||||
|
||||
即使内容看起来像数字,只要有引号,它仍然是字符串:
|
||||
|
||||
```python
|
||||
phone_number = "13800000000"
|
||||
```
|
||||
|
||||
电话号码通常不用于数学计算,因此使用字符串保存更合适。
|
||||
|
||||
### 5.2 整数 `int`
|
||||
|
||||
整数(Integer,类型名为 `int`)是不带小数部分的数字:
|
||||
|
||||
```python
|
||||
age = 18
|
||||
course_count = 8
|
||||
temperature = -2
|
||||
```
|
||||
|
||||
整数不需要引号,可以参加加、减、乘、除等数学运算。
|
||||
|
||||
### 5.3 浮点数 `float`
|
||||
|
||||
浮点数(Floating-point Number,类型名为 `float`)通常用于表示带小数部分的数字:
|
||||
|
||||
```python
|
||||
height = 1.75
|
||||
price = 19.9
|
||||
progress = 0.25
|
||||
```
|
||||
|
||||
“浮点数”是计算机领域的常用名称,初学阶段可以先把它理解为小数。
|
||||
|
||||
### 5.4 布尔值 `bool`
|
||||
|
||||
布尔值(Boolean,类型名为 `bool`)只有两个值:
|
||||
|
||||
```python
|
||||
is_learning = True
|
||||
is_finished = False
|
||||
```
|
||||
|
||||
- `True` 表示真、是、成立;
|
||||
- `False` 表示假、否、不成立。
|
||||
|
||||
首字母必须大写,并且不能添加引号。`"True"` 是字符串,不是布尔值。
|
||||
|
||||
布尔值经常用于记录某个状态,例如:
|
||||
|
||||
- 用户是否登录;
|
||||
- 任务是否完成;
|
||||
- 数据是否有效;
|
||||
- 接口调用是否成功。
|
||||
|
||||
## 六、使用 `type()` 查看数据类型
|
||||
|
||||
`type()` 可以告诉我们一个数据的类型:
|
||||
|
||||
```python
|
||||
user_name = "Bruce"
|
||||
age = 18
|
||||
|
||||
print(type(user_name))
|
||||
print(type(age))
|
||||
```
|
||||
|
||||
输出结果:
|
||||
|
||||
```text
|
||||
<class 'str'>
|
||||
<class 'int'>
|
||||
```
|
||||
|
||||
目前只需要关注最后的 `str` 和 `int`。`class` 与类的概念会在面向对象阶段详细学习。
|
||||
|
||||
`type()` 主要用于学习和排查问题。实际开发中,不需要为每一个变量都输出类型。
|
||||
|
||||
## 七、变量与字符串的区别
|
||||
|
||||
请比较:
|
||||
|
||||
```python
|
||||
user_name = "Bruce"
|
||||
|
||||
print(user_name)
|
||||
print("user_name")
|
||||
```
|
||||
|
||||
输出为:
|
||||
|
||||
```text
|
||||
Bruce
|
||||
user_name
|
||||
```
|
||||
|
||||
原因是:
|
||||
|
||||
- `user_name` 没有引号,Python 会把它当作变量名,并读取变量保存的数据;
|
||||
- `"user_name"` 有引号,Python 会把它当作普通文字直接输出。
|
||||
|
||||
这是初学阶段非常重要的区别。
|
||||
|
||||
## 八、变量命名规则
|
||||
|
||||
### 8.1 必须遵守的规则
|
||||
|
||||
Python 变量名:
|
||||
|
||||
1. 可以包含英文字母、数字和下划线;
|
||||
2. 不能以数字开头;
|
||||
3. 不能包含空格、连字符等符号;
|
||||
4. 区分英文字母大小写;
|
||||
5. 不能使用 Python 关键字。
|
||||
|
||||
正确示例:
|
||||
|
||||
```python
|
||||
user_name = "Bruce"
|
||||
age2 = 18
|
||||
course_count = 8
|
||||
```
|
||||
|
||||
错误示意:
|
||||
|
||||
```text
|
||||
2age = 18 # 不能以数字开头
|
||||
user name = "Bruce" # 不能包含空格
|
||||
user-name = "Bruce" # 不能使用连字符连接单词
|
||||
```
|
||||
|
||||
错误示意放在文本代码块中,是为了避免它们被误认为可运行的 Python 代码。
|
||||
|
||||
### 8.2 推荐的命名风格
|
||||
|
||||
Python 普通变量通常使用蛇形命名法(snake_case):
|
||||
|
||||
```python
|
||||
user_name = "Bruce"
|
||||
learning_days = 1
|
||||
is_course_finished = False
|
||||
```
|
||||
|
||||
蛇形命名法使用小写英文单词,并用下划线连接多个单词。
|
||||
|
||||
变量名应该能说明数据的含义。推荐使用 `learning_days`,不推荐使用 `a`、`x1` 这类难以理解的名称。
|
||||
|
||||
代码标识符使用英文,注释和教学文档使用中文。这样既符合常见开发习惯,也便于与第三方库和团队代码协作。
|
||||
|
||||
## 九、使用变量进行计算
|
||||
|
||||
整数和浮点数可以参与计算:
|
||||
|
||||
```python
|
||||
completed_lessons = 1
|
||||
new_lessons = 1
|
||||
total_lessons = completed_lessons + new_lessons
|
||||
|
||||
print(total_lessons)
|
||||
```
|
||||
|
||||
输出:
|
||||
|
||||
```text
|
||||
2
|
||||
```
|
||||
|
||||
代码执行过程是:
|
||||
|
||||
1. `completed_lessons` 保存整数 `1`;
|
||||
2. `new_lessons` 保存整数 `1`;
|
||||
3. Python 读取两个变量中的整数并相加;
|
||||
4. 计算结果 `2` 保存到 `total_lessons`;
|
||||
5. `print()` 输出结果。
|
||||
|
||||
## 十、变量可以重新赋值
|
||||
|
||||
变量保存的数据可以改变:
|
||||
|
||||
```python
|
||||
learning_days = 1
|
||||
print(learning_days)
|
||||
|
||||
learning_days = 2
|
||||
print(learning_days)
|
||||
```
|
||||
|
||||
输出:
|
||||
|
||||
```text
|
||||
1
|
||||
2
|
||||
```
|
||||
|
||||
第二次赋值后,再使用 `learning_days` 时得到的是新数据 `2`。
|
||||
|
||||
Python 变量甚至可以在运行过程中指向不同类型的数据:
|
||||
|
||||
```python
|
||||
value = 10
|
||||
value = "十"
|
||||
```
|
||||
|
||||
这种能力称为动态类型。它很灵活,但随意改变变量的数据类型容易让代码难以理解,所以实际开发中应让同一个变量尽量保持含义和类型稳定。
|
||||
|
||||
## 十一、简单的类型转换
|
||||
|
||||
有时需要把一种类型的数据转换成另一种类型。
|
||||
|
||||
### 11.1 字符串转换为整数
|
||||
|
||||
```python
|
||||
age_text = "18"
|
||||
age = int(age_text)
|
||||
|
||||
print(age)
|
||||
print(type(age))
|
||||
```
|
||||
|
||||
`int()` 会尝试把合适的内容转换为整数。
|
||||
|
||||
### 11.2 字符串转换为浮点数
|
||||
|
||||
```python
|
||||
price_text = "19.9"
|
||||
price = float(price_text)
|
||||
```
|
||||
|
||||
### 11.3 数字转换为字符串
|
||||
|
||||
```python
|
||||
course_count = 8
|
||||
course_count_text = str(course_count)
|
||||
```
|
||||
|
||||
### 11.4 转换并不总能成功
|
||||
|
||||
下面的转换会报错:
|
||||
|
||||
```text
|
||||
int("十八")
|
||||
```
|
||||
|
||||
因为 Python 不知道应该怎样把中文文字“十八”直接转换成整数。遇到无法转换的数据时,会产生错误。异常处理会在后续课程学习。
|
||||
|
||||
## 十二、使用格式化字符串输出变量
|
||||
|
||||
如果想把固定文字和变量数据组合起来,可以使用格式化字符串,简称 f-string:
|
||||
|
||||
```python
|
||||
user_name = "Bruce"
|
||||
learning_days = 2
|
||||
|
||||
print(f"{user_name} 已经学习 Python {learning_days} 天。")
|
||||
```
|
||||
|
||||
输出:
|
||||
|
||||
```text
|
||||
Bruce 已经学习 Python 2 天。
|
||||
```
|
||||
|
||||
使用方法:
|
||||
|
||||
1. 在字符串开始引号前写小写字母 `f`;
|
||||
2. 在字符串中使用花括号 `{}` 包围变量名;
|
||||
3. Python 会把花括号中的变量替换成变量保存的数据。
|
||||
|
||||
f-string 是现代 Python 中非常常用、易读的字符串格式化方式。
|
||||
|
||||
## 十三、当前电脑上有两个 Python 解释器
|
||||
|
||||
第一课练习结果显示:
|
||||
|
||||
```text
|
||||
PowerShell:Python 3.13.5
|
||||
PyCharm:Python 3.11.15
|
||||
```
|
||||
|
||||
这说明电脑上安装了不止一个 Python 解释器。它们就像同一种工具的两个版本。
|
||||
|
||||
目前的基础代码可以在两个版本中运行,因此不影响学习。以后安装第三方库时,需要注意“库安装到了哪个解释器”,否则可能出现已经安装但代码仍提示找不到的情况。
|
||||
|
||||
现阶段请记住:
|
||||
|
||||
- 在 PowerShell 中,本项目默认使用 `python` 命令;
|
||||
- 在 PyCharm 中,运行按钮会使用项目设置中选择的解释器;
|
||||
- 看到不同 Python 版本不必紧张,但提问错误时应保留完整的运行命令和解释器路径。
|
||||
|
||||
虚拟环境和依赖管理将在 Python 进阶阶段系统学习。
|
||||
|
||||
## 十四、运行本课示例
|
||||
|
||||
在 PowerShell 中执行:
|
||||
|
||||
```powershell
|
||||
cd D:\Code\Python\01_python基础\1_2_变量与数据类型
|
||||
python variables_and_types.py
|
||||
```
|
||||
|
||||
运行时请对照代码和输出,重点观察:
|
||||
|
||||
- 变量名与字符串的区别;
|
||||
- 四种数据类型的 `type()` 结果;
|
||||
- 变量重新赋值前后的变化;
|
||||
- f-string 如何把变量放入一句话中。
|
||||
|
||||
## 十五、常见错误
|
||||
|
||||
### 15.1 使用了不存在的变量
|
||||
|
||||
```text
|
||||
NameError: name 'user_name' is not defined
|
||||
```
|
||||
|
||||
常见原因:
|
||||
|
||||
- 变量还没有赋值就被使用;
|
||||
- 变量名拼写错误;
|
||||
- 大小写不一致。
|
||||
|
||||
### 15.2 忘记给字符串加引号
|
||||
|
||||
```python
|
||||
user_name = Bruce
|
||||
```
|
||||
|
||||
Python 会把 `Bruce` 当成变量名,而不是文字。如果这个变量不存在,就会产生 `NameError`。
|
||||
|
||||
正确写法:
|
||||
|
||||
```python
|
||||
user_name = "Bruce"
|
||||
```
|
||||
|
||||
### 15.3 把赋值方向写反
|
||||
|
||||
```text
|
||||
18 = age
|
||||
```
|
||||
|
||||
变量名应写在赋值符号左边,数据或计算表达式写在右边。
|
||||
|
||||
### 15.4 类型不同导致操作失败
|
||||
|
||||
```text
|
||||
"18" + 1
|
||||
```
|
||||
|
||||
`"18"` 是字符串,`1` 是整数。两种不同含义的数据不能直接进行这个加法操作。需要先确认业务目的,再进行合适的类型转换。
|
||||
|
||||
## 十六、课堂练习
|
||||
|
||||
打开 `practice.py`,按照中文注释完成练习。你将创建一组描述自己学习情况的变量,并输出一段学习档案。
|
||||
|
||||
运行命令:
|
||||
|
||||
```powershell
|
||||
python practice.py
|
||||
```
|
||||
|
||||
本课仍然不提前提供答案。完成后告诉我,我会读取并运行你的代码进行验收。
|
||||
|
||||
## 十七、思考题
|
||||
|
||||
1. `age = 18` 和 `age = "18"` 有什么区别?
|
||||
2. 为什么 `print(user_name)` 和 `print("user_name")` 的结果不同?
|
||||
3. `True` 与 `"True"` 是同一种数据类型吗?
|
||||
4. 为什么推荐使用 `learning_days`,而不是 `a`?
|
||||
5. 如果先执行 `score = 10`,再执行 `score = 20`,最后输出的值是什么?
|
||||
|
||||
## 十八、本课小结
|
||||
|
||||
- 变量是程序中保存和引用数据的名称;
|
||||
- `=` 用于把右边的数据赋给左边的变量;
|
||||
- `str` 表示字符串,`int` 表示整数,`float` 表示浮点数,`bool` 表示布尔值;
|
||||
- `type()` 可以查看数据类型;
|
||||
- 变量名与带引号的字符串含义不同;
|
||||
- 变量名应清晰,并优先使用蛇形命名法;
|
||||
- 变量可以用于计算,也可以被重新赋值;
|
||||
- `int()`、`float()` 和 `str()` 可以进行基础类型转换;
|
||||
- f-string 可以清晰地组合固定文字和变量数据。
|
||||
|
||||
## 十九、验收标准
|
||||
|
||||
- [ ] 能解释变量和赋值的含义;
|
||||
- [ ] 能创建字符串、整数、浮点数和布尔值变量;
|
||||
- [ ] 能使用 `type()` 查看变量类型;
|
||||
- [ ] 能判断一个变量名是否符合基本规则;
|
||||
- [ ] 能使用变量完成简单计算;
|
||||
- [ ] 能使用 f-string 输出包含变量的句子;
|
||||
- [ ] 能完成并运行 `practice.py`;
|
||||
- [ ] 能回答五道思考题。
|
||||
41
01_python基础/1_2_变量与数据类型/practice.py
Normal file
41
01_python基础/1_2_变量与数据类型/practice.py
Normal file
@@ -0,0 +1,41 @@
|
||||
# 第 1-2 课课堂练习:创建个人 Python 学习档案
|
||||
#
|
||||
# 完成要求:
|
||||
# 1. 根据每道题的注释,在指定位置编写代码。
|
||||
# 2. 变量名使用有意义的英文蛇形命名法。
|
||||
# 3. 字符串、整数、浮点数和布尔值的数据类型必须正确。
|
||||
# 4. 不要删除题目注释。
|
||||
# 5. 完成后运行:python practice.py
|
||||
|
||||
|
||||
# 练习一:创建一个字符串变量 user_name,保存你的名字或称呼。
|
||||
|
||||
# 练习二:创建一个整数变量 learning_days,表示你已经学习 Python 的天数。
|
||||
|
||||
# 练习三:创建一个浮点数变量 daily_learning_hours,表示你计划每天学习的小时数。
|
||||
# 例如每天学习一个半小时,可以保存为 1.5。
|
||||
|
||||
# 练习四:创建一个布尔值变量 is_first_lesson_finished,表示你是否完成了第一课。
|
||||
|
||||
# 练习五:分别使用 type() 输出以上四个变量的数据类型。
|
||||
# 运行后应能看到 str、int、float 和 bool。
|
||||
|
||||
# 练习六:创建整数变量 completed_lessons,保存已经完成的课程数 1。
|
||||
# 再创建整数变量 current_lessons,保存当前正在学习的课程数 1。
|
||||
# 将两者相加,并把结果保存到变量 total_lessons 中。
|
||||
# 最后输出 total_lessons。
|
||||
|
||||
# 练习七:使用 f-string 输出一段完整的学习档案。
|
||||
# 句子中至少包含 user_name、learning_days 和 daily_learning_hours 三个变量。
|
||||
# 预期形式类似:Bruce 已学习 Python 2 天,计划每天学习 1.5 小时。
|
||||
|
||||
# 练习八:创建字符串变量 lesson_count_text,保存字符串 "2"。
|
||||
# 使用 int() 将它转换为整数,并把结果保存到 lesson_count 变量中。
|
||||
# 分别输出 lesson_count 的值和数据类型。
|
||||
|
||||
|
||||
# 完成全部练习后,请检查:
|
||||
# 1. 程序能否从头到尾运行且没有错误;
|
||||
# 2. 四种基础数据类型是否选择正确;
|
||||
# 3. 变量名是否能清楚表达数据的含义;
|
||||
# 4. f-string 中的花括号是否使用了正确的变量名。
|
||||
75
01_python基础/1_2_变量与数据类型/variables_and_types.py
Normal file
75
01_python基础/1_2_变量与数据类型/variables_and_types.py
Normal file
@@ -0,0 +1,75 @@
|
||||
# 第 1-2 课示例:变量与数据类型
|
||||
#
|
||||
# 建议先阅读本课 README.md,再从上到下阅读和运行本文件。
|
||||
# 每一段示例只演示一个主要知识点,便于对照终端输出进行理解。
|
||||
|
||||
|
||||
# 一、创建变量并输出变量保存的数据
|
||||
# 赋值符号右边的字符串 "Bruce" 会交给左边的变量 user_name。
|
||||
user_name = "Bruce"
|
||||
print(user_name)
|
||||
|
||||
|
||||
# 二、变量名与字符串不是同一个概念
|
||||
# 第一行读取变量中的数据,因此输出 Bruce。
|
||||
# 第二行直接输出引号中的文字,因此输出 user_name。
|
||||
print(user_name)
|
||||
print("user_name")
|
||||
|
||||
|
||||
# 三、创建四种基础数据类型
|
||||
# str:字符串,用于表示文字。
|
||||
learning_goal = "开发 LLM Agent"
|
||||
|
||||
# int:整数,用于表示没有小数部分的数字。
|
||||
completed_lessons = 1
|
||||
|
||||
# float:浮点数,初学阶段可以把它理解为小数。
|
||||
daily_learning_hours = 1.5
|
||||
|
||||
# bool:布尔值,用于表示真或假、是或否。
|
||||
is_first_lesson_finished = True
|
||||
|
||||
|
||||
# 四、使用 type() 查看每个变量的数据类型
|
||||
print(type(learning_goal))
|
||||
print(type(completed_lessons))
|
||||
print(type(daily_learning_hours))
|
||||
print(type(is_first_lesson_finished))
|
||||
|
||||
|
||||
# 五、使用变量进行简单计算
|
||||
# 两个整数相加后,计算结果会保存到 total_lessons 中。
|
||||
new_lessons = 1
|
||||
total_lessons = completed_lessons + new_lessons
|
||||
print(total_lessons)
|
||||
|
||||
|
||||
# 六、重新给变量赋值
|
||||
# learning_days 最初保存 1,第二次赋值后改为保存 2。
|
||||
learning_days = 1
|
||||
print(learning_days)
|
||||
|
||||
learning_days = 2
|
||||
print(learning_days)
|
||||
|
||||
|
||||
# 七、进行基础类型转换
|
||||
# age_text 是字符串,使用 int() 后得到整数 18。
|
||||
age_text = "18"
|
||||
age = int(age_text)
|
||||
print(age)
|
||||
print(type(age))
|
||||
|
||||
# course_count 是整数,使用 str() 后得到字符串 "8"。
|
||||
course_count = 8
|
||||
course_count_text = str(course_count)
|
||||
print(course_count_text)
|
||||
print(type(course_count_text))
|
||||
|
||||
|
||||
# 八、使用 f-string 组合固定文字与变量
|
||||
# 字符串前的 f 表示这是格式化字符串。
|
||||
# 花括号中的变量会被替换成变量当前保存的数据。
|
||||
print(f"{user_name} 已经学习 Python {learning_days} 天。")
|
||||
print(f"当前目标:{learning_goal}")
|
||||
378
01_python基础/1_3_输入与输出/README.md
Normal file
378
01_python基础/1_3_输入与输出/README.md
Normal file
@@ -0,0 +1,378 @@
|
||||
# 第 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`;
|
||||
- [ ] 能回答五道思考题。
|
||||
52
01_python基础/1_3_输入与输出/input_output.py
Normal file
52
01_python基础/1_3_输入与输出/input_output.py
Normal file
@@ -0,0 +1,52 @@
|
||||
# 第 1-3 课示例:输入与输出
|
||||
#
|
||||
# 这个程序会暂停并等待用户依次输入四项数据。
|
||||
# 输入数字时请只输入数字本身,不要添加“天”或“小时”等单位。
|
||||
|
||||
|
||||
# 一、接收字符串输入
|
||||
# input() 会先显示提示语,再等待用户输入并按下回车键。
|
||||
# 用户输入的内容会以字符串形式保存到 user_name 变量中。
|
||||
user_name = input("请输入你的名字或称呼:")
|
||||
|
||||
|
||||
# 二、接收整数输入
|
||||
# input() 得到的 learning_days_text 是字符串。
|
||||
# 这里分成两步编写,方便观察类型转换前后的数据。
|
||||
learning_days_text = input("请输入你已经学习 Python 的天数:")
|
||||
learning_days = int(learning_days_text)
|
||||
|
||||
|
||||
# 三、接收浮点数输入
|
||||
# 每天学习时间可能包含小数,因此使用 float() 进行转换。
|
||||
daily_hours_text = input("请输入你计划每天学习的小时数:")
|
||||
daily_hours = float(daily_hours_text)
|
||||
|
||||
|
||||
# 四、继续接收字符串输入
|
||||
learning_goal = input("请输入你的 Python 学习目标:")
|
||||
|
||||
|
||||
# 五、处理输入的数据
|
||||
# 一周有 7 天,因此每天学习时间乘以 7 可以得到每周计划时间。
|
||||
weekly_hours = daily_hours * 7
|
||||
|
||||
|
||||
# 六、输出分隔线
|
||||
# print() 接收三个字符串,sep="" 表示它们之间不添加默认空格。
|
||||
print("=", "个人 Python 学习计划", "=", sep="")
|
||||
|
||||
|
||||
# 七、使用 f-string 输出变量和计算结果
|
||||
print(f"学习者:{user_name}")
|
||||
print(f"已学习:{learning_days} 天")
|
||||
print(f"每天计划学习:{daily_hours} 小时")
|
||||
print(f"每周计划学习:{weekly_hours} 小时")
|
||||
print(f"学习目标:{learning_goal}")
|
||||
|
||||
|
||||
# 八、演示 end 参数
|
||||
# 第一条 print() 使用 end=":",输出后不换行,而是以中文冒号结尾。
|
||||
# 第二条 print() 会紧接着输出学习状态,之后恢复默认换行。
|
||||
print("当前状态", end=":")
|
||||
print("持续学习中")
|
||||
54
01_python基础/1_3_输入与输出/practice.py
Normal file
54
01_python基础/1_3_输入与输出/practice.py
Normal file
@@ -0,0 +1,54 @@
|
||||
# 第 1-3 课课堂练习:Agent 开发学习计划生成器
|
||||
#
|
||||
# 完成要求:
|
||||
# 1. 根据注释依次接收用户输入。
|
||||
# 2. 对需要计算的数字文本进行类型转换。
|
||||
# 3. 使用有明确含义的英文蛇形变量名。
|
||||
# 4. 使用 f-string 输出最终学习计划。
|
||||
# 5. 不要删除题目注释。
|
||||
# 6. 完成后运行:python practice.py
|
||||
|
||||
|
||||
# 练习一:使用 input() 接收用户的名字或称呼。
|
||||
# 将输入结果保存到变量 user_name。
|
||||
|
||||
# 练习二:使用 input() 接收用户计划学习 Python 的总天数。
|
||||
# input() 返回字符串,请使用 int() 转换为整数并保存到 total_days。
|
||||
# 建议分成“接收原始文本”和“转换类型”两个步骤。
|
||||
|
||||
|
||||
# 练习三:使用 input() 接收用户每天计划学习的小时数。
|
||||
# 使用 float() 转换为浮点数并保存到 daily_hours。
|
||||
|
||||
# 练习四:使用 input() 接收用户想重点学习的 Agent 方向。
|
||||
# 例如:Agent 应用开发、提示词工程、RAG 或模型训练。
|
||||
# 将结果保存到 learning_direction。
|
||||
|
||||
# 练习五:计算总计划学习小时数。
|
||||
# 计算公式:总天数 * 每天学习小时数。
|
||||
# 将计算结果保存到 total_hours。
|
||||
|
||||
|
||||
# 练习六:使用 print() 和 sep 参数输出标题。
|
||||
# 标题可以由 "="、"Agent 开发学习计划"、"=" 三部分组成。
|
||||
# 尝试使用 sep="",让三部分之间不出现默认空格。
|
||||
|
||||
# 练习七:使用 f-string 分行输出以下信息:
|
||||
# 1. 学习者;
|
||||
# 2. 计划学习总天数;
|
||||
# 3. 每天学习小时数;
|
||||
# 4. 预计总学习小时数;
|
||||
# 5. 重点学习方向。
|
||||
|
||||
|
||||
# 练习八:使用两条 print() 输出最终状态。
|
||||
# 第一条使用 end=":" 输出“计划状态”,使它暂时不换行。
|
||||
# 第二条输出“准备开始”。
|
||||
|
||||
|
||||
# 完成后进行自查:
|
||||
# 1. 输入整数时是否只输入了数字;
|
||||
# 2. 输入小数时是否使用了英文小数点;
|
||||
# 3. total_days 的类型是否为 int;
|
||||
# 4. daily_hours 和 total_hours 的类型是否为 float;
|
||||
# 5. 最终输出是否包含全部输入信息和计算结果。
|
||||
511
01_python基础/1_4_运算符/README.md
Normal file
511
01_python基础/1_4_运算符/README.md
Normal file
@@ -0,0 +1,511 @@
|
||||
# 第 1-4 课:运算符
|
||||
|
||||
## 一、本课目标
|
||||
|
||||
完成本课后,你应该能够:
|
||||
|
||||
1. 解释运算符和操作数是什么;
|
||||
2. 使用算术运算符完成基础计算;
|
||||
3. 区分普通除法、整除和取余;
|
||||
4. 使用比较运算符得到布尔值;
|
||||
5. 使用复合赋值运算符更新变量;
|
||||
6. 使用 `and`、`or` 和 `not` 组合或反转条件;
|
||||
7. 使用括号明确计算顺序;
|
||||
8. 编写一个包含输入、计算和判断结果的学习进度程序。
|
||||
|
||||
## 二、前置知识
|
||||
|
||||
开始本课前,你应该已经掌握:
|
||||
|
||||
- 创建和使用变量;
|
||||
- 区分字符串、整数、浮点数和布尔值;
|
||||
- 使用 `input()` 接收输入;
|
||||
- 使用 `int()` 和 `float()` 转换输入;
|
||||
- 使用 f-string 输出变量和计算结果。
|
||||
|
||||
## 三、运算符与操作数
|
||||
|
||||
运算符(Operator)是告诉 Python 执行某种运算的符号或关键字。
|
||||
|
||||
观察下面的代码:
|
||||
|
||||
```python
|
||||
total_hours = daily_hours * learning_days
|
||||
```
|
||||
|
||||
其中:
|
||||
|
||||
- `*` 是乘法运算符;
|
||||
- `daily_hours` 和 `learning_days` 是参与运算的数据,称为操作数(Operand);
|
||||
- 计算结果赋值给 `total_hours`。
|
||||
|
||||
运算不只是数学计算。比较两个数据、组合两个条件,也需要使用运算符。
|
||||
|
||||
## 四、算术运算符
|
||||
|
||||
算术运算符主要用于数字计算。
|
||||
|
||||
| 运算符 | 含义 | 示例 | 结果 |
|
||||
| --- | --- | --- | --- |
|
||||
| `+` | 加法 | `10 + 3` | `13` |
|
||||
| `-` | 减法 | `10 - 3` | `7` |
|
||||
| `*` | 乘法 | `10 * 3` | `30` |
|
||||
| `/` | 普通除法 | `10 / 3` | `3.333...` |
|
||||
| `//` | 整除 | `10 // 3` | `3` |
|
||||
| `%` | 取余 | `10 % 3` | `1` |
|
||||
| `**` | 幂运算 | `10 ** 3` | `1000` |
|
||||
|
||||
### 4.1 加、减、乘
|
||||
|
||||
```python
|
||||
completed_tasks = 5
|
||||
new_tasks = 3
|
||||
|
||||
total_tasks = completed_tasks + new_tasks
|
||||
remaining_tasks = total_tasks - completed_tasks
|
||||
estimated_minutes = total_tasks * 20
|
||||
```
|
||||
|
||||
这些运算与日常数学中的含义基本一致。
|
||||
|
||||
### 4.2 普通除法 `/`
|
||||
|
||||
```python
|
||||
average_hours = 10 / 4
|
||||
print(average_hours)
|
||||
```
|
||||
|
||||
输出:
|
||||
|
||||
```text
|
||||
2.5
|
||||
```
|
||||
|
||||
Python 3 中,普通除法 `/` 的结果通常是浮点数。即使能够整除,结果也会带小数:
|
||||
|
||||
```python
|
||||
print(10 / 2)
|
||||
```
|
||||
|
||||
输出:
|
||||
|
||||
```text
|
||||
5.0
|
||||
```
|
||||
|
||||
### 4.3 整除 `//`
|
||||
|
||||
整除会得到向下取整后的商:
|
||||
|
||||
```python
|
||||
full_weeks = 17 // 7
|
||||
print(full_weeks)
|
||||
```
|
||||
|
||||
输出:
|
||||
|
||||
```text
|
||||
2
|
||||
```
|
||||
|
||||
这表示 17 天中包含 2 个完整的 7 天周期。
|
||||
|
||||
对于正数,可以暂时理解为“只保留能完整分出的份数”。负数整除存在额外规则,将来遇到实际场景时再详细学习。
|
||||
|
||||
### 4.4 取余 `%`
|
||||
|
||||
取余得到除法中没有被完整分掉的余数:
|
||||
|
||||
```python
|
||||
remaining_days = 17 % 7
|
||||
print(remaining_days)
|
||||
```
|
||||
|
||||
输出:
|
||||
|
||||
```text
|
||||
3
|
||||
```
|
||||
|
||||
因此 17 天可以表示为 2 个完整星期加 3 天。
|
||||
|
||||
取余还常用于判断一个整数是奇数还是偶数:
|
||||
|
||||
```python
|
||||
remainder = 8 % 2
|
||||
print(remainder)
|
||||
```
|
||||
|
||||
结果为 `0`,说明 8 可以被 2 整除。
|
||||
|
||||
### 4.5 幂运算 `**`
|
||||
|
||||
```python
|
||||
result = 2 ** 3
|
||||
print(result)
|
||||
```
|
||||
|
||||
输出为 `8`,表示 2 的 3 次方,即 `2 × 2 × 2`。
|
||||
|
||||
注意:Python 的幂运算不是 `^`。符号 `^` 在 Python 中有其他含义,当前阶段不要用它表示乘方。
|
||||
|
||||
## 五、字符串也能使用部分算术运算符
|
||||
|
||||
### 5.1 字符串拼接
|
||||
|
||||
两个字符串可以使用 `+` 连接:
|
||||
|
||||
```python
|
||||
first_name = "Agent"
|
||||
second_name = "开发者"
|
||||
role_name = first_name + second_name
|
||||
|
||||
print(role_name)
|
||||
```
|
||||
|
||||
输出:
|
||||
|
||||
```text
|
||||
Agent开发者
|
||||
```
|
||||
|
||||
如果需要空格或其他符号,必须明确写入字符串:
|
||||
|
||||
```python
|
||||
role_name = first_name + " " + second_name
|
||||
```
|
||||
|
||||
### 5.2 重复字符串
|
||||
|
||||
字符串乘以整数可以重复多次:
|
||||
|
||||
```python
|
||||
separator = "=" * 20
|
||||
print(separator)
|
||||
```
|
||||
|
||||
这会输出 20 个等号。
|
||||
|
||||
字符串不能与整数直接相加:
|
||||
|
||||
```text
|
||||
"学习天数:" + 3
|
||||
```
|
||||
|
||||
如果确实要拼接,需要先使用 `str(3)` 转换;不过通常推荐使用更清晰的 f-string。
|
||||
|
||||
## 六、比较运算符
|
||||
|
||||
比较运算符用于比较两个数据,结果一定是布尔值 `True` 或 `False`。
|
||||
|
||||
| 运算符 | 含义 | 示例 |
|
||||
| --- | --- | --- |
|
||||
| `==` | 等于 | `score == 100` |
|
||||
| `!=` | 不等于 | `score != 0` |
|
||||
| `>` | 大于 | `score > 60` |
|
||||
| `<` | 小于 | `score < 60` |
|
||||
| `>=` | 大于或等于 | `score >= 60` |
|
||||
| `<=` | 小于或等于 | `score <= 100` |
|
||||
|
||||
示例:
|
||||
|
||||
```python
|
||||
completed_hours = 12
|
||||
target_hours = 10
|
||||
|
||||
is_target_reached = completed_hours >= target_hours
|
||||
print(is_target_reached)
|
||||
```
|
||||
|
||||
输出:
|
||||
|
||||
```text
|
||||
True
|
||||
```
|
||||
|
||||
### 6.1 `=` 与 `==` 的区别
|
||||
|
||||
这是初学者必须掌握的区别:
|
||||
|
||||
- `=` 表示赋值,把右边的数据交给左边的变量;
|
||||
- `==` 表示比较,判断左右两边是否相等。
|
||||
|
||||
```python
|
||||
learning_days = 4
|
||||
is_four_days = learning_days == 4
|
||||
```
|
||||
|
||||
第一行创建或更新变量,第二行得到布尔值 `True`。
|
||||
|
||||
### 6.2 不要把布尔结果写成字符串
|
||||
|
||||
```python
|
||||
is_finished = completed_tasks == total_tasks
|
||||
```
|
||||
|
||||
这里的 `is_finished` 保存真正的布尔值。
|
||||
|
||||
下面写法只是保存普通文字:
|
||||
|
||||
```python
|
||||
is_finished = "True"
|
||||
```
|
||||
|
||||
两者的数据类型和用途不同。
|
||||
|
||||
## 七、赋值运算符与复合赋值
|
||||
|
||||
普通赋值使用 `=`:
|
||||
|
||||
```python
|
||||
completed_tasks = 3
|
||||
```
|
||||
|
||||
如果完成了一个新任务,可以这样更新:
|
||||
|
||||
```python
|
||||
completed_tasks = completed_tasks + 1
|
||||
```
|
||||
|
||||
Python 提供了更简洁的复合赋值写法:
|
||||
|
||||
```python
|
||||
completed_tasks += 1
|
||||
```
|
||||
|
||||
两种写法在这个场景中作用相同。
|
||||
|
||||
常见复合赋值运算符:
|
||||
|
||||
| 运算符 | 示例 | 等价写法 |
|
||||
| --- | --- | --- |
|
||||
| `+=` | `value += 2` | `value = value + 2` |
|
||||
| `-=` | `value -= 2` | `value = value - 2` |
|
||||
| `*=` | `value *= 2` | `value = value * 2` |
|
||||
| `/=` | `value /= 2` | `value = value / 2` |
|
||||
| `//=` | `value //= 2` | `value = value // 2` |
|
||||
| `%=` | `value %= 2` | `value = value % 2` |
|
||||
|
||||
复合赋值会更新变量本身,因此执行前变量必须已经存在。
|
||||
|
||||
## 八、逻辑运算符
|
||||
|
||||
逻辑运算符用于组合或反转布尔条件。
|
||||
|
||||
Python 中最常用的三个逻辑运算符是:
|
||||
|
||||
- `and`:并且;
|
||||
- `or`:或者;
|
||||
- `not`:取反。
|
||||
|
||||
### 8.1 `and`
|
||||
|
||||
`and` 两边的条件都为 `True` 时,整体才为 `True`。
|
||||
|
||||
```python
|
||||
has_completed_course = True
|
||||
has_finished_practice = True
|
||||
|
||||
can_start_next_course = has_completed_course and has_finished_practice
|
||||
print(can_start_next_course)
|
||||
```
|
||||
|
||||
输出为 `True`。
|
||||
|
||||
如果其中任何一个条件为 `False`,整体就是 `False`。
|
||||
|
||||
### 8.2 `or`
|
||||
|
||||
`or` 两边至少有一个条件为 `True` 时,整体就是 `True`。
|
||||
|
||||
```python
|
||||
uses_pycharm = True
|
||||
uses_vscode = False
|
||||
|
||||
has_code_editor = uses_pycharm or uses_vscode
|
||||
print(has_code_editor)
|
||||
```
|
||||
|
||||
输出为 `True`。
|
||||
|
||||
### 8.3 `not`
|
||||
|
||||
`not` 会反转布尔值:
|
||||
|
||||
```python
|
||||
is_finished = False
|
||||
is_still_learning = not is_finished
|
||||
|
||||
print(is_still_learning)
|
||||
```
|
||||
|
||||
输出为 `True`。
|
||||
|
||||
### 8.4 组合比较条件
|
||||
|
||||
```python
|
||||
daily_hours = 2.5
|
||||
completed_tasks = 4
|
||||
|
||||
is_plan_healthy = daily_hours >= 1 and completed_tasks >= 3
|
||||
```
|
||||
|
||||
这个结果表示“每天至少学习 1 小时,并且至少完成 3 个任务”是否同时成立。
|
||||
|
||||
本课只计算并输出布尔结果。下一课学习条件判断后,程序可以根据结果执行不同代码。
|
||||
|
||||
## 九、运算优先级
|
||||
|
||||
Python 会按照一定优先级计算表达式。
|
||||
|
||||
最基础的规则与数学类似:
|
||||
|
||||
1. 先计算括号;
|
||||
2. 再计算幂运算;
|
||||
3. 再计算乘、除、整除和取余;
|
||||
4. 最后计算加减。
|
||||
|
||||
```python
|
||||
result = 2 + 3 * 4
|
||||
print(result)
|
||||
```
|
||||
|
||||
结果是 `14`,因为先计算 `3 * 4`。
|
||||
|
||||
加入括号:
|
||||
|
||||
```python
|
||||
result = (2 + 3) * 4
|
||||
print(result)
|
||||
```
|
||||
|
||||
结果是 `20`。
|
||||
|
||||
比较和逻辑运算组合时也有优先级规则,但不要依赖记忆复杂规则。推荐使用括号明确表达意图:
|
||||
|
||||
```python
|
||||
can_continue = (score >= 60) and (practice_finished == True)
|
||||
```
|
||||
|
||||
上面代码中的 `== True` 可以省略,写成下面这样更自然:
|
||||
|
||||
```python
|
||||
can_continue = (score >= 60) and practice_finished
|
||||
```
|
||||
|
||||
括号不仅影响运算顺序,也能帮助人更快读懂代码。
|
||||
|
||||
## 十、浮点数精度现象
|
||||
|
||||
运行下面代码:
|
||||
|
||||
```python
|
||||
print(0.1 + 0.2)
|
||||
```
|
||||
|
||||
你可能看到:
|
||||
|
||||
```text
|
||||
0.30000000000000004
|
||||
```
|
||||
|
||||
这不是 Python 随意算错,而是计算机使用二进制保存部分小数时产生的精度限制。
|
||||
|
||||
现阶段知道这种现象即可。涉及金额等要求精确的业务数据时,不能随意使用普通浮点数直接计算,后续数据库和项目课程会介绍合适的处理方式。
|
||||
|
||||
## 十一、运行本课示例
|
||||
|
||||
在 PowerShell 中执行:
|
||||
|
||||
```powershell
|
||||
cd D:\Code\Python\01_python基础\1_4_运算符
|
||||
python operators.py
|
||||
```
|
||||
|
||||
请边看源代码边观察输出,重点比较:
|
||||
|
||||
- `/`、`//`、`%` 的不同结果;
|
||||
- `=` 与 `==` 的不同用途;
|
||||
- `and`、`or`、`not` 的布尔结果;
|
||||
- 添加括号前后的计算结果。
|
||||
|
||||
## 十二、常见错误
|
||||
|
||||
### 12.1 使用 `^` 表示乘方
|
||||
|
||||
Python 使用 `**` 进行幂运算,不使用 `^`。
|
||||
|
||||
### 12.2 混淆 `=` 和 `==`
|
||||
|
||||
需要比较时使用 `==`,需要给变量保存数据时使用 `=`。
|
||||
|
||||
### 12.3 除数为零
|
||||
|
||||
```text
|
||||
10 / 0
|
||||
```
|
||||
|
||||
会产生 `ZeroDivisionError`,因为普通数字不能除以零。
|
||||
|
||||
### 12.4 字符串与数字直接相加
|
||||
|
||||
```text
|
||||
"总数:" + 10
|
||||
```
|
||||
|
||||
会产生 `TypeError`。推荐使用 f-string:
|
||||
|
||||
```python
|
||||
print(f"总数:{10}")
|
||||
```
|
||||
|
||||
### 12.5 复杂表达式没有括号
|
||||
|
||||
即使程序结果正确,难以阅读的表达式也容易在维护时产生问题。优先使用括号和含义清晰的中间变量。
|
||||
|
||||
## 十三、课堂练习
|
||||
|
||||
打开 `practice.py`,完成“Agent 学习进度计算器”。它会接收计划数据,计算完成率相关信息,并输出多个布尔判断结果。
|
||||
|
||||
运行命令:
|
||||
|
||||
```powershell
|
||||
python practice.py
|
||||
```
|
||||
|
||||
本课重点是自己选择正确的运算符。请先不要参考示例文件逐行照抄。
|
||||
|
||||
## 十四、思考题
|
||||
|
||||
1. `17 / 7`、`17 // 7`、`17 % 7` 分别表示什么?
|
||||
2. `score = 80` 与 `score == 80` 有什么区别?
|
||||
3. `True and False` 的结果是什么?
|
||||
4. `True or False` 的结果是什么?
|
||||
5. `not True` 的结果是什么?
|
||||
6. 为什么复杂表达式推荐使用括号?
|
||||
7. `2 + 3 * 4` 和 `(2 + 3) * 4` 为什么结果不同?
|
||||
|
||||
## 十五、本课小结
|
||||
|
||||
- 算术运算符用于数字计算;
|
||||
- `/` 是普通除法,`//` 是整除,`%` 用于取得余数;
|
||||
- `**` 用于幂运算;
|
||||
- 比较运算的结果是布尔值;
|
||||
- `=` 表示赋值,`==` 表示比较是否相等;
|
||||
- 复合赋值可以简洁地更新已有变量;
|
||||
- `and` 要求两个条件都成立;
|
||||
- `or` 要求至少一个条件成立;
|
||||
- `not` 用于反转布尔结果;
|
||||
- 括号可以改变或明确运算顺序。
|
||||
|
||||
## 十六、验收标准
|
||||
|
||||
- [ ] 能正确使用七种基础算术运算符;
|
||||
- [ ] 能解释 `/`、`//` 和 `%` 的区别;
|
||||
- [ ] 能使用比较运算符得到布尔值;
|
||||
- [ ] 能区分赋值与相等比较;
|
||||
- [ ] 能使用至少一种复合赋值运算符;
|
||||
- [ ] 能使用 `and`、`or` 和 `not`;
|
||||
- [ ] 能使用括号明确计算顺序;
|
||||
- [ ] 能完成并运行 `practice.py`;
|
||||
- [ ] 能回答七道思考题。
|
||||
97
01_python基础/1_4_运算符/operators.py
Normal file
97
01_python基础/1_4_运算符/operators.py
Normal file
@@ -0,0 +1,97 @@
|
||||
# 第 1-4 课示例:运算符
|
||||
#
|
||||
# 本文件按类别演示常用运算符。
|
||||
# 运行时请对照每段注释,观察不同运算符产生的结果和数据类型。
|
||||
|
||||
|
||||
# 一、算术运算符
|
||||
first_number = 17
|
||||
second_number = 7
|
||||
|
||||
print(f"加法:{first_number + second_number}")
|
||||
print(f"减法:{first_number - second_number}")
|
||||
print(f"乘法:{first_number * second_number}")
|
||||
print(f"普通除法:{first_number / second_number}")
|
||||
print(f"整除:{first_number // second_number}")
|
||||
print(f"取余:{first_number % second_number}")
|
||||
print(f"幂运算:{2 ** 3}")
|
||||
|
||||
|
||||
# 二、整除与取余的实际含义
|
||||
# 17 天中包含 2 个完整星期,另外还剩 3 天。
|
||||
learning_days = 17
|
||||
full_weeks = learning_days // 7
|
||||
remaining_days = learning_days % 7
|
||||
|
||||
print(f"{learning_days} 天等于 {full_weeks} 个完整星期加 {remaining_days} 天。")
|
||||
|
||||
|
||||
# 三、字符串支持的部分运算
|
||||
# 加号连接字符串,乘号让字符串重复指定次数。
|
||||
role_name = "Agent" + " " + "开发者"
|
||||
separator = "=" * 20
|
||||
|
||||
print(role_name)
|
||||
print(separator)
|
||||
|
||||
|
||||
# 四、比较运算符
|
||||
completed_hours = 12
|
||||
target_hours = 10
|
||||
|
||||
print(f"是否等于目标:{completed_hours == target_hours}")
|
||||
print(f"是否不等于目标:{completed_hours != target_hours}")
|
||||
print(f"是否超过目标:{completed_hours > target_hours}")
|
||||
print(f"是否少于目标:{completed_hours < target_hours}")
|
||||
print(f"是否达到目标:{completed_hours >= target_hours}")
|
||||
print(f"是否未超过目标:{completed_hours <= target_hours}")
|
||||
|
||||
|
||||
# 五、复合赋值运算符
|
||||
# completed_tasks += 1 等价于 completed_tasks = completed_tasks + 1。
|
||||
completed_tasks = 3
|
||||
completed_tasks += 1
|
||||
print(f"新增一个完成项后:{completed_tasks}")
|
||||
|
||||
# 下面把预计时间扩大为原来的两倍。
|
||||
estimated_hours = 5
|
||||
estimated_hours *= 2
|
||||
print(f"调整后的预计时间:{estimated_hours}")
|
||||
|
||||
|
||||
# 六、逻辑运算符
|
||||
course_finished = True
|
||||
practice_finished = True
|
||||
uses_pycharm = True
|
||||
uses_vscode = False
|
||||
|
||||
can_start_next_course = course_finished and practice_finished
|
||||
has_code_editor = uses_pycharm or uses_vscode
|
||||
is_still_learning = not course_finished
|
||||
|
||||
print(f"课程和练习是否都完成:{can_start_next_course}")
|
||||
print(f"是否至少使用一种编辑器:{has_code_editor}")
|
||||
print(f"是否仍未完成课程:{is_still_learning}")
|
||||
|
||||
|
||||
# 七、比较运算与逻辑运算组合
|
||||
daily_hours = 2.5
|
||||
completed_tasks = 4
|
||||
|
||||
is_plan_healthy = (daily_hours >= 1) and (completed_tasks >= 3)
|
||||
print(f"学习时长和任务数是否同时达标:{is_plan_healthy}")
|
||||
|
||||
|
||||
# 八、运算优先级
|
||||
# 第一个结果先计算乘法;第二个结果先计算括号中的加法。
|
||||
result_without_parentheses = 2 + 3 * 4
|
||||
result_with_parentheses = (2 + 3) * 4
|
||||
|
||||
print(f"没有括号:{result_without_parentheses}")
|
||||
print(f"使用括号:{result_with_parentheses}")
|
||||
|
||||
|
||||
# 九、观察浮点数精度现象
|
||||
# 这个结果说明部分十进制小数无法用二进制浮点数精确表示。
|
||||
floating_point_result = 0.1 + 0.2
|
||||
print(f"0.1 + 0.2 的结果:{floating_point_result}")
|
||||
84
01_python基础/1_4_运算符/practice.py
Normal file
84
01_python基础/1_4_运算符/practice.py
Normal file
@@ -0,0 +1,84 @@
|
||||
# 第 1-4 课课堂练习:Agent 学习进度计算器
|
||||
#
|
||||
# 完成要求:
|
||||
# 1. 根据注释选择正确的算术、比较、赋值或逻辑运算符。
|
||||
# 2. 数字输入需要转换为合适的数据类型。
|
||||
# 3. 使用含义清晰的英文蛇形变量名。
|
||||
# 4. 使用 f-string 输出结果。
|
||||
# 5. 不要删除题目注释。
|
||||
# 6. 完成后运行:python practice.py
|
||||
|
||||
|
||||
# 练习一:接收计划学习总天数,转换为整数并保存到 total_days。
|
||||
|
||||
# 练习二:接收已经完成的学习天数,转换为整数并保存到 completed_days。
|
||||
|
||||
# 练习三:接收每天计划学习的小时数,转换为浮点数并保存到 daily_hours。
|
||||
|
||||
# 练习四:使用减法计算剩余学习天数,保存到 remaining_days。
|
||||
|
||||
# 练习五:使用乘法计算计划总学习小时数,保存到 planned_total_hours。
|
||||
# 计算公式:计划学习总天数 * 每天计划学习小时数。
|
||||
|
||||
# 练习六:使用乘法计算已经完成的学习小时数,保存到 completed_hours。
|
||||
# 为了简化练习,假设每天都完成了计划学习时长。
|
||||
|
||||
# 练习七:使用整除和取余,把计划总天数拆分成“完整星期数”和“剩余天数”。
|
||||
# 分别保存到 full_weeks 和 extra_days。
|
||||
|
||||
# 练习八:使用比较运算符完成以下判断:
|
||||
# 1. completed_days 是否大于 0,结果保存到 has_started;
|
||||
# 2. completed_days 是否大于或等于 total_days,结果保存到 is_plan_finished;
|
||||
# 3. remaining_days 是否不等于 0,结果保存到 has_remaining_days。
|
||||
|
||||
# 练习九:使用逻辑运算符完成以下判断:
|
||||
# 只有“已经开始”并且“尚未完成”同时成立时,is_in_progress 才为 True。
|
||||
# 提示:“尚未完成”可以使用 not 反转 is_plan_finished。
|
||||
|
||||
# 练习十:创建 completed_tasks 变量,初始值为 3。
|
||||
# 使用 += 让它增加 1,然后输出更新后的值。
|
||||
|
||||
# 练习十一:使用字符串乘法输出一条包含 30 个等号的分隔线。
|
||||
|
||||
# 练习十二:使用 f-string 输出完整进度报告,至少包含:
|
||||
# 1. 计划总天数和已完成天数;
|
||||
# 2. 剩余天数;
|
||||
# 3. 完整星期数和额外天数;
|
||||
# 4. 计划总学习小时数和已完成学习小时数;
|
||||
# 5. has_started、is_plan_finished、has_remaining_days 和 is_in_progress;
|
||||
# 6. 更新后的 completed_tasks。
|
||||
|
||||
# 建议使用以下测试数据进行第一次运行:
|
||||
# 计划总天数:30
|
||||
# 已完成天数:7
|
||||
# 每天学习小时数:2.5
|
||||
#
|
||||
# 使用这组数据时,你应该能推算出:
|
||||
# 剩余 23 天,计划总时长 75.0 小时,已完成 17.5 小时;
|
||||
# 30 天包含 4 个完整星期,额外 2 天;
|
||||
# 已经开始为 True,已经完成为 False,正在进行为 True。
|
||||
|
||||
|
||||
# 完成后进行自查:
|
||||
# 1. 是否正确区分了 /、// 和 %;
|
||||
# 2. 比较结果是否是真正的 bool,而不是字符串;
|
||||
# 3. 是否正确使用了 and 和 not;
|
||||
# 4. += 是否更新了原变量;
|
||||
# 5. 所有计算结果是否与手工推算一致。
|
||||
|
||||
# 计划学习总天数:30
|
||||
# 已经完成的学习天数:7
|
||||
# 每天计划学习的小时数:2.5
|
||||
# 4
|
||||
# ==============================
|
||||
# 1. 计划总天数和已完成天数: 30,7
|
||||
# 2. 剩余天数:23
|
||||
# 3. 完整星期数和额外天数:4,2
|
||||
# 4. 计划总学习小时数和已完成学习小时数:75.0,17.5
|
||||
# has_started=True
|
||||
# is_plan_finished=False
|
||||
# has_remaining_days=True
|
||||
# is_in_progress=True
|
||||
# completed_tasks=4
|
||||
#
|
||||
# 进程已结束,退出代码为 0
|
||||
472
01_python基础/1_5_条件判断/README.md
Normal file
472
01_python基础/1_5_条件判断/README.md
Normal file
@@ -0,0 +1,472 @@
|
||||
# 第 1-5 课:条件判断
|
||||
|
||||
## 一、本课目标
|
||||
|
||||
完成本课后,你应该能够:
|
||||
|
||||
1. 解释条件判断为什么能让程序作出不同选择;
|
||||
2. 使用 `if` 在条件成立时执行代码;
|
||||
3. 使用 `if...else` 处理两种互斥情况;
|
||||
4. 使用 `if...elif...else` 处理多个分支;
|
||||
5. 正确书写英文冒号和四个空格缩进;
|
||||
6. 使用比较运算符和逻辑运算符组成条件;
|
||||
7. 理解条件顺序为什么会影响最终结果;
|
||||
8. 使用嵌套条件处理有先后依赖的判断;
|
||||
9. 编写一个能够根据输入给出不同结论的程序。
|
||||
|
||||
## 二、前置知识
|
||||
|
||||
开始本课前,你应该已经掌握:
|
||||
|
||||
- 使用 `input()` 接收用户输入;
|
||||
- 使用 `int()` 和 `float()` 转换数据;
|
||||
- 使用比较运算符得到 `True` 或 `False`;
|
||||
- 使用 `and`、`or`、`not` 组合条件;
|
||||
- 使用 f-string 输出变量。
|
||||
|
||||
## 三、为什么需要条件判断
|
||||
|
||||
前面的程序会从上到下执行每一行代码。即使我们计算出了布尔结果,程序也只是把它显示出来:
|
||||
|
||||
```python
|
||||
score = 80
|
||||
is_passed = score >= 60
|
||||
print(is_passed)
|
||||
```
|
||||
|
||||
真实程序通常需要根据结果执行不同操作,例如:
|
||||
|
||||
- 分数达到 60 分时显示“通过”;
|
||||
- 密码正确时允许登录;
|
||||
- 库存不足时拒绝下单;
|
||||
- 学习任务完成后进入下一课;
|
||||
- 接口调用失败时显示错误信息。
|
||||
|
||||
条件判断让程序拥有“如果发生某种情况,就执行某段代码”的能力。
|
||||
|
||||
## 四、最简单的 `if`
|
||||
|
||||
`if` 的中文含义是“如果”。基本结构如下:
|
||||
|
||||
```python
|
||||
if 条件:
|
||||
条件成立时执行的代码
|
||||
```
|
||||
|
||||
示例:
|
||||
|
||||
```python
|
||||
score = 80
|
||||
|
||||
if score >= 60:
|
||||
print("本次考核通过。")
|
||||
```
|
||||
|
||||
执行过程:
|
||||
|
||||
1. Python 计算 `score >= 60`;
|
||||
2. 结果为 `True`,因此执行缩进的 `print()`;
|
||||
3. 如果结果为 `False`,缩进代码会被跳过;
|
||||
4. 程序继续执行条件结构后面的代码。
|
||||
|
||||
## 五、冒号与缩进
|
||||
|
||||
Python 使用缩进表示哪些代码属于某个条件分支。
|
||||
|
||||
正确写法:
|
||||
|
||||
```python
|
||||
if score >= 60:
|
||||
print("通过")
|
||||
print("可以继续下一阶段")
|
||||
|
||||
print("评估结束")
|
||||
```
|
||||
|
||||
两条缩进的 `print()` 都属于 `if`。最后一条没有缩进,因此无论条件是否成立都会执行。
|
||||
|
||||
### 5.1 冒号
|
||||
|
||||
条件末尾必须使用英文半角冒号 `:`:
|
||||
|
||||
```python
|
||||
if score >= 60:
|
||||
```
|
||||
|
||||
不能使用中文冒号 `:`,也不能漏写冒号。
|
||||
|
||||
### 5.2 四个空格
|
||||
|
||||
Python 官方风格通常使用四个空格作为一级缩进。PyCharm 按下 Tab 键时,一般会自动生成合适的缩进。
|
||||
|
||||
同一个代码块中的代码必须保持相同缩进:
|
||||
|
||||
```text
|
||||
if score >= 60:
|
||||
print("通过")
|
||||
print("缩进不一致")
|
||||
```
|
||||
|
||||
这会产生 `IndentationError`,中文可以理解为“缩进错误”。
|
||||
|
||||
## 六、使用 `if...else` 处理两种情况
|
||||
|
||||
`else` 表示“否则”。当 `if` 条件不成立时,执行 `else` 分支:
|
||||
|
||||
```python
|
||||
score = 55
|
||||
|
||||
if score >= 60:
|
||||
print("本次考核通过。")
|
||||
else:
|
||||
print("本次考核未通过。")
|
||||
```
|
||||
|
||||
`if` 与 `else` 只会执行其中一个分支,不会同时执行。
|
||||
|
||||
执行逻辑可以表示为:
|
||||
|
||||
```text
|
||||
条件是否成立?
|
||||
├── 是 → 执行 if 分支
|
||||
└── 否 → 执行 else 分支
|
||||
```
|
||||
|
||||
## 七、使用 `if...elif...else` 处理多个分支
|
||||
|
||||
`elif` 是 else if 的缩写,表示“否则如果”。
|
||||
|
||||
```python
|
||||
score = 85
|
||||
|
||||
if score >= 90:
|
||||
print("优秀")
|
||||
elif score >= 80:
|
||||
print("良好")
|
||||
elif score >= 60:
|
||||
print("合格")
|
||||
else:
|
||||
print("需要继续练习")
|
||||
```
|
||||
|
||||
Python 会从上到下检查条件:
|
||||
|
||||
1. 检查 `score >= 90`,结果为 `False`;
|
||||
2. 检查 `score >= 80`,结果为 `True`;
|
||||
3. 执行“良好”;
|
||||
4. 跳过后面的其他分支。
|
||||
|
||||
整组结构最多执行一个分支。
|
||||
|
||||
## 八、条件顺序非常重要
|
||||
|
||||
错误顺序示例:
|
||||
|
||||
```python
|
||||
score = 95
|
||||
|
||||
if score >= 60:
|
||||
print("合格")
|
||||
elif score >= 90:
|
||||
print("优秀")
|
||||
```
|
||||
|
||||
虽然 95 分符合“优秀”,但第一个条件 `score >= 60` 已经成立,后面的分支不会再检查,最终只会输出“合格”。
|
||||
|
||||
处理分数区间时,通常从要求最高、范围最窄的条件开始:
|
||||
|
||||
```python
|
||||
if score >= 90:
|
||||
print("优秀")
|
||||
elif score >= 60:
|
||||
print("合格")
|
||||
else:
|
||||
print("未通过")
|
||||
```
|
||||
|
||||
## 九、条件可以直接使用布尔变量
|
||||
|
||||
如果变量本身已经是布尔值,可以直接作为条件:
|
||||
|
||||
```python
|
||||
practice_finished = True
|
||||
|
||||
if practice_finished:
|
||||
print("练习已完成。")
|
||||
else:
|
||||
print("请先完成练习。")
|
||||
```
|
||||
|
||||
不推荐重复比较:
|
||||
|
||||
```python
|
||||
if practice_finished == True:
|
||||
```
|
||||
|
||||
直接写 `if practice_finished:` 更简洁,也符合 Python 常见风格。
|
||||
|
||||
判断布尔值为假时,可以使用 `not`:
|
||||
|
||||
```python
|
||||
if not practice_finished:
|
||||
print("请先完成练习。")
|
||||
```
|
||||
|
||||
## 十、组合多个条件
|
||||
|
||||
### 10.1 使用 `and`
|
||||
|
||||
只有课程和练习都完成时,才能进入下一课:
|
||||
|
||||
```python
|
||||
course_finished = True
|
||||
practice_finished = True
|
||||
|
||||
if course_finished and practice_finished:
|
||||
print("可以进入下一课。")
|
||||
else:
|
||||
print("当前课程尚未完成。")
|
||||
```
|
||||
|
||||
### 10.2 使用 `or`
|
||||
|
||||
允许使用 PyCharm 或 VS Code:
|
||||
|
||||
```python
|
||||
uses_pycharm = True
|
||||
uses_vscode = False
|
||||
|
||||
if uses_pycharm or uses_vscode:
|
||||
print("已经具备代码编辑器。")
|
||||
else:
|
||||
print("请先安装代码编辑器。")
|
||||
```
|
||||
|
||||
### 10.3 使用括号提高可读性
|
||||
|
||||
```python
|
||||
if (score >= 60) and practice_finished:
|
||||
print("考核通过。")
|
||||
```
|
||||
|
||||
简单比较周围的括号可以省略,但条件较长时,括号能帮助读者快速理解组合关系。
|
||||
|
||||
## 十一、连续区间判断
|
||||
|
||||
判断一个数字是否处于某个范围,可以使用 `and`:
|
||||
|
||||
```python
|
||||
age = 20
|
||||
|
||||
if age >= 18 and age <= 60:
|
||||
print("年龄在 18 到 60 之间。")
|
||||
```
|
||||
|
||||
Python 还支持更接近数学写法的链式比较:
|
||||
|
||||
```python
|
||||
if 18 <= age <= 60:
|
||||
print("年龄在 18 到 60 之间。")
|
||||
```
|
||||
|
||||
两种写法表达相同含义。链式比较是 Python 中常见且清晰的写法。
|
||||
|
||||
## 十二、嵌套条件判断
|
||||
|
||||
一个条件分支内部还可以包含另一个条件判断,这称为嵌套(Nesting)。
|
||||
|
||||
```python
|
||||
account_enabled = True
|
||||
password_correct = True
|
||||
|
||||
if account_enabled:
|
||||
if password_correct:
|
||||
print("登录成功。")
|
||||
else:
|
||||
print("密码错误。")
|
||||
else:
|
||||
print("账户已停用。")
|
||||
```
|
||||
|
||||
这里必须先确认账户可用,才有必要继续检查密码。
|
||||
|
||||
嵌套层级过多会让代码难以阅读。只有当第二个判断确实依赖第一个判断时才使用嵌套;能够清晰地用 `and`、`elif` 表达时,不必强行嵌套。
|
||||
|
||||
## 十三、输入与条件判断
|
||||
|
||||
一个完整的交互判断程序:
|
||||
|
||||
```python
|
||||
score_text = input("请输入考核分数:")
|
||||
score = float(score_text)
|
||||
|
||||
if score >= 60:
|
||||
print("考核通过。")
|
||||
else:
|
||||
print("考核未通过。")
|
||||
```
|
||||
|
||||
输入数据参与数字比较前,仍然需要先完成类型转换。
|
||||
|
||||
## 十四、输入范围校验
|
||||
|
||||
分数通常应处于 0 到 100 之间。可以先检查输入范围:
|
||||
|
||||
```python
|
||||
if score < 0 or score > 100:
|
||||
print("分数必须在 0 到 100 之间。")
|
||||
elif score >= 60:
|
||||
print("考核通过。")
|
||||
else:
|
||||
print("考核未通过。")
|
||||
```
|
||||
|
||||
无效数据的判断应放在前面。否则 `score = 120` 可能被错误地归为“通过”。
|
||||
|
||||
当前程序仍要求用户输入能够转换为数字的内容。如何处理“abc”等完全不能转换的数据,会在异常处理课程中学习。
|
||||
|
||||
## 十五、哪些值会被当作假
|
||||
|
||||
条件不一定必须写比较表达式。Python 会把某些空值当作 `False`:
|
||||
|
||||
- `False`;
|
||||
- 数字 `0` 和 `0.0`;
|
||||
- 空字符串 `""`。
|
||||
|
||||
例如:
|
||||
|
||||
```python
|
||||
user_name = input("请输入姓名:")
|
||||
|
||||
if user_name:
|
||||
print(f"你好,{user_name}!")
|
||||
else:
|
||||
print("姓名不能为空。")
|
||||
```
|
||||
|
||||
如果用户直接按回车,`user_name` 是空字符串,程序会执行 `else`。
|
||||
|
||||
这种根据值判断真假的规则称为真值(Truth Value)。列表、字典等容器的真值将在学到对应数据类型后继续介绍。
|
||||
|
||||
## 十六、运行本课示例
|
||||
|
||||
在 PowerShell 中执行:
|
||||
|
||||
```powershell
|
||||
cd D:\Code\Python\01_python基础\1_5_条件判断
|
||||
python conditions.py
|
||||
```
|
||||
|
||||
示例会要求输入:
|
||||
|
||||
1. 考核分数;
|
||||
2. 是否完成练习,用 `yes` 或 `no` 表示。
|
||||
|
||||
建议至少运行以下几组数据:
|
||||
|
||||
| 分数 | 是否完成练习 | 重点观察 |
|
||||
| --- | --- | --- |
|
||||
| `95` | `yes` | 优秀且允许进入下一课 |
|
||||
| `75` | `no` | 合格但不能进入下一课 |
|
||||
| `50` | `yes` | 未通过 |
|
||||
| `120` | `yes` | 输入范围无效 |
|
||||
|
||||
## 十七、常见错误
|
||||
|
||||
### 17.1 漏写冒号
|
||||
|
||||
```text
|
||||
if score >= 60
|
||||
print("通过")
|
||||
```
|
||||
|
||||
条件末尾必须有英文冒号 `:`。
|
||||
|
||||
### 17.2 缩进不正确
|
||||
|
||||
属于分支的代码必须统一缩进四个空格。不要混用不一致的空格数量。
|
||||
|
||||
### 17.3 使用 `=` 进行比较
|
||||
|
||||
```text
|
||||
if score = 60:
|
||||
```
|
||||
|
||||
比较是否相等应使用 `==`。
|
||||
|
||||
### 17.4 条件顺序错误
|
||||
|
||||
多个分数等级应从高到低判断,否则宽泛条件会提前拦截更精确的分支。
|
||||
|
||||
### 17.5 把多个独立 `if` 当成互斥分支
|
||||
|
||||
```python
|
||||
if score >= 60:
|
||||
print("合格")
|
||||
|
||||
if score >= 90:
|
||||
print("优秀")
|
||||
```
|
||||
|
||||
95 分会同时输出“合格”和“优秀”。如果等级只能选择一个,应使用 `if...elif...else`。
|
||||
|
||||
### 17.6 忘记转换输入类型
|
||||
|
||||
`input()` 返回字符串。数字范围判断前应使用 `int()` 或 `float()` 转换。
|
||||
|
||||
## 十八、课堂练习
|
||||
|
||||
打开 `practice.py`,完成“Agent 学习状态评估器”。程序需要根据学习时长、练习完成情况和测验成绩,输出不同等级与下一步建议。
|
||||
|
||||
运行命令:
|
||||
|
||||
```powershell
|
||||
python practice.py
|
||||
```
|
||||
|
||||
完成后至少使用以下测试数据检查不同分支:
|
||||
|
||||
| 每天学习小时 | 已完成练习 | 测验成绩 | 预期核心结果 |
|
||||
| --- | --- | --- | --- |
|
||||
| `2.5` | `yes` | `95` | 优秀,可以继续 |
|
||||
| `1.5` | `yes` | `75` | 合格,可以继续 |
|
||||
| `0.5` | `yes` | `75` | 时长不足,暂不能继续 |
|
||||
| `2` | `no` | `80` | 练习未完成,暂不能继续 |
|
||||
| `2` | `yes` | `50` | 成绩未通过 |
|
||||
| `2` | `yes` | `120` | 输入无效 |
|
||||
|
||||
## 十九、思考题
|
||||
|
||||
1. `if` 条件为 `False` 时,缩进代码会怎样?
|
||||
2. `if...elif...else` 最多会执行几个分支?
|
||||
3. 为什么分数等级通常从高分向低分判断?
|
||||
4. 多个独立 `if` 与一组 `if...elif...else` 有什么区别?
|
||||
5. 为什么输入范围校验应该放在成绩等级判断之前?
|
||||
6. `if practice_finished:` 为什么不必写成 `if practice_finished == True:`?
|
||||
7. 空字符串在条件中会被当作真还是假?
|
||||
|
||||
## 二十、本课小结
|
||||
|
||||
- `if` 在条件为真时执行对应代码;
|
||||
- `else` 处理前面条件都不成立的情况;
|
||||
- `elif` 用于增加互斥分支;
|
||||
- 分支末尾需要英文冒号,分支内部需要统一缩进;
|
||||
- 一组 `if...elif...else` 最多执行一个分支;
|
||||
- 条件顺序会影响最终结果;
|
||||
- 布尔变量可以直接作为条件;
|
||||
- `and`、`or`、`not` 可以组成更完整的判断;
|
||||
- 嵌套条件适合表达有先后依赖的判断;
|
||||
- 空字符串、数字零等值在条件中会被当作假。
|
||||
|
||||
## 二十一、验收标准
|
||||
|
||||
- [ ] 能正确书写 `if`;
|
||||
- [ ] 能正确书写 `if...else`;
|
||||
- [ ] 能正确书写 `if...elif...else`;
|
||||
- [ ] 能使用四个空格表示分支代码;
|
||||
- [ ] 能解释条件顺序的重要性;
|
||||
- [ ] 能组合比较运算符与逻辑运算符;
|
||||
- [ ] 能完成简单的输入范围校验;
|
||||
- [ ] 能完成并运行 `practice.py`;
|
||||
- [ ] 能使用多组测试数据覆盖所有主要分支;
|
||||
- [ ] 能回答七道思考题。
|
||||
66
01_python基础/1_5_条件判断/conditions.py
Normal file
66
01_python基础/1_5_条件判断/conditions.py
Normal file
@@ -0,0 +1,66 @@
|
||||
# 第 1-5 课示例:条件判断
|
||||
#
|
||||
# 本程序根据考核分数和练习完成状态给出不同结果。
|
||||
# 建议使用讲义中的多组数据反复运行,观察每次进入了哪个分支。
|
||||
|
||||
|
||||
# 一、接收考核分数
|
||||
# input() 返回字符串,因此先保留原始文本,再转换为浮点数。
|
||||
score_text = input("请输入考核分数(0 到 100):")
|
||||
score = float(score_text)
|
||||
|
||||
|
||||
# 二、接收练习状态
|
||||
# 本示例约定用户输入 yes 表示已完成,输入其他内容表示未完成。
|
||||
practice_answer = input("是否完成练习(yes/no):")
|
||||
practice_finished = practice_answer == "yes"
|
||||
|
||||
|
||||
# 三、先判断分数范围,再判断成绩等级
|
||||
# 条件按从特殊到一般、从高分到低分的顺序排列。
|
||||
if score < 0 or score > 100:
|
||||
score_level = "输入无效"
|
||||
elif score >= 90:
|
||||
score_level = "优秀"
|
||||
elif score >= 80:
|
||||
score_level = "良好"
|
||||
elif score >= 60:
|
||||
score_level = "合格"
|
||||
else:
|
||||
score_level = "未通过"
|
||||
|
||||
print(f"成绩等级:{score_level}")
|
||||
|
||||
|
||||
# 四、组合多个条件决定能否继续
|
||||
# 只有分数处于有效范围、达到 60 分并且完成练习时,才允许继续。
|
||||
score_is_valid = 0 <= score <= 100
|
||||
score_is_passed = score >= 60
|
||||
|
||||
if score_is_valid and score_is_passed and practice_finished:
|
||||
print("课程和练习均已通过,可以进入下一课。")
|
||||
else:
|
||||
print("当前要求尚未全部完成,暂时不能进入下一课。")
|
||||
|
||||
|
||||
# 五、使用嵌套判断给出更具体的提示
|
||||
# 先确认分数有效,之后才进一步分析未满足的项目。
|
||||
if score_is_valid:
|
||||
if not score_is_passed:
|
||||
print("改进建议:重新复习知识点并再次完成测验。")
|
||||
elif not practice_finished:
|
||||
print("改进建议:成绩已经通过,请继续完成课堂练习。")
|
||||
else:
|
||||
print("学习建议:保持当前节奏,继续学习下一课。")
|
||||
else:
|
||||
print("输入提示:分数必须位于 0 到 100 之间。")
|
||||
|
||||
|
||||
# 六、演示空字符串的真值
|
||||
# 如果用户没有输入姓名而直接按回车,user_name 是空字符串,条件结果为假。
|
||||
user_name = input("请输入你的名字或称呼:")
|
||||
|
||||
if user_name:
|
||||
print(f"本次评估学习者:{user_name}")
|
||||
else:
|
||||
print("本次评估未填写学习者名称。")
|
||||
89
01_python基础/1_5_条件判断/practice.py
Normal file
89
01_python基础/1_5_条件判断/practice.py
Normal file
@@ -0,0 +1,89 @@
|
||||
# 第 1-5 课课堂练习:Agent 学习状态评估器
|
||||
#
|
||||
# 完成要求:
|
||||
# 1. 根据注释使用 if、elif 和 else 编写条件分支。
|
||||
# 2. 注意英文冒号和四个空格缩进。
|
||||
# 3. 数字输入需要转换为正确类型。
|
||||
# 4. 布尔状态应使用比较结果生成,不要保存成 "True" 或 "False" 字符串。
|
||||
# 5. 不要删除题目注释。
|
||||
# 6. 完成后使用题目末尾提供的多组数据测试程序。
|
||||
|
||||
|
||||
# 练习一:接收用户每天学习的小时数。
|
||||
# 使用 float() 转换,并保存到 daily_hours。
|
||||
|
||||
# 练习二:询问用户是否完成本课练习,约定输入 yes 或 no。
|
||||
# 将原始输入保存到 practice_answer。
|
||||
# 使用 == 比较 practice_answer 是否等于 "yes",把布尔结果保存到 practice_finished。
|
||||
|
||||
# 练习三:接收测验成绩,成绩范围为 0 到 100。
|
||||
# 使用 float() 转换,并保存到 score。
|
||||
|
||||
# 练习四:使用 if...elif...else 判断成绩等级。
|
||||
# 必须先判断 score 是否小于 0 或大于 100:
|
||||
# - 范围无效:score_level = "输入无效"
|
||||
# - 90 分及以上:score_level = "优秀"
|
||||
# - 80 分及以上:score_level = "良好"
|
||||
# - 60 分及以上:score_level = "合格"
|
||||
# - 其余有效成绩:score_level = "未通过"
|
||||
|
||||
# 练习五:创建三个布尔变量。
|
||||
# 1. score_is_valid:成绩是否处于 0 到 100 之间,请使用链式比较;
|
||||
# 2. score_is_passed:成绩是否大于或等于 60;
|
||||
# 3. learning_time_is_enough:每天学习时间是否大于或等于 1 小时。
|
||||
|
||||
# 练习六:判断是否可以继续下一课。
|
||||
# 只有以下四个条件全部成立时,can_continue 才为 True:
|
||||
# - 成绩范围有效;
|
||||
# - 成绩通过;
|
||||
# - 已经完成练习;
|
||||
# - 每天学习时间达到 1 小时。
|
||||
# 请使用 and 组合条件,把结果保存到 can_continue。
|
||||
|
||||
# 练习七:输出由 30 个等号组成的分隔线,再输出成绩等级。
|
||||
|
||||
# 练习八:使用 if...else 根据 can_continue 输出结论。
|
||||
# - 可以继续:输出“所有要求均已达到,可以进入下一课。”
|
||||
# - 不可继续:输出“当前仍有要求未达到,请查看具体建议。”
|
||||
|
||||
# 练习九:使用一组 if...elif...else 给出一条具体建议。
|
||||
# 建议按以下优先顺序判断:
|
||||
# 1. 成绩范围无效:提示输入 0 到 100 之间的分数;
|
||||
# 2. 成绩未通过:提示复习并重新测验;
|
||||
# 3. 练习未完成:提示完成课堂练习;
|
||||
# 4. 学习时间不足:提示每天至少安排 1 小时;
|
||||
# 5. 以上问题都不存在:提示保持节奏继续学习。
|
||||
#
|
||||
# 注意:这里使用 elif 是为了每次只输出当前优先级最高的一条建议。
|
||||
|
||||
# 练习十:使用 f-string 输出完整评估数据,至少包括:
|
||||
# daily_hours、practice_finished、score、score_level 和 can_continue。
|
||||
|
||||
# 完成后必须使用以下六组数据分别运行:
|
||||
#
|
||||
# 第一组:2.5、yes、95
|
||||
# 预期:优秀,可以继续。
|
||||
#
|
||||
# 第二组:1.5、yes、75
|
||||
# 预期:合格,可以继续。
|
||||
#
|
||||
# 第三组:0.5、yes、75
|
||||
# 预期:合格,但学习时间不足,不能继续。
|
||||
#
|
||||
# 第四组:2、no、80
|
||||
# 预期:良好,但练习未完成,不能继续。
|
||||
#
|
||||
# 第五组:2、yes、50
|
||||
# 预期:未通过,不能继续。
|
||||
#
|
||||
# 第六组:2、yes、120
|
||||
# 预期:输入无效,不能继续。
|
||||
|
||||
|
||||
# 完成后进行自查:
|
||||
# 1. 每个 if、elif、else 末尾是否都有英文冒号;
|
||||
# 2. 同一分支的代码是否统一缩进四个空格;
|
||||
# 3. 分数范围校验是否早于成绩等级判断;
|
||||
# 4. 成绩等级条件是否从高分向低分排列;
|
||||
# 5. can_continue 是否组合了全部四个条件;
|
||||
# 6. 六组测试数据是否分别进入了正确分支。
|
||||
128
AGENTS.md
Normal file
128
AGENTS.md
Normal file
@@ -0,0 +1,128 @@
|
||||
# Python 零基础教学项目协作规范
|
||||
|
||||
## 一、项目定位
|
||||
|
||||
本项目用于帮助没有 Python 基础的学习者,从基础语法开始,逐步掌握面向对象、数据库编程、FastAPI、Django,以及后端项目工程化与部署知识。
|
||||
|
||||
教学过程必须循序渐进。不得在没有解释基础概念的情况下,直接使用复杂语法、框架功能或专业术语。
|
||||
|
||||
## 二、语言要求
|
||||
|
||||
1. 所有回答、课程文档、练习说明和代码注释必须使用中文。
|
||||
2. 变量名、函数名、类名等代码标识符使用规范的英文命名,避免使用拼音。
|
||||
3. 专业术语第一次出现时,必须同时给出中文解释和英文原词。例如:对象关系映射(Object Relational Mapping,ORM)。
|
||||
4. 错误信息可以保留英文原文,但必须补充中文解释。
|
||||
|
||||
## 三、教学对象
|
||||
|
||||
默认学习者是零基础新手,不假设学习者已经掌握以下知识:
|
||||
|
||||
- 编程语言基础;
|
||||
- 命令行操作;
|
||||
- Git;
|
||||
- HTTP;
|
||||
- SQL;
|
||||
- 数据库;
|
||||
- Web 框架;
|
||||
- 软件测试与部署。
|
||||
|
||||
讲解新知识时,应先说明“它是什么”“为什么需要它”,再说明“如何使用它”。
|
||||
|
||||
## 四、课程组织规范
|
||||
|
||||
每一课原则上包含以下内容:
|
||||
|
||||
1. **本课目标**:说明完成本课后能够做什么。
|
||||
2. **前置知识**:列出学习本课需要掌握的内容。
|
||||
3. **概念讲解**:使用通俗语言解释核心概念。
|
||||
4. **示例代码**:提供可以独立运行的完整示例。
|
||||
5. **运行方法**:明确说明在哪个目录、执行什么命令。
|
||||
6. **运行结果**:展示正常情况下应看到的结果。
|
||||
7. **逐行解析**:解释关键代码的作用和执行顺序。
|
||||
8. **常见错误**:说明新手容易遇到的问题、原因和解决办法。
|
||||
9. **课堂练习**:提供由浅入深的练习题。
|
||||
10. **参考答案**:与题目适当分隔,避免学习者直接照抄。
|
||||
11. **本课小结**:回顾本课最重要的知识点。
|
||||
12. **验收标准**:提供可检查、可验证的完成条件。
|
||||
|
||||
每次课程只引入少量新概念。引用尚未讲解的知识时,必须补充简短说明或明确标注将在后续章节学习。
|
||||
|
||||
## 五、代码编写规范
|
||||
|
||||
1. 示例代码必须优先保证清晰、易懂和可运行,再考虑简写或高级技巧。
|
||||
2. 编写的代码必须参考项目原有注释格式,并为新手提供详尽的中文注释。
|
||||
3. 注释应重点解释代码的目的、关键步骤和容易误解的地方,避免只把代码逐字翻译成中文。
|
||||
4. 每个示例应尽量只演示一个主要知识点。
|
||||
5. 文件名、变量名、函数名和类名应做到见名知意。
|
||||
6. Python 代码遵循 PEP 8 基本风格规范。
|
||||
7. 函数和类应根据当前课程进度逐步添加类型注解,不得在入门阶段堆叠复杂类型。
|
||||
8. 涉及密码、密钥和数据库连接信息时,必须使用环境变量或示例配置,不得提交真实敏感信息。
|
||||
9. 数据库写入、文件删除等可能产生副作用的操作,必须提前说明影响并提供安全的练习方式。
|
||||
|
||||
## 六、变更流程
|
||||
|
||||
1. 修改或新增文件前,必须先说明修改方案、涉及文件和预期结果。
|
||||
2. 对本教学项目范围内的常规课程文档、示例代码和练习,说明方案后可以直接执行,无需逐次等待学习者确认。
|
||||
3. 不得一次性创建大量后续课程代码,课程内容必须跟随学习者的实际进度逐课创建。
|
||||
4. 每次修改完成后,应检查文件状态,并执行与改动范围相匹配的验证。
|
||||
5. 不得擅自删除、覆盖学习者已有的练习代码。
|
||||
6. 如果学习者的代码存在问题,应先解释原因,再提出修改方案。
|
||||
7. 删除文件、覆盖学习者已有内容、大范围重构或执行其他可能难以恢复的操作前,仍须先说明影响并取得学习者确认。
|
||||
|
||||
## 七、目录规划规范
|
||||
|
||||
课程内容按“阶段目录 → 课程目录”的层级存放,并遵循以下统一命名规范:
|
||||
|
||||
1. 阶段目录格式为 `两位阶段编号_阶段名称`,例如 `01_python基础`。
|
||||
2. 课程目录格式为 `阶段号_课程序号_课程主题`,例如 `1_1_hello_world`、`1_2_变量与数据类型`。
|
||||
3. 编号、单词和主题之间统一使用半角下划线 `_`,不得使用空格或连字符。
|
||||
4. 课程主题优先使用中文,例如 `变量与数据类型`、`类与对象`。
|
||||
5. Python、Web、HTTP、JSON、SQL、FastAPI、Django、Git、Docker、`hello_world` 等通用技术名或教学惯例,可以保留规范英文名称。
|
||||
6. 英文名称统一采用业界常见写法;目录中的普通英文单词使用小写,避免同一名称出现多套写法。
|
||||
7. 综合项目放在所属阶段内,不另外创建脱离阶段编号的项目目录。
|
||||
|
||||
规划中的阶段目录如下:
|
||||
|
||||
```text
|
||||
Python/
|
||||
├── README.md
|
||||
├── AGENTS.md
|
||||
├── 01_python基础/
|
||||
│ ├── 1_1_hello_world/
|
||||
│ └── 1_2_变量与数据类型/
|
||||
├── 02_python进阶/
|
||||
├── 03_面向对象/
|
||||
├── 04_数据库/
|
||||
├── 05_web基础/
|
||||
├── 06_fastapi/
|
||||
├── 07_django/
|
||||
└── 08_工程化与部署/
|
||||
```
|
||||
|
||||
以上结构是课程规划示意,不代表需要提前创建全部目录。目录必须按照学习者的实际学习进度依次创建:
|
||||
|
||||
1. 正式开始某一课时,才创建该课所属的阶段目录和课程目录。
|
||||
2. 每个课程目录应随课程一起创建中文讲义、示例代码和练习,不单独预建空目录。
|
||||
3. 当前课程尚未开始或尚未完成时,不得批量创建后续课程目录。
|
||||
4. 完成当前课程并经学习者确认继续后,才能准备下一课目录。
|
||||
5. 根目录 `README.md` 应同步记录当前学习进度和下一课内容。
|
||||
|
||||
## 八、教学互动规范
|
||||
|
||||
1. 默认一次推进一课,并等待学习者完成练习或确认继续。
|
||||
2. 不直接替学习者完成所有练习,应优先提供提示和思考方向。
|
||||
3. 学习者提交代码后,应从正确性、可读性和知识掌握情况三个方面反馈。
|
||||
4. 发现知识断层时,应回到对应基础内容补充讲解。
|
||||
5. 学习者说“继续”时,应先简短回顾上一课,再开始下一课。
|
||||
6. 每完成一个阶段,应安排复习、测试和综合小项目。
|
||||
|
||||
## 九、阶段验收目标
|
||||
|
||||
- Python 基础:能够独立编写命令行小程序。
|
||||
- Python 进阶:能够组织多文件程序并处理文件和异常。
|
||||
- 面向对象:能够用类设计一个小型业务模型。
|
||||
- 数据库:能够使用 SQL 和 Python 完成安全的增删改查。
|
||||
- Web 基础:能够解释一次 HTTP 请求和响应的基本过程。
|
||||
- FastAPI:能够开发带数据库和身份认证的 RESTful API。
|
||||
- Django:能够开发包含后台管理和用户系统的 Web 应用。
|
||||
- 工程化:能够为项目编写测试、管理配置并完成基础部署。
|
||||
218
README.md
Normal file
218
README.md
Normal file
@@ -0,0 +1,218 @@
|
||||
# Python 零基础到 Web 后端开发教程
|
||||
|
||||
## 项目作用
|
||||
|
||||
这是一个面向编程新手的 Python 教学项目。项目将从最基础的语法开始,通过讲解、示例、练习和阶段项目,逐步带领学习者掌握 Python 编程、面向对象、数据库开发、FastAPI、Django,以及后端项目常用的工程化知识。
|
||||
|
||||
本项目不是只供阅读的代码示例集合,而是一套可以逐课学习、亲手练习、逐步完成项目的课程。每个知识点都会说明它是什么、为什么需要它、如何使用它,以及使用时容易出现哪些错误。
|
||||
|
||||
## 适合人群
|
||||
|
||||
- 从未学习过编程的零基础学习者;
|
||||
- 学过少量 Python,但基础不够系统的学习者;
|
||||
- 希望从 Python 基础过渡到 Web 后端开发的学习者;
|
||||
- 希望学习 Django 或 FastAPI,但不知道如何开始的学习者。
|
||||
|
||||
## 最终学习目标
|
||||
|
||||
完成全部课程后,你将能够:
|
||||
|
||||
1. 阅读和编写常见的 Python 程序;
|
||||
2. 使用函数、模块、包和异常处理组织代码;
|
||||
3. 使用面向对象思想设计类和业务模型;
|
||||
4. 编写 SQL,并通过 Python 安全地操作数据库;
|
||||
5. 理解 HTTP、JSON 和 RESTful API 的基本原理;
|
||||
6. 使用 FastAPI 开发后端接口;
|
||||
7. 使用 Django 开发完整的 Web 管理系统;
|
||||
8. 为项目添加测试、日志、配置管理和基础部署能力;
|
||||
9. 独立完成一个包含数据库、接口和用户认证的后端项目。
|
||||
|
||||
## 学习路线
|
||||
|
||||
### 第一阶段:Python 基础语法
|
||||
|
||||
- 安装 Python 和开发工具;
|
||||
- 运行第一个 Python 程序;
|
||||
- 变量与基本数据类型;
|
||||
- 输入、输出和类型转换;
|
||||
- 运算符;
|
||||
- 条件判断;
|
||||
- `for` 循环与 `while` 循环;
|
||||
- 字符串;
|
||||
- 列表、元组、字典和集合;
|
||||
- 函数;
|
||||
- 基础综合项目:命令行记账或通讯录程序。
|
||||
|
||||
### 第二阶段:Python 进阶
|
||||
|
||||
- 模块与包;
|
||||
- 文件和目录操作;
|
||||
- 异常处理;
|
||||
- 列表推导式等常用简化写法;
|
||||
- 迭代器与生成器;
|
||||
- 装饰器;
|
||||
- 类型注解;
|
||||
- 虚拟环境与依赖管理;
|
||||
- 进阶综合项目:多文件任务管理程序。
|
||||
|
||||
### 第三阶段:面向对象编程
|
||||
|
||||
- 类与对象;
|
||||
- 属性和方法;
|
||||
- 构造方法;
|
||||
- 实例属性与类属性;
|
||||
- 封装;
|
||||
- 继承;
|
||||
- 多态;
|
||||
- 常用特殊方法;
|
||||
- 面向对象综合项目:图书管理系统。
|
||||
|
||||
### 第四阶段:数据库编程
|
||||
|
||||
- 数据库和关系型数据库的基本概念;
|
||||
- SQL 基础语法;
|
||||
- 表、字段、主键和外键;
|
||||
- 数据的新增、查询、修改和删除;
|
||||
- 条件查询、排序、分组和关联查询;
|
||||
- 索引与事务基础;
|
||||
- Python 连接 MySQL 或 PostgreSQL;
|
||||
- 参数化查询与 SQL 注入防护;
|
||||
- SQLAlchemy 对象关系映射;
|
||||
- 数据库综合项目:持久化图书管理系统。
|
||||
|
||||
### 第五阶段:Web 开发基础
|
||||
|
||||
- 浏览器、客户端和服务器;
|
||||
- HTTP 请求与响应;
|
||||
- URL、请求方法和状态码;
|
||||
- JSON 数据格式;
|
||||
- RESTful API 设计;
|
||||
- 使用接口调试工具发送请求;
|
||||
- 前端与后端的基本交互过程。
|
||||
|
||||
### 第六阶段:FastAPI
|
||||
|
||||
- 创建 FastAPI 项目;
|
||||
- 路由和请求方法;
|
||||
- 路径参数、查询参数和请求体;
|
||||
- 使用 Pydantic 校验数据;
|
||||
- 统一响应和异常处理;
|
||||
- 依赖注入;
|
||||
- 集成 SQLAlchemy;
|
||||
- 数据库迁移;
|
||||
- 用户注册、登录和身份认证;
|
||||
- 自动生成的接口文档;
|
||||
- FastAPI 综合项目:任务管理 API。
|
||||
|
||||
### 第七阶段:Django
|
||||
|
||||
- 创建 Django 项目和应用;
|
||||
- Django 的项目结构;
|
||||
- URL、视图和模板;
|
||||
- Model 与 ORM;
|
||||
- 数据库迁移;
|
||||
- 表单和数据校验;
|
||||
- Admin 管理后台;
|
||||
- 静态文件和媒体文件;
|
||||
- 用户、权限和身份认证;
|
||||
- Django REST Framework;
|
||||
- Django 综合项目:内容或业务管理系统。
|
||||
|
||||
### 第八阶段:工程化与部署
|
||||
|
||||
- Git 基础和版本管理;
|
||||
- 单元测试与接口测试;
|
||||
- 日志记录;
|
||||
- 环境变量和多环境配置;
|
||||
- 代码格式与质量检查;
|
||||
- Docker 基础;
|
||||
- Web 服务部署入门;
|
||||
- 最终项目整理与复盘。
|
||||
|
||||
## 建议的学习方式
|
||||
|
||||
1. 按目录编号依次学习,不要跳过基础章节。
|
||||
2. 阅读讲解后,亲手输入示例代码,不要只复制粘贴。
|
||||
3. 先独立完成练习,再查看提示或参考答案。
|
||||
4. 遇到错误时,先阅读错误信息,并记录自己尝试过的解决办法。
|
||||
5. 每学习一小节就运行代码,避免积累大量问题后再统一调试。
|
||||
6. 每完成一个阶段,都要完成阶段测试和综合项目。
|
||||
|
||||
## 每课的基本结构
|
||||
|
||||
```text
|
||||
本课目标
|
||||
前置知识
|
||||
概念讲解
|
||||
完整示例
|
||||
运行方法与预期结果
|
||||
关键代码解析
|
||||
常见错误
|
||||
课堂练习
|
||||
练习提示与参考答案
|
||||
本课小结
|
||||
验收标准
|
||||
```
|
||||
|
||||
## 目录命名规范
|
||||
|
||||
课程采用“阶段目录 → 课程目录”的两级结构,并统一遵守以下规则:
|
||||
|
||||
- 阶段目录使用 `两位阶段编号_阶段名称`,例如 `01_python基础`。
|
||||
- 课程目录使用 `阶段号_课程序号_课程主题`,例如 `1_1_hello_world`。
|
||||
- 目录名统一使用下划线 `_` 连接,不使用空格或连字符。
|
||||
- 课程主题优先使用中文,例如 `1_2_变量与数据类型`。
|
||||
- Python、Web、HTTP、JSON、SQL、FastAPI、Django、Git、Docker、`hello_world` 等通用技术名或教学惯例保留规范英文名称。
|
||||
- 普通英文目录名统一使用小写,避免出现不同大小写或多套命名方式。
|
||||
|
||||
## 计划中的项目目录
|
||||
|
||||
```text
|
||||
Python/
|
||||
├── README.md
|
||||
├── AGENTS.md
|
||||
├── 01_python基础/
|
||||
│ ├── 1_1_hello_world/
|
||||
│ ├── 1_2_变量与数据类型/
|
||||
│ └── 1_3_输入与输出/
|
||||
├── 02_python进阶/
|
||||
├── 03_面向对象/
|
||||
├── 04_数据库/
|
||||
├── 05_web基础/
|
||||
├── 06_fastapi/
|
||||
├── 07_django/
|
||||
└── 08_工程化与部署/
|
||||
```
|
||||
|
||||
这只是目录规划示意,不会提前创建全部目录。正式开始某一课时,才会创建对应的阶段目录、课程目录、中文讲义、示例代码和练习;完成当前课程并确认继续后,再创建下一课。
|
||||
|
||||
## 当前学习进度
|
||||
|
||||
- 当前阶段:第一阶段——Python 基础语法。
|
||||
- 当前课程:`1_5_条件判断`。
|
||||
- 当前状态:第五课学习中。
|
||||
- 已完成课程:`1_1_hello_world`、`1_2_变量与数据类型`、`1_3_输入与输出`、`1_4_运算符`。
|
||||
- 已创建课程目录:`01_python基础/1_1_hello_world/`、`01_python基础/1_2_变量与数据类型/`、`01_python基础/1_3_输入与输出/`、`01_python基础/1_4_运算符/`、`01_python基础/1_5_条件判断/`。
|
||||
- 下一步:阅读第五课讲义、运行分支示例并完成课堂练习。
|
||||
|
||||
## 建议环境
|
||||
|
||||
- 操作系统:Windows 10 或 Windows 11;
|
||||
- Python:学习开始时选择当前稳定版本;
|
||||
- 编辑器:PyCharm 或 Visual Studio Code;
|
||||
- 命令行:PowerShell;
|
||||
- 数据库:前期可使用 SQLite,后期学习 MySQL 或 PostgreSQL;
|
||||
- 浏览器:Chrome、Edge 或其他现代浏览器。
|
||||
|
||||
具体版本和安装步骤将在第一课中核对并讲解,避免因为版本变化使用过时的安装方式。
|
||||
|
||||
## 下一步
|
||||
|
||||
下一课将学习:
|
||||
|
||||
1. Python 是什么;
|
||||
2. 程序、编程语言和解释器分别是什么;
|
||||
3. 如何检查电脑是否已经安装 Python;
|
||||
4. 如何安装并验证 Python;
|
||||
5. 如何创建和运行第一个 `hello_world.py` 程序;
|
||||
6. 如何理解第一行 Python 代码。
|
||||
Reference in New Issue
Block a user