← Back to 文字

Python 最小入门

本文来自《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 常见基础类型:

  • str
  • int
  • float
  • bool
  • list
  • dict

示例:

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
  • 布尔值是 TrueFalse
  • 字符串格式化推荐使用 f-string
  • 缩进是语法的一部分,不能乱

错误示例:

if True:
print("wrong")

上面会报缩进错误。

8. 实操任务

完成下面 3 个小任务:

  1. 写一个脚本,打印 1 到 10 中的偶数。
  2. 写一个函数,接收用户名和年龄,返回一句介绍。
  3. 写一个列表,保存 3 个模型名,并循环打印。

9. 自测题

  1. Python 为什么不需要显式声明变量类型?
  2. 为什么工程代码中仍然推荐加类型注解?
  3. iffor 和函数体为什么都必须正确缩进?

10. 作业与验收

你需要完成一个文件 python_basics.py,其中至少包含:

  • 一个函数
  • 一个条件判断
  • 一个循环
  • 一个列表
  • 一个字典

验收标准:

  • 能运行成功
  • 没有语法错误
  • 你能逐段解释每一行做了什么

11. 常见错误

  • 把缩进写乱
  • 忘记给字符串加引号
  • === 混淆
  • 把列表下标写越界

12. 延伸阅读

  • Python 官方教程里的基础语法部分
  • Real Python 的 Python 入门文章

13. 本章与前文关系

本章承接环境准备章节,是整个 Python 补位模块的起点。你在这里学的不是“Python 全部语法”,而是后续月份 1 会频繁反复出现的那一小部分:

  • 基础数据类型
  • 条件和循环
  • 函数
  • 缩进
  • 脚本执行

如果这些内容不稳,后面你看到 config.pymodels.pychat_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 组装、日志生成和响应格式化中不断出现。

这个函数让你一次看到:

  • for
  • if/elif/else
  • f-string

main

这让你明白:程序入口通常只负责组装数据和调用函数,而不是把所有逻辑直接堆在那里。

19. 从最小实现到工程实现的递进

你可以把本章的学习分成三个层次:

层次一:会读

能看懂变量、条件、循环和函数。

层次二:会改

能自己把 build_profile 的字段从 city 改成 role,或者给 print_skill_levels 增加一个分支。

层次三:会迁移

看到后面 config.pylogger.pychat_service.py 中的函数时,你能意识到:这些本质上还是函数、条件和数据结构,只是场景变了。

20. 一个更接近后续项目的增强版练习

在上面的 python_basics.py 基础上,继续做下面两个增强:

  1. build_profile 增加 role
  2. 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

说明你很可能在 iffor 或函数体后面漏了缩进。

问题二:拼接字符串时类型错误

例如把整数直接用 + 和字符串拼接。月份 1 推荐你尽量用 f-string,这样更稳定。

问题三:函数定义了,但没调用

很多初学者以为“写了函数,程序就会自动执行”。实际上,函数只是定义,除非你调用它。

问题四:变量名写错

动态语言里,变量名错误通常运行时才会暴露,所以写完后要主动跑一次脚本。

22. 本章完成后你应该具备的能力

完成本章后,你应当至少做到:

  1. 能独立写一个最小 Python 脚本。
  2. 能解释 main() 和普通函数的差别。
  3. 能看懂一段含有条件和循环的中短代码。
  4. 能自己修改示例中的字段和逻辑分支。

23. 如果你卡在这里,先回看哪几章

24. 从本章过渡到下一章的桥接说明

接下来进入 02-函数-模块-包.md

本章让你先适应 Python 语法形态,但项目开发不可能所有代码都写在一个文件里。下一章会解决另一个关键问题:如何把这些基础语法组织成多个文件、模块和包,从而为后面的 app/servicesapp/clientstests/ 做铺垫。

Fin