Python 编程基础
掌握 AI 开发必备的 Python 编程能力。涵盖 Python 语法、数据结构、函数式编程、面向对象编程及常用标准库,为后续 AI 开发打下坚实基础。
Python 基础语法
掌握 Python 的基本数据类型、控制流、函数定义、模块导入等核心语法。
学习内容
新Python 基础语法:零基础速通
如果你完全没写过代码,这篇文章就是为你准备的。不需要任何前置知识,跟着代码敲一遍,你就能看懂 Python 在说什么。
一、数据类型与变量:Python 里装东西的"盒子"
变量就像一个贴标签的盒子,你把数据放进去,以后用标签就能找到它。
# 数值:整数和小数
age = 25 # 整数(int)
price = 19.99 # 小数/浮点数(float)
# 字符串:一串文字,用单引号或双引号包起来
name = "Alice"
greeting = '你好,Python!'
# 列表:可以装很多东西,还能随时增删改
fruits = ["苹果", "香蕉", "橙子"]
fruits.append("葡萄") # 添加元素
print(fruits[0]) # 输出:苹果(索引从0开始)
# 元组:和列表很像,但创建后不能修改
coordinates = (10, 20)
# 字典:键值对,像查字典一样用"键"找"值"
student = {
"name": "小明",
"age": 20,
"score": 95.5
}
print(student["name"]) # 输出:小明
# 集合:自动去重,没有重复元素
tags = {"Python", "编程", "Python", "入门"}
print(tags) # 输出:{'Python', '编程', '入门'}
一句话总结:
- 列表用
[],能改;元组用(),不能改;字典用{}存键值对;集合用{}自动去重。
二、控制流与循环:让代码"有脑子"
2.1 条件判断:if / else
score = 85
if score >= 90:
grade = "优秀"
elif score >= 60:
grade = "及格"
else:
grade = "不及格"
print(grade) # 输出:及格
elif 是 "else if" 的缩写,表示"否则如果"。注意缩进! Python 用缩进(通常是 4 个空格)来表示代码块,而不是大括号。
2.2 循环:重复做事
for 循环:遍历一个序列。
fruits = ["苹果", "香蕉", "橙子"]
for fruit in fruits:
print(f"我喜欢吃{fruit}")
while 循环:条件满足就一直执行。
count = 0
while count < 3:
print(f"第 {count + 1} 次")
count += 1 # 等价于 count = count + 1
2.3 列表推导式:一行代码搞定循环
这是 Python 的"黑科技",把循环和条件压缩成一行:
# 传统写法
squares = []
for x in range(1, 6):
squares.append(x ** 2)
# 列表推导式(结果完全一样)
squares = [x ** 2 for x in range(1, 6)]
# 结果:[1, 4, 9, 16, 25]
# 还能加条件:只保留偶数的平方
even_squares = [x ** 2 for x in range(1, 6) if x % 2 == 0]
# 结果:[4, 16]
三、函数与模块:代码的"乐高积木"
3.1 定义函数
把一段常用代码打包成一个函数,以后直接调用:
def greet(name, greeting="你好"):
"""
打招呼的函数
name: 对方名字(必填)
greeting: 问候语(选填,默认"你好")
"""
message = f"{greeting},{name}!"
return message
# 调用函数
print(greet("小明")) # 输出:你好,小明!
print(greet("Alice", "Hello")) # 输出:Hello,Alice!
参数传递规则:
name是位置参数,调用时必须按顺序传。greeting="你好"是默认参数,不传就用默认值。
3.2 Lambda 表达式:迷你函数
如果函数只有一行,可以用 lambda 简写:
# 普通函数
def add(a, b):
return a + b
# 等价 lambda
add = lambda a, b: a + b
print(add(3, 5)) # 输出:8
lambda 常用于排序、过滤等场景:
students = [("小明", 85), ("小红", 92), ("小刚", 78)]
# 按分数(索引1)排序
students.sort(key=lambda x: x[1])
print(students) # [('小刚', 78), ('小明', 85), ('小红', 92)]
3.3 模块导入:站在巨人的肩膀上
Python 的强大在于它有海量的模块(别人写好的工具包)。
# 导入整个模块
import math
print(math.sqrt(16)) # 输出:4.0
# 只导入模块里的某个函数
from random import randint
print(randint(1, 100)) # 输出:1~100 之间的随机整数
# 给模块起别名(常用)
import datetime as dt
now = dt.datetime.now()
print(now)
包管理小贴士:
- 标准库(如
math、random、datetime)安装 Python 自带,直接 import。 - 第三方库(如
requests、pandas)需要先用 pip 安装:然后在代码里pip install requestsimport requests即可使用。
四、速查表
| 知识点 | 核心记忆点 |
|---|---|
| 变量 | = 赋值,不用声明类型 |
列表 [] | 可变、有序、能重复 |
元组 () | 不可变、有序 |
字典 {} | 键值对,键唯一 |
集合 {} | 无序、自动去重 |
| if / else | 注意缩进! |
| for / while | for 遍历,while 条件循环 |
| 列表推导式 | [表达式 for 变量 in 序列 if 条件] |
| def 函数 | return 返回值,默认参数放后面 |
| lambda | lambda 参数: 返回值 |
| import | import 模块 或 from 模块 import 函数 |
推荐资源
面向对象编程
理解类与对象、继承、多态、封装等 OOP 核心概念,掌握 Python 中的面向对象设计。
学习内容
新Python 面向对象编程
上一篇我们学会了用"盒子"装数据和用"积木"打包代码。这一篇,我们要学会用"模具造零件"——这就是面向对象编程(OOP)的核心思想。
一、类与对象:从"图纸"到"实物"
想象你要造一辆汽车。你不会每次造车都从头设计,而是先画一张图纸(类),然后照着图纸造出很多辆汽车(对象)。
# 定义一个"类"(图纸)
class Dog:
# 类的属性:所有狗共有的特征
species = "犬科"
# 构造方法:创建对象时自动执行,用来初始化对象
def __init__(self, name, age):
self.name = name # 实例属性:每只狗自己的名字
self.age = age # 实例属性:每只狗自己的年龄
# 类的方法:对象能做的事
def bark(self):
return f"{self.name} 说:汪汪!"
# 照着图纸,创建两个"对象"(实例)
dog1 = Dog("旺财", 3)
dog2 = Dog("来福", 5)
print(dog1.name) # 输出:旺财
print(dog1.bark()) # 输出:旺财 说:汪汪!
print(dog2.bark()) # 输出:来福 说:汪汪!
三个关键概念:
class:定义类的关键字,相当于图纸。__init__:构造函数,创建对象时自动调用,self代表对象自己(相当于"我")。- 实例属性:每个对象独有的数据,通过
self.xxx定义。
二、封装:把内部细节"藏"起来
封装的意思是:把复杂的东西包起来,只暴露简单的接口。
比如,你的手机只需要按一个按钮就能开机,不需要你亲自去连接每一根电线。
class BankAccount:
def __init__(self, owner, balance):
self.owner = owner
self.__balance = balance # 双下划线开头 = 私有属性,外部不能直接访问
def deposit(self, amount):
"""存钱"""
if amount > 0:
self.__balance += amount
return f"存入 {amount} 元,当前余额:{self.__balance} 元"
return "金额必须大于0"
def withdraw(self, amount):
"""取钱"""
if 0 < amount <= self.__balance:
self.__balance -= amount
return f"取出 {amount} 元,当前余额:{self.__balance} 元"
return "余额不足或金额无效"
def get_balance(self):
"""查看余额(对外提供的安全接口)"""
return self.__balance
# 使用账户
account = BankAccount("小明", 1000)
# 外部无法直接修改余额(封装保护)
# print(account.__balance) # 报错!AttributeError
# 只能通过规定的方法操作
print(account.deposit(500)) # 存入 500 元,当前余额:1500 元
print(account.withdraw(200)) # 取出 200 元,当前余额:1300 元
print(account.get_balance()) # 1300
封装的好处:
- 防止外部随意修改内部数据,保证数据安全。
- 使用者只需要知道
deposit和withdraw怎么用,不用管里面怎么算的。
三、继承:站在父辈的肩膀上
继承让子类"自动拥有"父类的所有属性和方法,还能自己扩展新功能。
# 父类:动物
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
return "某种动物叫声"
def introduce(self):
return f"我是 {self.name}"
# 子类:狗(继承自 Animal)
class Dog(Animal):
def speak(self): # 重写父类方法
return f"{self.name} 说:汪汪!"
# 子类:猫(继承自 Animal)
class Cat(Animal):
def speak(self): # 重写父类方法
return f"{self.name} 说:喵喵!"
# 使用
dog = Dog("旺财")
cat = Cat("咪咪")
print(dog.introduce()) # 我是 旺财(继承自父类)
print(dog.speak()) # 旺财 说:汪汪!(子类重写)
print(cat.speak()) # 咪咪 说:喵喵!
继承的核心:
class Dog(Animal):Dog 继承了 Animal 的一切。- 重写(Override):子类可以覆盖父类的方法,实现自己的逻辑。
super():如果想在子类里调用父类的方法,可以用super().方法名()。
四、多态:同一种调用,不同的表现
多态的字面意思是"多种形态"。在 Python 中,不同的对象可以对同一个消息做出不同的响应。
# 一个函数,接收任何 Animal 的子类对象
def animal_concert(animal):
print(animal.speak())
# 传入不同的对象,产生不同的结果
animal_concert(Dog("旺财")) # 旺财 说:汪汪!
animal_concert(Cat("咪咪")) # 咪咪 说:喵喵!
为什么这很强大?
假设你要开发一个游戏,里面有 100 种怪物。如果没有多态,你可能要写 100 个 if/else:
# 笨办法(不要这样写)
if monster_type == "狗":
dog.attack()
elif monster_type == "猫":
cat.attack()
# ... 写100个 elif
有了多态,只需要一行:
monster.attack() # 不管是什么怪物,自动调用它自己的 attack 方法
五、综合实例:设计一个小游戏角色系统
把上面学的全部串起来:
class Character:
"""游戏角色基类"""
def __init__(self, name, hp):
self.name = name
self.__hp = hp # 私有:生命值
self.__max_hp = hp
def take_damage(self, damage):
self.__hp = max(0, self.__hp - damage)
return f"{self.name} 受到 {damage} 点伤害,剩余 HP:{self.__hp}"
def is_alive(self):
return self.__hp > 0
def attack(self):
return f"{self.name} 发起攻击!"
class Warrior(Character):
"""战士:高血量,普通攻击"""
def attack(self):
return f"{self.name} 挥舞大剑,造成 15 点伤害!"
class Mage(Character):
"""法师:低血量,魔法攻击"""
def __init__(self, name, hp, mp):
super().__init__(name, hp) # 调用父类构造
self.mp = mp
def attack(self):
if self.mp >= 10:
self.mp -= 10
return f"{self.name} 释放火球术,造成 30 点伤害!剩余 MP:{self.mp}"
return f"{self.name} MP 不足,只能普通攻击!"
# 实战演示
warrior = Warrior("亚瑟", 100)
mage = Mage("甘道夫", 60, 20)
team = [warrior, mage]
for member in team:
print(member.attack()) # 多态:同样是 attack(),表现完全不同
六、速查表
| 概念 | 一句话解释 | Python 写法 |
|---|---|---|
| 类 | 对象的图纸 | class Dog: |
| 对象/实例 | 根据图纸造出来的实物 | dog = Dog() |
__init__ | 构造函数,创建对象时自动执行 | def __init__(self, name): |
self | 代表对象自己,必须作为第一个参数 | self.name = name |
| 实例属性 | 每个对象独有的数据 | self.age = 5 |
| 类属性 | 所有对象共享的数据 | species = "犬科" |
| 方法 | 对象能做的事 | def bark(self): |
| 封装 | 把内部细节藏起来,只暴露接口 | __balance(私有属性) |
| 继承 | 子类自动拥有父类的一切 | class Dog(Animal): |
| 重写 | 子类覆盖父类的方法 | 同名方法重新定义 |
| 多态 | 同一个调用,不同对象表现不同 | animal.speak() |
OOP 的本质不是语法,而是思维方式。 当你看到任何问题都下意识想"这里该定义一个什么类"时,你就真正入门了。
Python 进阶特性
学习装饰器、生成器、上下文管理器、迭代器等 Python 高级特性,提升代码质量和开发效率。
学习内容
新Python 进阶特性
当你已经会写函数和类,下一步就是学会 Python 的"秘密武器"——它们能让你的代码更简洁、更高效、更优雅。这篇不需要你提前掌握复杂理论,跟着代码敲一遍,你会发现"原来还能这样写"。
一、迭代器:逐个"拿"东西,而不是一次性"搬"回家
迭代器是一个记住遍历位置的对象,它一次只给你一个元素,而不是把所有元素一股脑塞给你。
# 列表是可迭代对象,但不是迭代器
my_list = [1, 2, 3]
# 用 iter() 把它变成迭代器
it = iter(my_list)
# 用 next() 逐个取值
print(next(it)) # 1
print(next(it)) # 2
print(next(it)) # 3
# print(next(it)) # 报错!StopIteration,已经取完了
为什么要用迭代器? 想象你在看一本 1000 页的书。列表相当于把整本书复印一份给你,迭代器相当于一次只翻开一页给你看——省内存。
自己写一个迭代器:
class CountDown:
"""从 n 倒数到 1 的迭代器"""
def __init__(self, start):
self.start = start
def __iter__(self):
return self
def __next__(self):
if self.start <= 0:
raise StopIteration # 迭代结束的信号
self.start -= 1
return self.start + 1
# 使用
for num in CountDown(5):
print(num) # 输出:5, 4, 3, 2, 1
二、生成器:用函数写迭代器,一行 yield 搞定
如果你觉得上面的类太麻烦,生成器就是救星。它用普通函数的写法,实现迭代器的功能。
def countdown(n):
"""从 n 倒数到 1"""
while n > 0:
yield n # yield 会"暂停"函数,记住当前状态,下次从这里继续
n -= 1
# 使用
for num in countdown(5):
print(num) # 输出:5, 4, 3, 2, 1
yield 和 return 的区别:
return:函数结束,返回值,下次调用从头再来。yield:函数"暂停",返回值,下次调用从暂停处继续。
生成器表达式:和列表推导式很像,只是把 [] 换成 ():
# 列表推导式:一次性生成所有数据,占用内存
squares_list = [x**2 for x in range(1000000)]
# 生成器表达式:惰性求值,用的时候才生成,几乎不占内存
squares_gen = (x**2 for x in range(1000000))
print(sum(squares_gen)) # 可以正常计算,但内存占用极小
三、装饰器:给函数"穿外套",不改动原代码加功能
装饰器本质上是一个接收函数作为参数,并返回一个新函数的函数。
3.1 最简单的装饰器
假设你想知道每个函数运行了多久:
import time
def timer(func):
"""计时装饰器"""
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
print(f"{func.__name__} 运行了 {time.time() - start:.4f} 秒")
return result
return wrapper
# @timer 是语法糖,等价于:slow_function = timer(slow_function)
@timer
def slow_function():
time.sleep(1)
return "Done"
slow_function()
# 输出:slow_function 运行了 1.0012 秒
*args 和 **kwargs 是 Python 的"万能参数",表示"不管传多少个位置参数和关键字参数,我都能接住"。
3.2 带参数的装饰器
如果你想让装饰器更灵活,可以套两层:
def repeat(times):
"""让函数重复执行 n 次"""
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(times):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(times=3)
def say_hello():
print("你好!")
say_hello() # 输出 3 次"你好!"
四、上下文管理器:with 语句,自动帮你"善后"
打开文件后忘记关闭?获取锁后忘记释放?上下文管理器就是用来解决这类"用了要还"的问题。
4.1 基本用法:with 语句
# 传统写法(容易忘记关闭)
f = open("test.txt", "w")
f.write("hello")
f.close()
# 上下文管理器(自动关闭,即使出异常也会关闭)
with open("test.txt", "w") as f:
f.write("hello")
# 出了 with 块,文件自动关闭
4.2 自己实现上下文管理器
class DatabaseConnection:
"""模拟数据库连接"""
def __enter__(self):
print("🔗 连接数据库...")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("🔒 关闭数据库连接...")
# 如果返回 True,会吞掉异常;返回 None,异常正常抛出
def query(self, sql):
print(f"执行 SQL:{sql}")
# 使用
with DatabaseConnection() as db:
db.query("SELECT * FROM users")
# 输出:
# 🔗 连接数据库...
# 执行 SQL:SELECT * FROM users
# 🔒 关闭数据库连接...
4.3 用 contextmanager 简化(推荐)
用装饰器写更简洁:
from contextlib import contextmanager
@contextmanager
def managed_resource(name):
print(f"获取资源:{name}")
yield name # yield 之前的代码是 __enter__,之后的是 __exit__
print(f"释放资源:{name}")
with managed_resource("数据库连接") as r:
print(f"使用 {r} 中...")
# 输出:
# 获取资源:数据库连接
# 使用 数据库连接 中...
# 释放资源:数据库连接
五、综合实例:处理大文件的"最佳实践"
把四大特性串起来,写一个读取大日志文件并统计关键词的工具:
import time
from contextlib import contextmanager
# 1. 上下文管理器:安全打开文件
@contextmanager
def safe_open(filename):
print(f"📂 正在打开 {filename}...")
f = open(filename, "r", encoding="utf-8")
try:
yield f
finally:
f.close()
print(f"📂 已关闭 {filename}")
# 2. 生成器:逐行读取,不占用大量内存
def line_generator(file_obj):
for line in file_obj:
yield line.strip() # strip() 去掉换行符
# 3. 装饰器:统计处理时间
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
print(f"⏱️ {func.__name__} 耗时:{time.time() - start:.4f} 秒")
return result
return wrapper
# 4. 综合使用
@timer
def count_keyword(filename, keyword):
count = 0
with safe_open(filename) as f:
# 迭代器 + 生成器:逐行处理,内存友好
for line in line_generator(f):
if keyword in line:
count += 1
return count
# 假设有一个大日志文件,统计"ERROR"出现次数
# result = count_keyword("app.log", "ERROR")
# print(f"找到 {result} 处错误")
六、速查表
| 特性 | 核心作用 | 关键语法 | 记忆口诀 |
|---|---|---|---|
| 迭代器 | 逐个取值,省内存 | __iter__() + __next__() | "翻书一页一页看" |
iter() / next() | 把可迭代对象变成迭代器 | it = iter(list) | "造个迭代器" |
| 生成器 | 用函数写迭代器 | yield | "暂停魔法" |
| 生成器表达式 | 惰性求值的推导式 | (x for x in range(100)) | "圆括号省内存" |
| 装饰器 | 不改动原函数,加功能 | @decorator | "给函数穿外套" |
*args / **kwargs | 接收任意参数 | def func(*args, **kwargs) | "万能口袋" |
| 上下文管理器 | 自动获取和释放资源 | with ... as ... | "用了自动还" |
__enter__ / __exit__ | 上下文管理器的两个钩子 | 类方法实现 | "进门出门" |
@contextmanager | 用生成器简化上下文管理器 | yield 分割前后逻辑 | "装饰器版 with" |
进阶特性的本质,是让代码写得更"Pythonic"。 不要追求炫技,而是在合适的场景用合适的工具。当你习惯用
with管理资源、用yield处理大数据、用装饰器解耦功能时,你就从"会写 Python"变成了"写好 Python"。
推荐资源
科学计算库入门
初步了解 NumPy 数值计算、Pandas 数据处理、Matplotlib 数据可视化等 AI 开发必备库。
学习内容
新Python 科学计算库入门
如果说 Python 是 AI 世界的"普通话",那么 NumPy、Pandas、Matplotlib 就是这门语言里的"三板斧"。学会它们,你就拿到了进入数据科学和 AI 大门的钥匙。
一、NumPy:让 Python 算得飞快
Python 自带的列表算数学很慢。NumPy 提供了数组(ndarray),让你像写数学公式一样批量计算。
import numpy as np
# 创建数组:比 Python 列表快几十倍
arr = np.array([1, 2, 3, 4, 5])
# 批量运算:每个元素同时操作
print(arr * 2) # [ 2 4 6 8 10]
print(arr + 10) # [11 12 13 14 15]
# 二维数组:像数学里的矩阵
matrix = np.array([[1, 2], [3, 4], [5, 6]])
print(matrix.shape) # (3, 2) 3行2列
# 常用计算:求和、平均、最大
print(np.sum(arr)) # 15
print(np.mean(arr)) # 3.0
print(np.max(arr)) # 5
一句话记住 NumPy: 把一堆数字装进一个"超级列表",一次性算完,不用写循环。
二、Pandas:Excel 表格的 Python 版
Pandas 用 DataFrame(数据框)来管理表格数据,就像 Python 里的 Excel。
import pandas as pd
# 创建一张表格
data = {
"姓名": ["小明", "小红", "小刚"],
"年龄": [20, 22, 21],
"分数": [85, 92, 78]
}
df = pd.DataFrame(data)
# 查看数据
print(df.head(2)) # 看前2行
print(df["分数"]) # 取某一列
print(df[df["分数"] > 80]) # 筛选:分数大于80的行
# 统计摘要
print(df.describe()) # 自动算平均、最大、最小等
读取真实文件:
# 读取 CSV(最常用)
df = pd.read_csv("data.csv")
# 保存结果
df.to_csv("result.csv", index=False)
一句话记住 Pandas: 用代码操作 Excel 表格,筛选、统计、读写文件,几行搞定。
三、Matplotlib:把数据画成图
数据藏在表格里看不出趋势?画出来就一目了然。
import matplotlib.pyplot as plt
# 数据
months = ["1月", "2月", "3月", "4月", "5月"]
sales = [120, 150, 180, 140, 200]
# 画折线图
plt.plot(months, sales, marker="o", color="red")
plt.title("月度销售额")
plt.xlabel("月份")
plt.ylabel("销售额(万元)")
plt.grid(True)
plt.show()
常用图表类型:
# 柱状图
plt.bar(months, sales, color="skyblue")
# 散点图
plt.scatter([1, 2, 3], [4, 5, 6])
# 饼图
plt.pie([30, 20, 50], labels=["A", "B", "C"], autopct="%1.1f%%")
一句话记住 Matplotlib: 给数据拍张照,折线、柱状、饼图,选一种让数字开口说话。
四、4 分钟速查表
| 库 | 核心对象 | 常用操作 | 什么时候用 |
|---|---|---|---|
| NumPy | ndarray 数组 | np.array()、np.sum()、np.mean() | 大量数字计算、矩阵运算 |
| Pandas | DataFrame 表格 | pd.read_csv()、df["列名"]、df.describe() | 处理表格数据、数据清洗 |
| Matplotlib | plt 画图模块 | plt.plot()、plt.bar()、plt.show() | 数据可视化、出报告 |
NumPy 负责算,Pandas 负责管,Matplotlib 负责看。 这三个库配合起来,就是 AI 开发最基础的数据流水线。先把这"三板斧"练熟,后面的机器学习库(如 Scikit-learn、PyTorch)学起来会轻松很多。