本文来自《AI 应用开发课程》月份 1 课程文档,已整理为网站文章版本。
学习目标
学完本节后,你应当能够:
- 理解 Python 文件如何执行。
- 写出变量、条件、循环、函数的最小代码。
- 明白 Python 与静态类型语言在书写风格上的主要差异。
- 能运行自己的第一个 Python 脚本。
前置知识
- 已完成
00-课程总纲与学习说明/02-环境准备与学习方法.md
1. 你需要先建立的 Python 直觉
如果你有 Java、Go、JavaScript、C# 等语言经验,可以这样理解 Python:
- Python 用缩进表达代码块,而不是大括号。
- Python 是动态语言,但现代工程实践仍然大量使用类型注解。
- Python 的“写起来快”不代表“可以随便写”。月份 1 采用的是工程化写法,不是脚本随手写法。
2. 第一个脚本
创建文件 hello.py:
name = "Python"
print(f"Hello, {name}!")
执行:
python3 hello.py
预期输出:
Hello, Python!
3. 变量与基本类型
Python 常见基础类型:
strintfloatboollistdict
示例:
username = "leo"
age = 18
score = 95.5
is_active = True
skills = ["python", "fastapi", "llm"]
profile = {"name": "leo", "city": "shenzhen"}
注意:
- Python 变量不需要提前声明类型。
- 但在工程项目中,我们后面会逐步加入类型注解。
4. 条件与循环
条件语句
score = 85
if score >= 90:
print("excellent")
elif score >= 60:
print("pass")
else:
print("fail")
for 循环
skills = ["python", "fastapi", "llm"]
for skill in skills:
print(skill)
while 循环
count = 0
while count < 3:
print(count)
count += 1
5. 函数
函数是月份 1 最重要的基础之一。因为后面的模型调用、工具执行、接口处理,本质上都建立在函数组织上。
示例:
def greet(name: str) -> str:
return f"Hello, {name}!"
说明:
name: str是参数类型注解。-> str是返回值类型注解。
调用:
message = greet("Leo")
print(message)
6. Python 中最常见的集合操作
列表
messages = ["hello", "hi", "good morning"]
messages.append("bye")
print(len(messages))
print(messages[0])
字典
user = {"name": "leo", "role": "developer"}
print(user["name"])
user["city"] = "shenzhen"
月份 1 后面经常会用字典表达请求体、响应体和配置项,但更推荐在工程代码里尽快升级为 Pydantic 模型。
7. 常见语法差异
如果你来自其他语言,需要特别注意:
None类似于其他语言里的null- 布尔值是
True和False - 字符串格式化推荐使用
f-string - 缩进是语法的一部分,不能乱
错误示例:
if True:
print("wrong")
上面会报缩进错误。
8. 实操任务
完成下面 3 个小任务:
- 写一个脚本,打印 1 到 10 中的偶数。
- 写一个函数,接收用户名和年龄,返回一句介绍。
- 写一个列表,保存 3 个模型名,并循环打印。
9. 自测题
- Python 为什么不需要显式声明变量类型?
- 为什么工程代码中仍然推荐加类型注解?
if、for和函数体为什么都必须正确缩进?
10. 作业与验收
你需要完成一个文件 python_basics.py,其中至少包含:
- 一个函数
- 一个条件判断
- 一个循环
- 一个列表
- 一个字典
验收标准:
- 能运行成功
- 没有语法错误
- 你能逐段解释每一行做了什么
11. 常见错误
- 把缩进写乱
- 忘记给字符串加引号
- 把
=和==混淆 - 把列表下标写越界
12. 延伸阅读
- Python 官方教程里的基础语法部分
- Real Python 的 Python 入门文章
13. 本章与前文关系
本章承接环境准备章节,是整个 Python 补位模块的起点。你在这里学的不是“Python 全部语法”,而是后续月份 1 会频繁反复出现的那一小部分:
- 基础数据类型
- 条件和循环
- 函数
- 缩进
- 脚本执行
如果这些内容不稳,后面你看到 config.py、models.py、chat_service.py 时,会不断被最基础语法绊住。
14. 本章在研发助手项目中的位置
研发助手项目中的每个文件,本质上都建立在本章这些最基础的语言能力上:
config.py里会有变量、函数和条件判断models.py里会定义类和数据结构main.py里会有入口函数tests/里会写一堆小函数
你现在学的不是孤立例子,而是项目未来所有文件的最小语法前提。
15. 一个更贴近工程的 Python 心智模型
如果你来自 Java、Go、JavaScript、C# 或其他语言,可以用下面这个方式理解 Python:
Python 不强调“先声明,再使用”
它更强调“写出足够清晰、足够短、足够可读的表达式和函数”。
Python 不靠大括号分层
它靠缩进分层。对初学者来说,这一开始会不适应,但它也迫使你写更整洁的结构。
Python 虽然是动态语言,但工程上并不鼓励“随便写”
月份 1 会不断强调:
- 类型注解
- 明确函数边界
- 清晰模块拆分
- 稳定的异常处理
所以请不要把“动态语言”误解成“无需约束”。
16. 错误示例 vs 正确示例
错误示例:把所有逻辑塞进一串临时表达式
name = "leo"; age = 18; print("name=" + name + ", age=" + str(age))
这在 Python 里不是不能运行,而是很快会让代码可读性变差。月份 1 不使用这种“脚本凑合跑”的风格。
正确示例:把意图写清楚
name = "leo"
age = 18
print(f"name={name}, age={age}")
这段代码的可读性更高,也更容易被后续维护者理解。
17. 完整文件级示例:python_basics.py
下面这份文件不是为了追求功能复杂,而是为了让你一次看到月份 1 后面最常出现的基础语法元素。
"""月份 1 Python 基础演示文件。
这个文件故意把变量、条件、循环和函数放在一起,
目的是让初学者先熟悉 Python 的基本控制流写法。
"""
def build_profile(name: str, age: int, city: str) -> dict[str, str | int]:
"""构造一个简单的用户资料字典。
这里先用字典表达结构化数据,后面会逐步升级为数据类和 Pydantic 模型。
"""
return {
"name": name,
"age": age,
"city": city,
}
def describe_user(profile: dict[str, str | int]) -> str:
"""根据资料生成一段自然语言介绍。"""
return (
f"用户 {profile['name']},年龄 {profile['age']},"
f"所在城市是 {profile['city']}。"
)
def print_skill_levels(skills: list[str]) -> None:
"""遍历技能列表,并用条件判断输出不同提示。"""
for skill in skills:
if skill == "python":
print(f"{skill}: 这是月份 1 的语言基础")
elif skill == "fastapi":
print(f"{skill}: 这是月份 1 第 3 周的重要主题")
else:
print(f"{skill}: 这是后续会反复使用的能力")
def main() -> None:
"""脚本入口函数。"""
profile = build_profile(name="Leo", age=18, city="Shenzhen")
skills = ["python", "fastapi", "llm"]
print(describe_user(profile))
print_skill_levels(skills)
if __name__ == "__main__":
main()
这份代码里有哪些值得注意的地方
第一,函数不是装饰品,而是组织逻辑的最小单位
我们把“构造资料”“生成人类可读描述”“打印技能信息”分别拆成函数,是为了让每个动作单独命名、单独调用、单独测试。
第二,main() 的意义是把程序入口收口
月份 1 后面几乎所有脚本都会逐步形成这种结构:
- 先定义函数
- 再定义入口
- 最后在
if __name__ == "__main__":中启动
第三,字典只是当前阶段的过渡形态
这里先用字典,是因为你还没完全进入数据类和 Pydantic 阶段。后面会把这种结构逐步升级。
18. 逐段解释这份完整示例
顶部文档字符串
它告诉读者:这个文件是干什么的。这不是语法必要项,但在课程和工程里非常有价值。
build_profile
这个函数负责“构造结构”,相当于后面很多 builder 或“数据准备函数”的雏形。
describe_user
这个函数负责“把结构化数据转成文本”,这个思路以后会在 Prompt 组装、日志生成和响应格式化中不断出现。
print_skill_levels
这个函数让你一次看到:
forif/elif/elsef-string
main
这让你明白:程序入口通常只负责组装数据和调用函数,而不是把所有逻辑直接堆在那里。
19. 从最小实现到工程实现的递进
你可以把本章的学习分成三个层次:
层次一:会读
能看懂变量、条件、循环和函数。
层次二:会改
能自己把 build_profile 的字段从 city 改成 role,或者给 print_skill_levels 增加一个分支。
层次三:会迁移
看到后面 config.py、logger.py、chat_service.py 中的函数时,你能意识到:这些本质上还是函数、条件和数据结构,只是场景变了。
20. 一个更接近后续项目的增强版练习
在上面的 python_basics.py 基础上,继续做下面两个增强:
- 给
build_profile增加role - 在
main()中根据role打印不同介绍
示例增强方向:
def build_profile(name: str, age: int, city: str, role: str) -> dict[str, str | int]:
return {
"name": name,
"age": age,
"city": city,
"role": role,
}
这一步的意义不在于复杂,而在于训练你开始“改例子”,而不是只会运行例子。
21. 调试与排错:本章最常见的 4 类问题
问题一:缩进错误
现象通常是:
IndentationError: expected an indented block
说明你很可能在 if、for 或函数体后面漏了缩进。
问题二:拼接字符串时类型错误
例如把整数直接用 + 和字符串拼接。月份 1 推荐你尽量用 f-string,这样更稳定。
问题三:函数定义了,但没调用
很多初学者以为“写了函数,程序就会自动执行”。实际上,函数只是定义,除非你调用它。
问题四:变量名写错
动态语言里,变量名错误通常运行时才会暴露,所以写完后要主动跑一次脚本。
22. 本章完成后你应该具备的能力
完成本章后,你应当至少做到:
- 能独立写一个最小 Python 脚本。
- 能解释
main()和普通函数的差别。 - 能看懂一段含有条件和循环的中短代码。
- 能自己修改示例中的字段和逻辑分支。
23. 如果你卡在这里,先回看哪几章
- 环境命令跑不通:回看 02-环境准备与学习方法.md
- 不知道学习顺序:回看 00-月份1学习导航.md
24. 从本章过渡到下一章的桥接说明
接下来进入 02-函数-模块-包.md。
本章让你先适应 Python 语法形态,但项目开发不可能所有代码都写在一个文件里。下一章会解决另一个关键问题:如何把这些基础语法组织成多个文件、模块和包,从而为后面的 app/services、app/clients 和 tests/ 做铺垫。