专为青少年和零基础学习者设计的完整 Python 课程体系

10岁掌握AI时代的核心语言,从星际编程开始

告别枯燥语法,用游戏化闯关解锁编程超能力

24
核心章节
100+
实战练习
20道
经典题目
5,000+
星际学员

⭐ 已有 5,000+ 名星际学员加入,下一个编程小极客就是你!

main.py
1def calculate(self, x, y):
2 result = x * y + 100
3 return result
4
5class DataAnalyzer:
6 def process(self, data):
7 cleaned = [x for x in data if x]:
8 sorted_data = sorted(cleaned)
9 return sorted_data
10 # 数据分析完成
📚

完整课程体系

初级8章 + 中级10章 + 高级6章,从Hello World到机器学习入门,知识点循序渐进,零基础到专业级全覆盖。

💡

习题深度解析

20道经典Python面试题和编程练习题,详细讲解思路和实现方案,彻底掌握核心概念。

📖

核心单词速记

精选Python编程常用英文词汇,结合编程场景理解记忆,让代码阅读更顺畅。

💻

实战项目驱动

每个阶段都有配套项目,从简单游戏到实用工具,让你在实践中检验学习成果。

📚

完整课程体系

初级8章 + 中级10章 + 高级6章,从Hello World到机器学习入门,知识点循序渐进,零基础到专业级全覆盖。

💡

习题深度解析

20道经典Python面试题和编程练习题,详细讲解思路和实现方案,彻底掌握核心概念。

📖

核心单词速记

精选Python编程常用英文词汇,结合编程场景理解记忆,让代码阅读更顺畅。

💻

实战项目驱动

每个阶段都有配套项目,从简单游戏到实用工具,让你在实践中检验学习成果。

🎓 初级课程

8大核心章节,从零开始构建Python基础能力,完成从了解到入门的蜕变

01

Python 初探

什么是编程 · 安装Python · 第一行代码 · print()详解

🚀 免费开启星际之旅
02

变量与数据类型

数字 · 字符串 · 类型转换 · 运算符

🚀 免费开启星际之旅
03

输入与输出

input()函数 · 格式化输出 · 交互程序 · 类型转换

🚀 免费开启星际之旅
04

条件判断

if语句 · 比较运算符 · 逻辑判断 · 嵌套if

🚀 免费开启星际之旅
05

循环结构

for循环 · while循环 · 循环控制 · range详解

🚀 免费开启星际之旅
06

列表与元组

列表操作 · 索引切片 · 遍历列表 · 常用方法

🚀 免费开启星际之旅
07

函数基础

定义函数 · 参数与返回值 · 模块化编程 · 作用域

🚀 免费开启星际之旅
08

综合项目实战

猜数字游戏 · 简易计算器 · 成绩管理系统 · 石头剪刀布

🚀 免费开启星际之旅

⚡ 中级课程

10个进阶章节,掌握Python高级特性,迈向专业程序员之路

M1

面向对象编程

类与对象 · 构造函数 · 属性与方法 · 封装特性

进入学习 →
M2

继承与多态

类的继承 · super()函数 · 方法重写 · 多态特性

进入学习 →
M3

文件操作与持久化

文件读写 · JSON格式 · 异常处理 · 上下文管理

进入学习 →
M4

装饰器与高阶函数

闭包详解 · 装饰器模式 · 多重装饰 · wraps装饰

进入学习 →
M5

生成器与迭代器

迭代协议 · yield关键字 · 生成器表达式 · 惰性计算

进入学习 →
M6

Lambda与函数式编程

匿名函数 · map/filter/reduce · 函数组合

进入学习 →
M7

正则表达式

re模块详解 · 元字符 · 分组捕获 · 贪婪匹配

进入学习 →
M8

模块与包管理

模块导入 · __name__机制 · 包结构 · pip安装

进入学习 →
M9

时间与日期处理

datetime模块 · 时间戳 · 日期格式化 · timedelta

进入学习 →
M10

综合项目实战

个人日记本 · 通讯录管理 · 数据分析脚本

进入学习 →

🚀 高级课程

掌握专业级技能,成为真正的Python开发者

A1

🌐 网络编程与Web开发

Socket编程基础、HTTP协议解析、使用Flask构建Web应用、RESTful API设计。

Socket Flask HTTP API
进入学习 →
A2

⚡ 异步编程与并发

深入理解asyncio库、协程与事件循环、异步IO操作、高并发程序设计。

asyncio 协程 并发 aiohttp
进入学习 →
A3

📊 数据分析与可视化

NumPy数值计算、Pandas数据处理、Matplotlib数据可视化、数据清洗。

NumPy Pandas Matplotlib 数据清洗
进入学习 →
A4

🤖 机器学习入门

Scikit-learn核心算法、监督学习与无监督学习、模型训练与评估、特征工程。

Scikit-learn 监督学习 特征工程 模型评估
进入学习 →
A5

🗄️ 数据库与SQL

SQLite基础操作、MySQL连接与查询、SQLAlchemy ORM、数据库设计。

SQLite MySQL SQLAlchemy ORM
进入学习 →
A6

🧪 测试与安全编程

单元测试与pytest、异常处理进阶、日志记录、性能分析与优化。

pytest 安全 日志 性能优化
进入学习 →

🎓 Python初级课程

点击章节展开,开始学习知识点并完成练习

🎯 本章目标

  • ✅ 了解什么是编程以及 Python 的特点
  • ✅ 学会安装 Python 和 IDLE
  • ✅ 掌握 print() 函数的基本用法
  • ✅ 理解字符串和数字的区别

什么是编程?

编程,就是给计算机写"指令",告诉它一步一步做什么。就像你给妈妈写一张做菜的步骤清单一样,计算机非常听话,只要指令写得清楚,它就会严格执行。

Python 是一种非常适合初学者学习的编程语言,它的语法简洁明了,读起来几乎像英语。很多学校、科技馆和互联网公司都在使用 Python。Python 的名字来源于英国喜剧团体"蒙提·派森的飞行马戏团",创始人 Guido van Rossum 希望这门语言像这个喜剧一样有趣。

Python 能做很多事情:写小游戏、处理数据、做网站、甚至训练人工智能。世界上很多大公司(Google、YouTube、Instagram)都在用 Python。

安装 Python

学习编程的第一步,是在电脑上安装 Python 解释器。解释器就像一位"翻译官",它能把我们写的 Python 代码翻译成计算机能听懂的语言。

安装步骤:
1. 打开浏览器,访问 python.org
2. 点击 "Downloads",下载最新版 Python 3.x
3. 运行安装程序,记得勾选 "Add Python to PATH"
4. 安装完成后,在开始菜单找到 "IDLE",这就是 Python 自带的编程环境

IDLE 是什么? 它是 Python 自带的简单编辑器,你可以在里面写代码并立刻看到结果。界面是黑底白字(或白底黑字)的窗口,非常适合初学者。

你的第一行代码:Hello World

学习任何编程语言,传统上第一个程序都是让屏幕显示 "Hello, World!"。在 Python 中,这只需要一行代码:
print("Hello, World!")
print("你好,Python!")
print("我在学习编程!")
print() 是一个"函数",它的作用是把括号里的内容显示到屏幕上。括号里的文字需要用引号 "" 包起来,这叫做"字符串"。

注意:Python 严格区分大小写!Print 和 print 是不一样的,必须全部小写。

print() 的更多用法

print() 不仅可以打印文字,还可以打印数字,甚至可以一次打印多个内容:
print(100)              # 打印数字,不需要引号
print(3 + 5)            # 可以计算,会输出 8
print(10 * 10)          # 输出 100
print("年龄:", 12)    # 用逗号隔开,可以同时打印多个
print("2 + 3 =", 2 + 3)  # 输出:2 + 3 = 5
用逗号隔开多个内容时,Python 会自动在中间加一个空格。print() 每次输出后会自动换行。

注释:给代码写"笔记"

在代码中,我们可以用 # 写注释。注释是给人类看的说明文字,Python 会完全忽略它。好的注释能让代码更容易理解。
# 这是一行注释,Python不会执行它
print("Hello")  # 注释也可以写在代码后面
# print("这行被注释掉了,不会执行")

📝 本章小结

  • 💡 编程就是给计算机写指令
  • 💡 print() 用于输出内容到屏幕
  • 💡 字符串需要用引号包围,数字不需要
  • 💡 Python 语法简洁,适合初学者

📝 练习题(共5题)

1. 以下哪行代码可以在屏幕上显示 "我爱Python"?
2. print(10 + 20) 会输出什么?
3. 以下哪行是合法的 Python 注释?
4. print("2 + 3 =", 2 + 3) 的输出结果是?
5. 以下哪个说法是正确的?

💻 编程练习

请写出代码,在屏幕上依次显示你的名字、你的年龄、你最喜欢的颜色(使用3个print语句)。然后用一个print语句同时打印"我的爱好是"和你的爱好。
提示:文字用引号包起来,数字可以直接写。用逗号可以在一个print里打印多个内容。

🎯 本章目标

  • ✅ 理解变量的概念(存储数据的"盒子")
  • ✅ 掌握三种基本数据类型:int、float、str
  • ✅ 学会使用 type() 查看数据类型
  • ✅ 掌握类型转换:int()、float()、str()
  • ✅ 理解 TypeError 常见错误

什么是变量?

变量就像一个"盒子",你可以把数据放进去,并给这个盒子起个名字。之后只要使用这个名字,就能拿到里面的数据。

在 Python 中,创建变量非常简单,不需要声明类型,直接赋值即可:
name = "小明"      # 把字符串"小明"放进变量name
age = 12         # 把数字12放进变量age
pi = 3.14       # 把小数3.14放进变量pi
is_student = True  # 把True放进变量is_student(布尔值)

print(name)      # 输出:小明
print(age + 1)   # 输出:13
变量命名规则:
1. 只能包含字母、数字和下划线
2. 不能以数字开头
3. 区分大小写(Age 和 age 是两个不同的变量)
4. 不能用 Python 关键字(如 if、for、print)作为变量名
5. 最好起有意义的名字,比如 student_name 比 x 好

三种基本数据类型

1. 整数 (int):没有小数点的数字,如 0, -5, 100, 2024。整数可以非常大,Python 会自动处理。

2. 浮点数 (float):带小数点的数字,如 3.14, -0.5, 2.0。注意:0.1 + 0.2 在计算机里不等于 0.3,这是浮点数的精度问题。

3. 字符串 (str):文本内容,必须用引号包围,如 "Hello", '你好', "123"。单引号和双引号都可以,但要成对使用。
# 整数运算
a = 10
b = 3
print(a + b)   # 13 (加法)
print(a - b)   # 7  (减法)
print(a * b)   # 30 (乘法)
print(a / b)   # 3.333... (除法,结果是小数)
print(a // b)  # 3  (整除,只保留整数部分)
print(a % b)   # 1  (取余,10除以3余1)
print(a ** b)  # 1000 (幂运算,10的3次方)

字符串操作

字符串可以用单引号或双引号包围。两个字符串可以用 + 拼接,用 * 重复:
first = "Python"
second = "编程"
print(first + second)        # 输出:Python编程
print("哈" * 5)              # 输出:哈哈哈哈哈
print("我今年" + 12)         # ❌ 报错!字符串和数字不能直接相加
print("我今年" + str(12))  # ✅ 正确!用str()把数字转成字符串

# 字符串长度
word = "Python"
print(len(word))   # 6

类型查看与转换

type() 函数可以查看一个数据的类型。用 int()float()str() 可以在不同类型之间转换:
print(type(10))      # 
print(type(3.14))    # 
print(type("hello")) # 

# 类型转换
print(int("100"))     # 100 (字符串转整数)
print(float("3.5"))   # 3.5 (字符串转浮点数)
print(str(2024))    # "2024" (数字转字符串)

⚠️ 常见错误:TypeError

初学者最容易犯的错误之一是试图把字符串和数字直接相加:
age = input("你今年几岁了?")  # 输入: 12
print("明年你就" + age + 1 + "岁了")  # ❌ 报错!
💥 错误信息:
TypeError: can only concatenate str (not "int") to str

🔍 原因分析:
input() 返回的是字符串 "12",而 1 是数字。Python 不允许字符串和数字直接用 + 连接。

✅ 正确做法:
1. 先把字符串转成数字:int(age) + 1
2. 再把结果转回字符串:str(int(age) + 1)
3. 或者直接用 f-string:f"明年你就{int(age)+1}岁了"

📝 本章小结

  • 💡 变量 = 名字,用来存储数据
  • 💡 整数(int)、浮点数(float)、字符串(str)
  • 💡 字符串和数字不能直接相加,需要转换
  • 💡 type() 可以查看数据类型

📝 练习题(共5题)

1. 执行 x = 15 // 4,x 的值是多少?
2. 要把数字 100 和字符串 "分" 拼接,应该怎么做?
3. 以下哪个变量名是合法的?
4. 10 ** 3 的结果是?
5. type(3.14) 的输出是?

💻 编程练习

假设你语文考了92分,数学考了88分,英语考了95分。请创建变量存储这三科成绩,然后计算并输出总分和平均分。再用字符串拼接输出"我的总分是XX分,平均分是XX分"。
提示:总分 = 语文 + 数学 + 英语;平均分 = 总分 / 3。注意平均分可能是小数,拼接时要转成字符串!

🎯 本章目标

  • ✅ 掌握 input() 函数获取用户输入
  • ✅ 理解 input() 返回的是字符串
  • ✅ 学会使用 f-string 格式化输出
  • ✅ 掌握 int()、float() 转换输入数据

获取用户输入:input()

之前的程序都是程序自己输出内容,现在我们来学习如何让程序"听"用户说话。input() 函数可以让程序暂停,等待用户在键盘上输入内容,按回车后,输入的内容就会被获取到。
name = input("请输入你的名字:")
print("你好," + name + "!欢迎学习Python!")
运行后,屏幕会显示"请输入你的名字:",光标闪烁等待你输入。假设你输入"小明",程序就会输出"你好,小明!欢迎学习Python!"

重要:input() 返回的是字符串!

无论用户输入的是数字还是文字,input() 返回的永远是字符串。如果想做数学运算,需要先转换成数字:
age = input("你今年几岁了?")   # 假设输入 12
# age 现在是字符串 "12",不是数字 12

# 需要转换成整数
age = int(input("你今年几岁了?"))   # 现在 age 是数字 12
print("明年你就" + str(age + 1) + "岁了!")

类型转换函数

int():把内容转成整数(如 "12" → 12)
float():把内容转成浮点数(如 "3.5" → 3.5)
str():把内容转成字符串(如 100 → "100")

注意:int("abc") 会报错,因为 "abc" 不是数字!
# 做一个简单的加法计算器
num1 = int(input("请输入第一个数字:"))
num2 = int(input("请输入第二个数字:"))
print("两数之和是:", num1 + num2)

格式化字符串:f-string

Python 3.6+ 支持 f-string,让字符串拼接更方便。在字符串前加 f,然后用大括号 {} 包裹变量:
name = "小明"
age = 12
print(f"你好,{name}!你今年{age}岁。")
# 输出:你好,小明!你今年12岁。

# 甚至可以在大括号里计算
print(f"5 + 3 = {5+3}")  # 输出:5 + 3 = 8

📝 本章小结

  • 💡 input() 用于获取键盘输入
  • 💡 input() 返回的永远是字符串
  • 💡 f-string 是格式化输出的最佳方式
  • 💡 计算前记得把输入转成数字

📝 练习题(共5题)

1. 用户输入了 20,执行 x = input() 后,x 的类型是?
2. 要把用户输入的年龄加 5,正确的写法是?
3. f-string 的正确写法是?
4. int("3.5") 会?
5. 以下哪个可以把用户输入转成小数?

💻 编程练习

编写一个程序:询问用户长方形的长和宽(用input),然后计算并输出长方形的面积和周长。要求使用 f-string 格式化输出。
提示:面积 = 长 × 宽;周长 = (长 + 宽) × 2。记得把输入转成数字!输出格式示例:"面积是 20,周长是 18"

🎯 本章目标

  • ✅ 理解 Python 的缩进规则
  • ✅ 掌握 if、elif、else 的用法
  • ✅ 学会使用比较运算符:>、<、==、!=
  • ✅ 理解逻辑运算符:and、or、not
  • ✅ 能够编写简单的条件判断程序

📝 Python 的缩进规则

Python 使用缩进来表示代码块,而不是像其他语言那样用大括号 {}。这是 Python 最特别的地方,也是初学者最容易出错的地方。
# ✅ 正确的缩进
if age >= 18:
    print("你已成年")      # ← 缩进4个空格
    print("可以考驾照")    # ← 同一层级,同样缩进
else:
    print("你未成年")      # ← else 也要缩进
    print("还不能考驾照")  # ← 同一层级

# ❌ 错误的缩进 - 会报错!
if age >= 18:
print("你已成年")          # ← 没有缩进,IndentationError!
    print("可以考驾照")    # ← 缩进不一致
📌 缩进规则要点:
1. 冒号 : 是缩进的信号!if、else、for、while、def、class 后面都要有冒号
2. 4个空格 是标准缩进(不要用 Tab,也不要用2个空格)
3. 同一层级 的代码缩进必须完全一致
4. 缩进错误会报 IndentationError,程序无法运行

if 语句:让程序做选择

生活中充满了选择:如果下雨就带伞,如果考了100分就奖励自己。程序也需要做判断,if 语句就是用来让程序根据不同情况执行不同代码的。
score = 85

if score >= 60:
    print("恭喜你,及格了!")
else:
    print("别灰心,下次加油!")
特别注意:Python 用缩进(空格)来表示哪些代码属于 if! 上面的 print 前面有4个空格,表示它在 if 的"管辖范围"内。缩进是 Python 的灵魂,缩进错了程序就会报错。

比较运算符

== 等于(注意是两个等号!)
!= 不等于
> 大于 < 小于
>= 大于等于 <= 小于等于
if score == 100:
    print("满分!太厉害了!")
elif score >= 90:
    print("优秀!")
elif score >= 80:
    print("良好!")
elif score >= 60:
    print("及格!")
else:
    print("不及格,需要努力!")
elif 是 "else if" 的缩写,表示"否则如果"。程序会从上到下依次判断,满足哪个条件就执行对应的代码,然后跳出整个 if 结构。

逻辑运算符:and、or、not

有时候判断条件不止一个,需要组合多个条件:

and:两个条件都满足才为 True
or:两个条件满足一个就为 True
not:把 True 变 False,把 False 变 True
age = 15
has_ticket = True

if age >= 12 and has_ticket:
    print("可以入场!")
else:
    print("不能入场。")

# not 的用法
is_raining = False
if not is_raining:
    print("今天不下雨,可以出去玩!")

嵌套 if:if 里面还有 if

有时候判断需要分层进行,这时可以在 if 里面再写 if:
score = 85
attendance = 95

if score >= 60:
    print("成绩及格")
    if attendance >= 90:
        print("而且全勤,获得表扬!")
    else:
        print("但出勤率不够高。")
else:
    print("成绩不及格,需要补考。")

📝 本章小结

  • 💡 缩进是 Python 的灵魂,4个空格为标准
  • 💡 if/elif/else 用于条件判断
  • 💡 == 是比较,= 是赋值,不要混淆
  • 💡 and、or、not 用于组合多个条件

📝 练习题(共5题)

1. 判断"年龄大于等于18且小于60",正确的条件是?
2. 以下代码输出什么?x = 5;if x == 5: print("A");else: print("B")
3. 以下哪个是"不等于"的正确写法?
4. 如果 a = True, b = False,那么 a or b 的值是?
5. 以下代码中,score=75时会输出什么?
if score>=90: print("A")
elif score>=80: print("B")
elif score>=60: print("C")
else: print("D")

💻 编程练习

编写一个程序:输入一个年份,判断它是不是闰年。闰年规则:能被4整除但不能被100整除,或者能被400整除。用 f-string 输出结果。
提示:用 % 取余判断整除。例如 year % 4 == 0 表示能被4整除。用 and 和 or 组合条件。

🎯 本章目标

  • ✅ 掌握 for 循环遍历 range()
  • ✅ 理解 range() 的三种用法
  • ✅ 掌握 while 循环的条件控制
  • ✅ 学会使用 break 和 continue
  • ✅ 理解循环嵌套的概念

for 循环:重复做一件事

如果需要重复执行某段代码,不用写很多遍,用循环即可。for 循环可以遍历一个范围或列表:
# range(5) 会产生 0, 1, 2, 3, 4
for i in range(5):
    print(i)

# 输出:
# 0
# 1
# 2
# 3
# 4
i 是一个临时变量,每次循环它会依次取 range() 给出的值。循环体(缩进的代码)会重复执行,每次 i 的值都不同。

range() 的更多用法

range() 非常灵活,可以指定起始、结束和步长:
range(5)        # 0, 1, 2, 3, 4
range(1, 6)    # 1, 2, 3, 4, 5 (从1开始到6之前)
range(0, 10, 2) # 0, 2, 4, 6, 8 (步长为2)
range(10, 0, -1) # 10, 9, 8, ..., 1 (倒着数,步长-1)

🎯 range() 可视化演示

让我们用动态演示来理解 range() 是如何生成数字序列的:
点击"生成"查看结果...

while 循环:条件满足就一直执行

while 循环会在条件为 True 时不断执行,直到条件变为 False:
count = 1
while count <= 5:
    print("第" + str(count) + "次")
    count = count + 1   # 重要!要让条件最终变为False,否则会无限循环
⚠️ 注意:如果忘记写 count = count + 1,条件永远为 True,程序就会"死循环",一直运行下去!写 while 循环时一定要确保条件最终会变为 False。

break 和 continue

break:立刻跳出整个循环
continue:跳过当前这一轮,进入下一轮
# break 示例:找到第一个能被7整除的数
for i in range(1, 100):
    if i % 7 == 0:
        print("找到了:", i)
        break       # 找到就退出,不再继续找

# continue 示例:打印1-10中的奇数
for i in range(1, 11):
    if i % 2 == 0:
        continue    # 偶数跳过,不执行下面的print
    print(i)        # 只打印奇数

循环嵌套

循环里面还可以放循环,这就是嵌套循环
# 打印乘法表的一部分
for i in range(1, 4):
    for j in range(1, 4):
        print(f"{i}x{j}={i*j}", end="  ")
    print()  # 换行
# 输出:
# 1x1=1  1x2=2  1x3=3
# 2x1=2  2x2=4  2x3=6
# 3x1=3  3x2=6  3x3=9

📝 本章小结

  • 💡 for 用于已知次数的循环
  • 💡 while 用于条件控制的循环
  • 💡 range(start, stop, step) 灵活控制序列
  • 💡 break 跳出循环,continue 跳过本轮

📝 练习题(共5题)

1. for i in range(2, 8, 2) 会遍历哪些数字?
2. 以下哪个循环会输出 1 到 10?
3. break 的作用是?
4. 以下哪个是死循环?
5. range(5, 0, -1) 会生成?

💻 编程练习

用 for 循环编写程序,计算 1+2+3+...+100 的和,并输出结果。(答案应该是 5050)然后再用 while 循环实现一次。
提示:创建变量 total = 0,循环中每次把 i 加到 total 上。while 版本需要手动控制计数器。

🎯 本章目标

  • ✅ 理解列表(list)的基本操作
  • ✅ 掌握索引访问和切片
  • ✅ 学会列表的增删改查
  • ✅ 理解元组(tuple)的不可变性
  • ✅ 掌握列表推导式

列表:可以装很多东西的"书包"

列表 (list) 是 Python 中非常重要的数据结构,它可以同时存放多个数据,用方括号 [] 表示,里面的数据用逗号隔开:
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
scores = [85, 92, 78, 96, 88]
mixed = [1, "hello", 3.14, True]   # 列表里可以混放不同类型的数据
empty = []   # 空列表

索引:取出列表中的某个元素

列表中的每个元素都有一个"编号",叫做索引注意:Python 的索引从 0 开始!
fruits = ["苹果", "香蕉", "橙子", "葡萄"]

print(fruits[0])   # 苹果 (第一个元素)
print(fruits[1])   # 香蕉 (第二个元素)
print(fruits[-1])  # 葡萄 (最后一个元素,-1表示倒数第一)
print(fruits[-2])  # 橙子 (倒数第二个)

切片:取出列表的一部分

[开始:结束] 可以取出列表的一段。注意:结束位置的元素不包含在内!
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print(nums[2:5])   # [2, 3, 4] (索引2到4,5不包含)
print(nums[:4])    # [0, 1, 2, 3] (从头开始到索引3)
print(nums[6:])    # [6, 7, 8, 9] (从索引6到末尾)
print(nums[:])       # [0, 1, 2, ..., 9] (复制整个列表)

列表常用操作

fruits = ["苹果", "香蕉"]

# 添加元素
fruits.append("橙子")      # 在末尾添加:["苹果", "香蕉", "橙子"]
fruits.insert(1, "草莓")   # 在索引1位置插入:["苹果", "草莓", "香蕉", "橙子"]

# 删除元素
fruits.remove("香蕉")     # 删除"香蕉"(按值删除)
del fruits[0]             # 删除索引0的元素
popped = fruits.pop()       # 删除并返回最后一个元素

# 其他
len(fruits)                 # 获取列表长度(有几个元素)
fruits.sort()               # 排序(数字从小到大,字符串按字母)
fruits.reverse()            # 反转列表
"苹果" in fruits           # 判断"苹果"是否在列表中,返回True/False

遍历列表

用 for 循环可以逐个访问列表中的每个元素:
scores = [85, 92, 78, 96]

# 方法1:直接遍历元素
for score in scores:
    print(score)

# 方法2:用索引遍历
for i in range(len(scores)):
    print(f"第{i+1}个成绩:{scores[i]}")

# 方法3:用 enumerate 同时获取索引和值
for i, score in enumerate(scores):
    print(f"索引{i}对应的值是{score}")

元组:不可变的列表

元组 (tuple) 和列表很像,但用圆括号 () 表示,而且创建后不能修改(不能增删改元素)。元组通常用来存放不需要改变的数据,比如坐标、日期等。
point = (3, 4)       # 坐标点
date = (2024, 5, 22)  # 日期

print(point[0])   # 3
# point[0] = 5    # ❌ 报错!元组不能修改

📝 本章小结

  • 💡 列表用 [],可以存放多个数据
  • 💡 索引从 0 开始,负数表示倒数
  • 💡 append() 添加,remove() 删除
  • 💡 元组用 (),创建后不能修改

📝 练习题(共5题)

1. 列表 nums = [10, 20, 30, 40],nums[2] 的值是?
2. 要在列表末尾添加元素,应该用?
3. 列表 nums = [0,1,2,3,4,5],nums[2:5] 的结果是?
4. 以下哪个是元组的正确定义?
5. 以下代码输出什么?
for i, v in enumerate(["a","b","c"]):
print(i, v)

💻 编程练习

创建一个列表存储 5 个同学的数学成绩,然后计算并输出:最高分、最低分、平均分。再输出"及格人数"(成绩>=60分的人数)。
提示:max(列表) 取最大,min(列表) 取最小,sum(列表) 求和。用 for 循环遍历列表统计及格人数。

🎯 本章目标

  • ✅ 理解字典(dict)的键值对结构
  • ✅ 掌握字典的增删改查操作
  • ✅ 学会遍历字典的键、值、键值对
  • ✅ 了解集合(set)的去重功能

什么是函数?

函数是一段可以重复使用的代码块。你已经用过很多内置函数了,比如 print()、input()、len()。现在我们来学习如何自己创建函数

使用函数的好处:代码复用(写一次用多次)、代码组织更清晰、方便调试和修改。
def say_hello():
    print("你好!")
    print("欢迎来到Python世界!")

# 调用函数
say_hello()
say_hello()   # 可以反复使用!
def 是 "define"(定义)的缩写,用来创建函数。函数名后面要跟括号 () 和冒号 :,函数体内的代码要缩进。

带参数的函数

函数可以接收"参数",让函数更灵活。参数就像函数的"入口",调用时传入不同的值,函数就能做不同的事情:
def greet(name):
    print("你好," + name + "!")

greet("小明")    # 输出:你好,小明!
greet("小红")    # 输出:你好,小红!

# 多个参数
def add(a, b):
    result = a + b
    print(f"{a} + {b} = {result}")

add(3, 5)     # 输出:3 + 5 = 8
add(10, 20)   # 输出:10 + 20 = 30

返回值:return

函数可以用 return 把计算结果"送回来"。调用函数的地方可以用变量接收这个返回值:
def multiply(a, b):
    return a * b

result = multiply(4, 7)
print(result)   # 输出:28

# 更实用的例子:计算圆面积
def circle_area(radius):
    return 3.14 * radius * radius

area = circle_area(5)
print(f"半径为5的圆面积是 {area}")   # 78.5

默认参数值

可以给参数设置默认值,调用时如果不传这个参数,就用默认值:
def greet(name, greeting="你好"):
    print(f"{greeting},{name}!")

greet("小明")              # 你好,小明!
greet("小红", "早上好")   # 早上好,小红!

变量的作用域

函数内部创建的变量,只在函数内部有效,函数外面访问不到。这叫做局部变量。函数外面的变量,函数里面可以读取(但不能修改,除非用 global):
total = 100   # 全局变量

def show_total():
    print(total)   # 可以读取全局变量

def add_score(score):
    global total   # 声明要修改全局变量
    total = total + score

add_score(10)
print(total)   # 110

📝 本章小结

  • 💡 字典用 {},存储键值对
  • 💡 通过 key 访问 value:dict[key]
  • 💡 keys()、values()、items() 用于遍历
  • 💡 集合自动去重,适合判断成员关系

📝 练习题(共5题)

1. 定义函数的关键字是?
2. 函数中用哪个关键字返回结果?
3. 以下函数调用结果是什么?
def add(a, b=10):
return a + b
print(add(5))
4. 函数内部创建的变量,函数外部能访问吗?
5. 以下哪个说法是正确的?

💻 编程练习

编写一个函数 is_even(n),判断一个数字是否为偶数,是偶数返回 True,否则返回 False。然后编写另一个函数 calculate_area(length, width=10),计算长方形面积,width 默认值为10。调用这两个函数测试。
提示:偶数是能被2整除的数,即 n % 2 == 0。默认参数在定义时写在普通参数后面。

🎯 本章目标

  • ✅ 综合运用所学知识
  • ✅ 学会分析和拆解问题
  • ✅ 培养编程思维
  • ✅ 完成多个实战项目

项目一:猜数字游戏

综合运用 input、if、while、random 等知识,做一个猜数字小游戏。电脑随机生成一个 1-100 的数字,玩家不断猜测,电脑提示"太大"或"太小",直到猜对。
import random

secret = random.randint(1, 100)   # 随机生成1-100的数字
print("猜数字游戏!我想了一个1-100之间的数字。")

while True:
    guess = int(input("请输入你的猜测:"))

    if guess == secret:
        print("🎉 恭喜你,猜对了!")
        break
    elif guess < secret:
        print("太小了,再大一点!")
    else:
        print("太大了,再小一点!")
升级思路:可以加入猜测次数限制(比如最多猜7次),加入计分系统(猜得越快分数越高),或者让玩家选择难度(1-50简单,1-100普通,1-200困难)。

项目二:简易计算器

def calculator():
    print("===== 简易计算器 =====")
    a = float(input("请输入第一个数字:"))
    op = input("请输入运算符(+ - * /):")
    b = float(input("请输入第二个数字:"))

    if op == "+":
        print("结果:", a + b)
    elif op == "-":
        print("结果:", a - b)
    elif op == "*":
        print("结果:", a * b)
    elif op == "/":
        if b == 0:
            print("错误:不能除以0!")
        else:
            print("结果:", a / b)
    else:
        print("未知的运算符")

calculator()
升级思路:加入循环让用户可以连续计算,加入历史记录功能,或者支持更复杂的运算(幂运算、取余等)。

项目四:成绩管理系统(分步实现)

这个项目比前面的复杂,我们把它拆成4个小步骤,一步一步完成:
步骤1:创建空列表存储成绩
# 创建一个空列表,用来存储所有成绩
scores = []
print("成绩管理系统启动!")
步骤2:实现"添加成绩"功能
# 获取用户输入并添加到列表
score = int(input("请输入成绩:"))
scores.append(score)
print("添加成功!当前成绩:", scores)
步骤3:实现"查看统计"功能
# 计算最高分、最低分、平均分
if len(scores) > 0:
    print("最高分:", max(scores))
    print("最低分:", min(scores))
    print("平均分:", sum(scores) / len(scores))
    
    # 统计及格人数(成绩>=60)
    pass_count = 0
    for s in scores:
        if s >= 60:
            pass_count += 1
    print(f"及格人数:{pass_count}/{len(scores)}")
else:
    print("还没有成绩!")
步骤4:用循环和菜单整合所有功能
scores = []

while True:
    print("
===== 成绩管理系统 =====")
    print("1. 添加成绩")
    print("2. 查看所有成绩")
    print("3. 查看统计信息")
    print("4. 退出")
    
    choice = input("请选择操作(1-4):")
    
    if choice == "1":
        score = int(input("请输入成绩:"))
        scores.append(score)
        print("✅ 添加成功!")
    elif choice == "2":
        print("所有成绩:", scores)
    elif choice == "3":
        # 这里放步骤3的统计代码
        pass
    elif choice == "4":
        print("再见!")
        break
    else:
        print("❌ 无效选择,请重新输入")
💡 学习建议:
不要一次性写完整代码!先实现步骤1,测试通过后再加步骤2。每完成一步就运行测试,这样出错时更容易找到问题。

项目三:石头剪刀布

import random

def get_winner(player, computer):
    if player == computer:
        return "平局"
    if (player == "石头" and computer == "剪刀") or \
       (player == "剪刀" and computer == "布") or \
       (player == "布" and computer == "石头"):
        return "你赢了"
    return "电脑赢了"

while True:
    player = input("请出拳(石头/剪刀/布),或输入退出:")
    if player == "退出":
        break
    computer = random.choice(["石头", "剪刀", "布"])
    print(f"你出了{player},电脑出了{computer}")
    print(get_winner(player, computer))

📝 本章小结

  • 💡 函数 = 可重复使用的代码块
  • 💡 def 函数名(参数): 定义函数
  • 💡 return 用于返回结果
  • 💡 参数可以有默认值

📝 练习题(共5题)

1. random.randint(1, 10) 可能生成以下哪个数字?
2. 猜数字游戏中,while True 配合 break 的作用是?
3. random.choice(["石头","剪刀","布"]) 返回的是?
4. 成绩管理系统中,scores.append(score) 的作用是?
5. 计算器程序中为什么要判断 b == 0?

📝 本章小结

  • 💡 猜数字游戏:random + 循环 + 条件
  • 💡 计算器:函数 + 条件判断
  • 💡 成绩管理:列表 + 循环 + 统计
  • 💡 编程需要多练习,熟能生巧

💻 终极挑战

用你学到的所有知识,给"猜数字游戏"增加以下功能:
1. 限制最多猜7次
2. 每次提示"还剩X次机会"
3. 猜对后显示"你用了X次猜中"
4. 加入一个"再玩一次"的选项
提示:用计数器变量记录猜测次数,每次循环+1。用 input 询问是否再玩一次,根据回答决定是否重新开始。

🚀 Python高级课程

掌握专业级技能,成为真正的Python开发者

🎯 本章目标

  • ✅ 理解网络编程基础概念
  • ✅ 掌握Socket编程
  • ✅ 学会使用Flask构建Web应用
  • ✅ 理解RESTful API设计原则

🌐 网络编程基础

网络编程是让不同计算机之间进行通信的技术。Python提供了强大的socket模块来实现网络通信。
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('www.example.com', 80))
client.send(b'GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n')
response = client.recv(4096)
print(response.decode())
client.close()

🔥 Flask Web框架入门

Flask是一个轻量级的Web框架,非常适合初学者学习Web开发。
from flask import Flask, jsonify, request
app = Flask(__name__)

@app.route('/')
def home():
    return 'Hello, World!'

@app.route('/api/users', methods=['GET', 'POST'])
def users():
    if request.method == 'POST':
        data = request.get_json()
        return jsonify({'message': 'User created', 'data': data}), 201
    return jsonify({'users': ['Alice', 'Bob']})

if __name__ == '__main__':
    app.run(debug=True, port=5000)

📝 本章小结

  • 💡 Socket是网络通信的基础
  • 💡 Flask让Web开发变得简单
  • 💡 RESTful API是现代Web服务的标准

📝 练习题(共5题)

1. Flask中用于定义路由的装饰器是?
2. socket.SOCK_STREAM 表示什么类型的Socket?
3. RESTful API中,创建资源通常使用哪个HTTP方法?
4. Flask中获取JSON请求数据的方法是?
5. HTTP默认端口是?

🎯 本章目标

  • ✅ 理解同步与异步的区别
  • ✅ 掌握async/await语法
  • ✅ 学会使用asyncio库
  • ✅ 理解协程和事件循环

⚡ 异步编程基础

异步编程允许程序在等待I/O操作时执行其他任务,大大提高程序的并发性能。
import asyncio

async def say_hello():
    print('Hello')
    await asyncio.sleep(1)
    print('World')

asyncio.run(say_hello())

async def main():
    tasks = [
        asyncio.create_task(say_hello()),
        asyncio.create_task(say_hello()),
    ]
    await asyncio.gather(*tasks)

asyncio.run(main())

📝 本章小结

  • 💡 async def 定义异步函数
  • 💡 await 等待异步操作完成
  • 💡 asyncio.gather() 并发执行多个任务

📝 练习题(共5题)

1. 定义异步函数使用的关键字是?
2. asyncio.run() 的作用是?
3. await 关键字的作用是?
4. asyncio.gather() 的作用是?
5. 协程相比线程的优势是?

🎯 本章目标

  • ✅ 掌握NumPy数组操作
  • ✅ 学会使用Pandas处理数据
  • ✅ 能够用Matplotlib绑制图表
  • ✅ 理解数据清洗流程

📊 NumPy数组操作

import numpy as np
arr = np.array([1, 2, 3, 4, 5])
print(arr * 2)  # [2 4 6 8 10]
matrix = np.array([[1, 2, 3], [4, 5, 6]])
print(matrix.shape)  # (2, 3)
print(np.mean(arr))   # 平均值
print(np.std(arr))    # 标准差

🐼 Pandas数据处理

import pandas as pd
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie'],
    'age': [25, 30, 35],
    'city': ['北京', '上海', '广州']
})
print(df[df['age'] > 25])
print(df.describe())
print(df.groupby('city')['age'].mean())

📝 本章小结

  • 💡 NumPy适合数值计算
  • 💡 Pandas适合表格数据处理
  • 💡 Matplotlib用于数据可视化

📝 练习题(共5题)

1. NumPy中创建全零数组的函数是?
2. Pandas中用于读取CSV文件的函数是?
3. DataFrame的shape属性返回的是?
4. Matplotlib中绑制折线图的函数是?
5. Pandas中删除缺失值的方法是?

🎯 本章目标

  • ✅ 理解机器学习基本概念
  • ✅ 学会使用Scikit-learn
  • ✅ 掌握常见分类和回归算法
  • ✅ 理解模型评估方法

🤖 机器学习基础

机器学习是让计算机从数据中学习规律,而不是显式编程。
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

X = [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]]
y = [0, 0, 1, 1, 1]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

model = LogisticRegression()
model.fit(X_train, y_train)

predictions = model.predict(X_test)
print(f'准确率: {accuracy_score(y_test, predictions)}')

📝 本章小结

  • 💡 监督学习需要标签数据
  • 💡 训练集用于学习,测试集用于评估
  • 💡 特征工程是关键步骤

📝 练习题(共5题)

1. 监督学习与无监督学习的区别是?
2. Scikit-learn中训练模型的方法是?
3. 分类问题常用的评估指标是?
4. 特征工程的目的是?
5. train_test_split的作用是?

🎯 本章目标

  • ✅ 掌握SQL基础语法
  • ✅ 学会使用SQLite
  • ✅ 理解ORM概念
  • ✅ 掌握SQLAlchemy

🗄️ SQLite基础

import sqlite3

conn = sqlite3.connect('example.db')
cursor = conn.cursor()

cursor.execute('''CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    age INTEGER
)''')

cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Alice', 25))
conn.commit()

cursor.execute('SELECT * FROM users')
print(cursor.fetchall())

conn.close()

📝 本章小结

  • 💡 SQL是数据库操作的标准语言
  • 💡 ORM让数据库操作更Pythonic
  • 💡 注意SQL注入防护

📝 练习题(共5题)

1. SQL中查询数据使用的关键字是?
2. ORM的全称是?
3. 防止SQL注入的最佳实践是?
4. SQLite数据库文件的扩展名通常是?
5. SQL中删除数据使用的关键字是?

🎯 本章目标

  • ✅ 学会使用pytest进行单元测试
  • ✅ 掌握异常处理最佳实践
  • ✅ 理解日志记录的重要性
  • ✅ 了解性能优化技巧

🧪 pytest单元测试

import pytest

def add(a, b):
    return a + b

def test_add():
    assert add(1, 2) == 3
    assert add(-1, 1) == 0
    assert add(0, 0) == 0

def test_add_type_error():
    with pytest.raises(TypeError):
        add("1", 2)

# 运行: pytest test_example.py -v

📝 日志记录

import logging

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    filename='app.log'
)

logger = logging.getLogger(__name__)

logger.debug('调试信息')
logger.info('普通信息')
logger.warning('警告信息')
logger.error('错误信息')
logger.critical('严重错误')

📝 本章小结

  • 💡 测试是保证代码质量的关键
  • 💡 日志帮助排查问题
  • 💡 异常处理让程序更健壮

📝 练习题(共5题)

1. pytest中用于断言的关键字是?
2. 日志级别从低到高的正确顺序是?
3. try-except-finally中,finally块的作用是?
4. pytest测试文件的命名规范是?
5. 性能分析常用的Python模块是?

📖 Python 常用单词学习

掌握这些单词,看懂代码更容易!每个单词都带音标、日常意思和编程意思

🎯 学习建议

Python 代码中大量使用英语单词,提前熟悉这些词汇能让你读代码时更顺畅。建议每天记5-10个,结合代码示例理解记忆。

单词日常意思编程意思代码示例
print/prɪnt/ 印刷;打印 把内容输出到屏幕 print("Hello")
input/ˈɪnpʊt/ 输入;投入 获取用户键盘输入 name = input("名字?")
output/ˈaʊtpʊt/ 输出;产量 程序输出的结果 # print() 产生 output
display/dɪˈspleɪ/ 展示;陈列 在屏幕上显示内容 # 同义词:show, print
单词日常意思编程意思代码示例
int/ɪnt/ integer 缩写 整数类型 age = int("12")
float/floʊt/ 漂浮;浮动 浮点数(带小数) pi = float("3.14")
string/strɪŋ/ 细绳;一串 字符串(文本) name = str(100)
bool / boolean/buːl/ 布尔(人名) 布尔值:True/False is_ok = True
type/taɪp/ 类型;种类 查看数据的类型 type(123) # <class 'int'>
list/lɪst/ 清单;列表 列表数据类型 fruits = ["苹果","香蕉"]
tuple/ˈtjuːpəl/ 元组(数学概念) 不可变的列表 point = (3, 4)
单词日常意思编程意思代码示例
if/ɪf/ 如果;是否 条件判断:如果...就... if age >= 18:
else/els/ 否则;其他 条件不成立时执行 else: print("未成年")
elif/ˈelɪf/ else if 缩写 否则如果(多条件) elif score >= 80:
for/fɔːr/ 为了;对于 遍历循环 for i in range(5):
while/waɪl/ 当...时候 条件循环 while count < 10:
break/breɪk/ 打破;中断 跳出循环 if found: break
continue/kənˈtɪnjuː/ 继续 跳过本轮,继续下一轮 if i%2==0: continue
return/rɪˈtɜːrn/ 返回;归还 函数返回值 return a + b
pass/pæs/ 通过;经过 占位符,什么都不做 if True: pass
单词日常意思编程意思代码示例
def/def/ define 缩写 定义函数 def hello():
function/ˈfʌŋkʃən/ 功能;函数 一段可复用的代码 # def 定义 function
import/ɪmˈpɔːrt/ 进口;引入 导入外部模块/库 import random
module/ˈmɒdjuːl/ 模块;组件 包含函数和变量的文件 # random 是一个 module
class/klæs/ 班级;种类 类(面向对象) class Dog:
method/ˈmeθəd/ 方法;办法 类中的函数 list.append() 是 method
parameter/pəˈræmɪtər/ 参数;系数 函数定义时的输入 def add(a, b): # a,b 是参数
argument/ˈɑːrɡjəmənt/ 争论;论据 函数调用时传入的值 add(3, 5) # 3,5 是实参
单词日常意思编程意思代码示例
and/ænd/ 和;并且 逻辑与:两个都为真才真 if age>18 and score>60:
or/ɔːr/ 或者;否则 逻辑或:有一个为真就真 if a>0 or b>0:
not/nɒt/ 不;没有 逻辑非:取反 if not is_raining:
in/ɪn/ 在...里面 判断元素是否在列表中 if "苹果" in fruits:
is/ɪz/ 是(be动词) 判断两个对象是否同一对象 if a is None:
True/truː/ 真实的 布尔真值 is_student = True
False/fɔːls/ 虚假的 布尔假值 is_raining = False
None/nʌn/ 没有;无 空值,表示什么都没有 result = None
单词日常意思编程意思代码示例
append/əˈpend/ 附加;添加 在列表末尾添加元素 fruits.append("橙子")
insert/ɪnˈsɜːrt/ 插入;放入 在指定位置插入元素 fruits.insert(1, "草莓")
remove/rɪˈmuːv/ 移除;去掉 删除指定值的元素 fruits.remove("香蕉")
len/len/ length 缩写 获取长度(元素个数) len(fruits) # 4
range/reɪndʒ/ 范围;幅度 生成数字序列 range(1, 10)
enumerate/ɪˈnjuːməreɪt/ 枚举;列举 同时获取索引和值 for i,v in enumerate(list):
sort/sɔːrt/ 分类;排序 对列表排序 scores.sort()
reverse/rɪˈvɜːrs/ 反转;颠倒 反转列表顺序 fruits.reverse()
单词日常意思编程意思代码示例
random/ˈrændəm/ 随机的;任意的 随机数模块 import random
global/ˈɡloʊbəl/ 全球的;全局的 声明全局变量 global count
error/ˈerər/ 错误;差错 程序运行出错 # SyntaxError 语法错误
exception/ɪkˈsepʃən/ 例外;异常 程序异常(可捕获的错误) try: ... except: ...
try/traɪ/ 尝试;努力 尝试执行可能出错的代码 try: risky_code()
except/ɪkˈsept/ 除了;除外 捕获异常后的处理 except: print("出错了")
finally/ˈfaɪnəli/ 最后;终于 无论是否异常都执行 finally: close_file()
raise/reɪz/ 举起;提高 主动抛出异常 raise ValueError("错误")

🚀 Python 星际编程

一套系统化、科学化的 Python 学习体系,专为零基础学习者打造

24
课程章节
90+
实战练习
20
面试解析
3
月学习周期

📚 学习路线图

📗

初级课程

8章内容 · 入门阶段

  • Python 初探与环境搭建
  • 变量与数据类型
  • 条件与循环控制
  • 列表与元组
  • 函数基础
  • 综合项目实战
6-8周
📙

中级课程

10章内容 · 进阶阶段

  • 面向对象编程
  • 继承与多态
  • 文件操作与持久化
  • 装饰器与高阶函数
  • 正则表达式
  • 模块与包管理
  • 综合项目实战
10-12周
📕

高级课程

6章内容 · 专业阶段

  • 网络编程与Web开发
  • 异步编程与并发
  • 数据分析与可视化
  • 机器学习入门
  • 数据库与SQL
  • 测试与安全编程
持续学习

✨ 课程特色

🎯

目标清晰

每章都有明确的学习目标和成果,从基础到高级循序渐进

💻

实战驱动

丰富的代码示例和项目练习,边学边练,快速上手

📝

习题巩固

每章配套练习题,检验学习效果,巩固知识点

🔍

面试解析

20道经典面试题解析,深入理解 Python 核心概念

📖

词汇速记

核心编程词汇表,配合场景记忆,告别死记硬背

🌍

全球标准

采用 Python 3.x 最新版本,符合行业规范和最佳实践

👨‍🎓

零基础友好

不需要任何编程基础,只要会基本电脑操作就能学习

🚀

前景广阔

Python 是 AI 时代首选语言,为未来发展奠定坚实基础

👥 适合人群

🎓

在校学生

提前掌握编程技能,为未来就业加分,培养计算思维

💼

职场人士

提升工作效率,实现办公自动化,开拓职业发展道路

🔄

转行者

从零开始学习编程,进入技术领域,实现职业转型

🎨

爱好者

对编程感兴趣,想要探索科技世界,实现自己的创意

🌈 为什么选择 Python?

01

简洁易学

语法清晰简洁,读起来像英语,非常适合初学者入门

02

应用广泛

从网站开发到人工智能,从数据分析到自动化办公,Python 无所不能

03

社区活跃

全球最大的编程社区之一,丰富的资源和库,遇到问题容易解决

04

企业青睐

Google、Instagram、Netflix、Dropbox 等科技巨头都在使用

05

AI 首选

人工智能和机器学习领域的首选语言,未来发展潜力巨大

06

高薪职业

Python 开发者在全球范围内都享有较高的薪资水平

准备好开始你的编程之旅了吗?

每天 30 分钟到 1 小时,3 个月后你就能独立开发实用程序

⚡ Python 中级进阶课程

完成初级课程后,继续深入学习 Python 高级特性与实用技能

📚 什么是面向对象编程?

面向对象编程(OOP)是一种程序设计思想,它将程序看作是由一个个对象组成的,每个对象都有自己的属性(数据)和方法(行为)。

🏗️ 类 vs 对象:图纸与房子

理解类和对象的关系,最好的比喻就是建筑图纸实际房子
📋 类 (Class) = 建筑图纸
  • 定义了房子的结构
  • 规定有几个房间、门朝哪
  • 图纸本身不能住人
  • 一份图纸可以建多栋房子
🏠 对象 (Object) = 实际房子
  • 根据图纸建造的实际房子
  • 可以住人、可以放家具
  • 每栋房子都是独立的
  • 装修一栋不影响其他栋
# 类 = 图纸
class House:
    def __init__(self, color):
        self.color = color  # 每栋房子可以有不同的颜色
    
    def paint(self, new_color):
        self.color = new_color

# 对象 = 根据图纸建的房子
house1 = House("红色")   # 建第一栋红色房子
house2 = House("蓝色")   # 建第二栋蓝色房子

house1.paint("黄色")     # 只改变house1的颜色
print(house1.color)      # 黄色
print(house2.color)      # 还是蓝色(不受影响)

🔰 类的定义与对象创建

# 定义一个学生类
class Student:
    # 类属性 - 所有学生共享
    school_name = "星际编程学校"
    
    # 构造函数 - 创建对象时自动调用
    def __init__(self, name, age):
        self.name = name      # 实例属性
        self.age = age        # 实例属性
        self.grades = []     # 初始化学籍列表
    
    # 实例方法
    def add_grade(self, grade):
        self.grades.append(grade)
    
    def get_average(self):
        if len(self.grades) == 0:
            return 0
        return sum(self.grades) / len(self.grades)
    
    # 字符串表示方法
    def __str__(self):
        return f"学生: {self.name}, 年龄: {self.age}"

# 创建对象(实例化)
student1 = Student("小明", 12)
student2 = Student("小红", 13)

# 调用对象的方法
student1.add_grade(95)
student1.add_grade(88)
student1.add_grade(92)

print(student1)              # 输出: 学生: 小明, 年龄: 12
print(student1.get_average()) # 输出: 91.66666666666667
print(Student.school_name)    # 输出: 星际编程学校

📝 课后小测验

1. 下面哪个是构造函数?
2. 类属性和实例属性的区别是什么?
3. 以下哪个方法用于定义对象的字符串表示?
4. self关键字代表什么?
5. 如何创建类的实例?

🎭 什么是继承?

继承允许我们创建一个类(子类),它继承另一个类(父类)的属性和方法。这就像生物学的遗传,子类自动获得父类的特征,同时还能添加自己特有的内容。

# 父类:动物
class Animal:
    def __init__(self, name):
        self.name = name
    
    def speak(self):
        pass

# 子类:狗 - 继承自动物类
class Dog(Animal):
    def __init__(self, name, breed):
        # 调用父类的构造函数
        super().__init__(name)
        self.breed = breed
    
    # 重写父类的方法
    def speak(self):
        return f"{self.name} 说: 汪汪!"

# 子类:猫
class Cat(Animal):
    def speak(self):
        return f"{self.name} 说: 喵喵!"

# 创建对象
dog = Dog("旺财", "金毛")
cat = Cat("咪咪")

print(dog.speak()) # 输出: 旺财 说: 汪汪!
print(cat.speak()) # 输出: 咪咪 说: 喵喵!

# 多态:不同对象调用相同方法产生不同结果
def animal_speak(animal):
    print(animal.speak())

animal_speak(dog) # 输出: 旺财 说: 汪汪!
animal_speak(cat) # 输出: 咪咪 说: 喵喵!

💻 编程练习

创建一个Person父类,包含姓名和年龄属性,以及一个introduce()方法。然后创建Student子类,添加学校和年级属性,重写introduce()方法显示所有信息。

💡 提示:使用super()调用父类构造函数,记得在子类中添加self.school和self.grade属性

📝 课后小测验

1. 如何在子类中调用父类的构造函数?
2. 什么是方法重写?
3. 多态的特点是什么?
4. Python支持多重继承吗?
5. 子类会继承父类的哪些内容?

📁 文件读写基础

# 写入文件
with open("data.txt", "w", encoding="utf-8") as f:
    f.write("Hello, Python!\n")
    f.write("第二行内容\n")

# 读取文件
with open("data.txt", "r", encoding="utf-8") as f:
    content = f.read()
    print(content)

# 逐行读取
with open("data.txt", "r", encoding="utf-8") as f:
    for line in f:
        print(line.strip())

# JSON文件操作
import json

# 写入JSON
data = {
    "name": "小明",
    "age": 12,
    "grades": [95, 88, 92]
}

with open("student.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

# 读取JSON
with open("student.json", "r", encoding="utf-8") as f:
    loaded_data = json.load(f)
    print(loaded_data["name"])  # 输出: 小明

⚖️ 为什么要用 with?对比演示

你可能好奇:为什么一定要用 with?不用可以吗?让我们看看两种写法的对比:

❌ 不用 with(麻烦且容易出错)
f = open("data.txt", "r")
try:
    content = f.read()
    print(content)
finally:
    f.close()  # 必须手动关闭!
✅ 用 with(简洁安全)
with open("data.txt", "r") as f:
    content = f.read()
    print(content)
# 自动关闭,无需操心!
🔍 如果不关闭文件会怎样?
1. 资源泄漏:操作系统同时打开的文件数量有限,太多不关闭会导致无法打开新文件
2. 数据丢失:写入的内容可能还在内存缓冲区,没真正写入磁盘
3. 其他程序无法访问:文件被占用,别的程序打不开

with 语句的魔法:它会自动处理 try/finally,即使程序出错也会保证文件被关闭!

💻 编程练习

创建一个通讯录程序,能够添加联系人(姓名、电话)并保存到JSON文件中,下次运行时能加载已有联系人。

💡 提示:使用json.dump()保存,使用json.load()读取,记得处理文件不存在的情况

✨ 装饰器是什么?

装饰器是一种设计模式,它允许我们在不修改原函数代码的情况下,给函数添加额外的功能。想象成给手机"套壳"——手机本身不变,但增加了保护功能。

🔐 实战案例:权限检查装饰器
from functools import wraps

# 模拟已登录用户
logged_in_user = "小明"

# 定义权限检查装饰器
def check_login(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print(f"🔍 正在验证身份...")
        if logged_in_user:
            print(f"✅ 用户 '{logged_in_user}' 已通过验证")
            return func(*args, **kwargs)
        else:
            print("❌ 请先登录!")
            return None
    return wrapper

# 使用装饰器保护敏感功能
@check_login
def view_profile():
    """查看个人资料"""
    return f"用户名: {logged_in_user}, 等级: VIP5"

@check_login
def transfer_money(amount):
    """转账功能"""
    return f"成功转账 {amount} 元"

# 测试
print(view_profile())
print(transfer_money(100))
💡 代码解析:
1. @check_login 就像在门口放了一个保安
2. 每次调用被装饰的函数,都会先执行验证逻辑
3. 验证通过才执行原函数,否则返回错误提示
4. 这样写的好处:权限逻辑只写一次,可以复用到任意函数!
⏱️ 进阶案例:计时器装饰器
import time
from functools import wraps

def timer(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"⏱️ {func.__name__} 执行用时: {end - start:.4f}秒")
        return result
    return wrapper

@timer
def slow_function():
    time.sleep(1)  # 模拟耗时操作
    return "Done"

slow_function()  # 输出: slow_function 执行用时: 1.00xx秒

📝 课后小测验

1. 装饰器的@wraps有什么用?

⚡ 什么是生成器?

生成器是一种特殊的迭代器,它使用yield关键字来产生值,而不是一次性返回所有值。这使得生成器非常内存友好,特别是处理大量数据时。

# 普通函数 vs 生成器函数
def get_numbers_normal(n):
    result = []
    for i in range(n):
        result.append(i * 2)
    return result

def get_numbers_generator(n):
    for i in range(n):
        yield i * 2  # yield 暂停函数并返回值

# 使用生成器
gen = get_numbers_generator(5)
print(next(gen))  # 输出: 0
print(next(gen))  # 输出: 2
print(next(gen))  # 输出: 4

# 生成器表达式(类似列表推导式)
square_gen = (x**2 for x in range(5))
print(list(square_gen))  # [0, 1, 4, 9, 16]

# 无限序列生成器
def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

fib = fibonacci()
for i in range(10):
    print(next(fib), end=" ")  # 0 1 1 2 3 5 8 13 21 34

💾 内存对比:列表 vs 生成器

生成器最大的优势是节省内存。让我们看看处理100万个数字时,列表和生成器的区别:
📦 列表 (List)
# 一次性生成100万个数字
numbers = list(range(1000000))
# 内存占用: ~38MB
# 所有数字同时存在内存中
⚡ 生成器 (Generator)
# 惰性生成,用一次取一次
numbers = range(1000000)
# 内存占用: ~48字节!
# 只记录"当前位置"
🔍 原理解析:
列表就像把100万个鸡蛋全部放在篮子里,需要一个大篮子(内存)。

生成器就像养鸡场,你要一个蛋它就下一个,篮子里永远只有一个蛋。它只记住"现在下到第几个蛋了",所以无论要多少蛋,内存占用都一样小。

range() 的秘密:在 Python 3 中,range() 返回的就是生成器!所以 range(1000000) 几乎不占用内存,而 list(range(1000000)) 才会占用大量内存。

💻 编程练习

创建一个质数生成器,使用yield关键字依次产生质数。质数是只能被1和它本身整除的数(大于1)。

💡 提示:从2开始检查每个数,用已找到的质数去除,如果都不能整除就是质数

🎯 Lambda匿名函数

Lambda函数是匿名函数,通常用于简短的一次性使用的函数。它们可以让代码更简洁。

from functools import reduce

# Lambda函数基本语法
square = lambda x: x ** 2
print(square(5))  # 输出: 25

add = lambda x, y: x + y
print(add(3, 4))  # 输出: 7

# map() - 对每个元素应用函数
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared)  # [1, 4, 9, 16, 25]

# filter() - 过滤元素
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens)  # [2, 4]

# reduce() - 累积计算
total = reduce(lambda x, y: x + y, numbers)
print(total)  # 15

# sorted() 结合 lambda
students = [
    {"name": "小明", "age": 12},
    {"name": "小红", "age": 10},
    {"name": "小华", "age": 11}
]
sorted_students = sorted(students, key=lambda x: x["age"])
print(sorted_students)  # 按年龄排序

📝 课后小测验

1. 下面哪个是正确的lambda函数?

🔍 正则表达式基础

正则表达式是一种强大的模式匹配工具,可以用来搜索、验证和提取文本中的特定内容。

import re

# 常用正则表达式元字符
# \d  - 匹配任意数字
# \w  - 匹配任意字母、数字、下划线
# \s  - 匹配任意空白字符
# .   - 匹配任意字符(除换行符)
# *   - 匹配0次或多次
# +   - 匹配1次或多次
# ?   - 匹配0次或1次
# {n} - 匹配n次
# {n,m} - 匹配n到m次

# re.search() - 搜索第一个匹配
text = "我的邮箱是 test@example.com,欢迎联系我!"
match = re.search(r'[\w.-]+@[\w.-]+\.\w+', text)
if match:
    print(match.group())  # test@example.com

# re.findall() - 查找所有匹配
phones = "电话:138-1234-5678 或 010-8888-9999"
phone_nums = re.findall(r'\d{3}-\d{4}-\d{4}', phones)
print(phone_nums)  # ['138-1234-5678', '010-8888-9999']

# re.match() - 从字符串开头匹配
if re.match(r'\d{3}-\d{4}-\d{4}', "138-1234-5678"):
    print("电话号码格式正确")

# re.sub() - 替换匹配内容
new_text = re.sub(r'\d{3}-\d{4}-\d{4}', "[隐藏号码]", phones)
print(new_text)  # 电话:[隐藏号码] 或 [隐藏号码]

# 捕获组
text = "2023-12-25"
# 匹配日期并提取年、月、日
match = re.match(r'(\d{4})-(\d{2})-(\d{2})', text)
if match:
    year, month, day = match.groups()
    print(f"年: {year}, 月: {month}, 日: {day}")

💻 编程练习

编写正则表达式,验证用户输入的手机号是否为中国移动手机号格式(以13、15、18、19开头,共11位数字)。

💡 提示:使用re.match(),正则模式应该匹配11位数字

📦 模块的导入与使用

# 创建自己的模块 mymodule.py
# 文件名: mymodule.py
def greet(name):
    return f"你好,{name}!"

def farewell(name):
    return f"再见,{name}!"

VERSION = "1.0.0"

# __name__ 测试
if __name__ == "__main__":
    print("模块直接运行测试")
    print(greet("小明"))

# 在其他文件中导入模块
import mymodule

print(mymodule.greet("小红"))
print(mymodule.VERSION)

# 也可以只导入特定的函数
from mymodule import greet, farewell
print(greet("小刚"))

# 给模块起别名
import mymodule as mm
print(mm.VERSION)

# 包(Package)的结构
# mypackage/
#   __init__.py
#   module1.py
#   module2.py

# 导入包中的模块
from mypackage import module1
import mypackage.module2

📝 课后小测验

1. __name__ == "__main__" 有什么用?

⏰ datetime模块详解

from datetime import datetime, timedelta
import time

# 获取当前时间
now = datetime.now()
print(now)  # 2023-12-25 14:30:45.123456

# 创建指定日期
birthday = datetime(2010, 6, 1, 10, 30)
print(birthday)

# 日期时间格式化
print(now.strftime("%Y年%m月%d日 %H:%M:%S"))
print(now.strftime("%A, %B %d, %Y"))

# 解析字符串为日期
date_str = "2023-12-25 08:00:00"
parsed_date = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
print(parsed_date)

# 时间戳转换
timestamp = time.time()
print(f"当前时间戳: {timestamp}")
date_from_timestamp = datetime.fromtimestamp(timestamp)
print(date_from_timestamp)

# timedelta 时间差计算
today = datetime.now()
tomorrow = today + timedelta(days=1)
yesterday = today - timedelta(days=1)
print(f"明天: {tomorrow.date()}")
print(f"昨天: {yesterday.date()}")

# 计算日期差
date1 = datetime(2023, 1, 1)
date2 = datetime(2023, 12, 31)
diff = date2 - date1
print(f"相差天数: {diff.days}")  # 364

💻 编程练习

创建一个倒计时程序,计算距离2025年春节(2025年1月29日)还有多少天,并显示每天的进步。

💡 提示:使用datetime计算两个日期之间的天数差

🚀 项目:个人日记本程序

综合运用文件操作、类与对象、异常处理等知识,开发一个完整的日记本程序。

import json
from datetime import datetime

class Diary:
    def __init__(self, filename="diary.json"):
        self.filename = filename
        self.entries = []
        self.load()
    
    def load(self):
        try:
            with open(self.filename, "r", encoding="utf-8") as f:
                self.entries = json.load(f)
        except FileNotFoundError:
            self.entries = []
    
    def save(self):
        with open(self.filename, "w", encoding="utf-8") as f:
            json.dump(self.entries, f, ensure_ascii=False, indent=2)
    
    def add_entry(self, title, content):
        entry = {
            "date": datetime.now().strftime("%Y-%m-%d %H:%M"),
            "title": title,
            "content": content
        }
        self.entries.append(entry)
        self.save()
        print("日记保存成功!")
    
    def show_entries(self):
        if not self.entries:
            print("还没有写日记哦~")
            return
        for entry in reversed(self.entries):
            print(f"\n{'='*40}")
            print(f"📅 {entry['date']}")
            print(f"📌 {entry['title']}")
            print(f"📝 {entry['content']}")

# 使用示例
diary = Diary()
print("=== 我的日记本 ===")
print("\n📖 查看所有日记:")
diary.show_entries()
print("\n✏️ 写新日记:")
diary.add_entry("学习Python", "今天学会了使用类和对象编程!")
diary.add_entry("开心的一天", "和朋友一起去公园玩,很开心!")

💻 扩展挑战

为日记本添加搜索功能,允许用户按关键词搜索日记内容。

💡 提示:使用filter()或列表推导式,结合in运算符检查标题和内容

📝 Python 常见题目解析

20道经典Python面试题与练习题详细讲解,点击展开查看解析

核心区别:

  • 可变性:list是可变的(mutable),可以添加、删除、修改元素;tuple是不可变的(immutable),一旦创建就不能修改
  • 性能:tuple比list更轻量,访问速度更快,占用内存更少
  • 用途:tuple通常用于存储不变的数据,如坐标、日期等;list用于存储需要经常修改的数据
# list - 可变
my_list = [1, 2, 3]
my_list[0] = 10  # ✓ 可以修改
my_list.append(4)     # ✓ 可以添加

# tuple - 不可变
my_tuple = (1, 2, 3)
# my_tuple[0] = 10  ✗ 会报错!
# TypeError: 'tuple' object does not support item assignment

概念解释:

  • 浅拷贝:只拷贝对象的第一层,嵌套的对象仍然引用原对象
  • 深拷贝:递归拷贝所有层级,生成一个完全独立的新对象
import copy

original = [1, [2, 3], 4]

# 浅拷贝
shallow = copy.copy(original)
shallow[1].append(100)
print(original)   # [1, [2, 3, 100], 4] - 原始列表被影响!

# 深拷贝
original2 = [1, [2, 3], 4]
deep = copy.deepcopy(original2)
deep[1].append(100)
print(original2)  # [1, [2, 3], 4] - 原始列表不受影响
print(deep)       # [1, [2, 3, 100], 4]

装饰器定义:装饰器是一种修改函数或类行为的语法糖,使用@符号放在函数定义上方。

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("函数执行前")
        result = func(*args, **kwargs)
        print("函数执行后")
        return result
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()
# 输出:
# 函数执行前
# Hello!
# 函数执行后

参数说明:

  • *args:接收任意数量的位置参数,封装成元组
  • **kwargs:接收任意数量的关键字参数,封装成字典
def func(*args, **kwargs):
    print(f"位置参数: {args}")
    print(f"关键字参数: {kwargs}")

func(1, 2, 3, name="小明", age=12)
# 位置参数: (1, 2, 3)
# 关键字参数: {'name': '小明', 'age': 12}

生成器特点:

  • 使用yield关键字返回值
  • 每次只产生一个值,节省内存
  • 可以表示无限序列
  • 惰性计算,按需生成
def count_up_to(n):
    count = 1
    while count <= n:
        yield count
        count += 1

gen = count_up_to(5)
print(next(gen))  # 1
print(next(gen))  # 2
print(list(gen))  # [3, 4, 5]

函数对比:

  • map():对每个元素执行操作,返回所有结果
  • filter():根据条件过滤元素,返回满足条件的元素
  • reduce():对序列进行累积计算,返回最终结果
from functools import reduce

numbers = [1, 2, 3, 4, 5]

# map - 平方运算
squared = list(map(lambda x: x**2, numbers))
print(squared)  # [1, 4, 9, 16, 25]

# filter - 过滤偶数
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens)  # [2, 4]

# reduce - 求和
total = reduce(lambda x, y: x + y, numbers)
print(total)  # 15

GIL概念:

  • GIL(Global Interpreter Lock):全局解释器锁,是Python解释器中的一个机制
  • 影响:同一时刻只有一个线程执行Python字节码,限制了多线程的并行执行
  • 解决方案:使用多进程(multiprocessing)绕过GIL,或使用C扩展
# CPU密集型任务 - 多进程更快
from multiprocessing import Pool

def cpu_task(n):
    return sum(i*i for i in range(n))

with Pool(4) as p:
    results = p.map(cpu_task, [1000000]*8)

猴子补丁定义:在运行时动态修改模块、类或函数的行为,而不需要修改源代码。

# 在运行时修改类的行为
class MyClass:
    def method(self):
        return "原始方法"

# 猴子补丁 - 修改方法
def new_method(self):
    return "修改后的方法"

MyClass.method = new_method

obj = MyClass()
print(obj.method())  # 修改后的方法

方法对比:

  • __new__:创建实例对象,在__init__之前调用
  • __init__:初始化实例对象,在对象创建后调用
class MyClass:
    def __new__(cls, *args, **kwargs):
        print("__new__被调用")
        return super().__new__(cls)
    
    def __init__(self, value):
        print("__init__被调用")
        self.value = value

obj = MyClass(10)
# 输出:
# __new__被调用
# __init__被调用

上下文管理器:用于管理资源的获取和释放,确保资源正确使用。

# 方式1:使用 with 语句和类
class FileManager:
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode
    
    def __enter__(self):
        self.file = open(self.filename, self.mode)
        return self.file
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()

with FileManager("test.txt", "w") as f:
    f.write("Hello!")

# 方式2:使用 contextmanager 装饰器
from contextlib import contextmanager

@contextmanager
def my_context():
    print("进入上下文")
    yield
    print("退出上下文")

with my_context():
    print("在上下文中")

概念对比:

  • 可迭代对象:可以用for循环遍历的对象(list、tuple、dict、set、str等)
  • 迭代器:实现了__iter__()和__next__()方法的对象,可以逐个获取元素
# 可迭代对象 vs 迭代器
my_list = [1, 2, 3]

# 使用 iter() 获取迭代器
my_iter = iter(my_list)
print(next(my_iter))  # 1
print(next(my_iter))  # 2
print(next(my_iter))  # 3
# print(next(my_iter))  # StopIteration 异常

# 自定义迭代器
class Counter:
    def __init__(self, limit):
        self.limit = limit
        self.current = 0
    
    def __iter__(self):
        return self
    
    def __next__(self):
        self.current += 1
        if self.current > self.limit:
            raise StopIteration
        return self.current

for num in Counter(3):
    print(num)  # 1, 2, 3

with语句:用于简化资源管理,确保资源在使用后正确释放,无论是否发生异常。

# 传统方式 - 需要手动关闭
f = open("test.txt", "w")
try:
    f.write("Hello")
finally:
    f.close()

# 使用 with - 自动关闭
with open("test.txt", "w") as f:
    f.write("Hello")
# 文件自动关闭,无需手动处理

# with 支持多个上下文
with open("a.txt") as f1, \
         open("b.txt") as f2:
    data = f1.read() + f2.read()

运算符对比:

  • is:比较对象身份(内存地址),判断是否是同一个对象
  • ==:比较值是否相等,判断内容是否相同
# 数字比较
a = 256
b = 256
print(a == b)  # True - 值相等
print(a is b)  # True - 小整数池缓存

# 字符串比较
s1 = "hello"
s2 = "hello"
print(s1 == s2)  # True - 值相等
print(s1 is s2)  # True - 字符串驻留

# 列表比较
list1 = [1, 2]
list2 = [1, 2]
print(list1 == list2)  # True - 值相等
print(list1 is list2)  # False - 不同对象

None is None     # True - None是单例
True is True   # True - True是单例

作用域查找顺序:

  • L (Local):本地作用域,函数内部
  • E (Enclosing):闭包作用域,外层函数
  • G (Global):全局作用域,模块级别
  • B (Built-in):内置作用域,Python内置
x = "全局"

def outer():
    x = "外层"
    
    def inner():
        x = "内层"
        print(x)  # 输出: 内层 (L)
    
    inner()
    print(x)    # 输出: 外层 (E)

outer()
print(x)      # 输出: 全局 (G)

print(len)    # 输出: 内置函数 (B)

闭包定义:闭包是指一个函数记住并访问其创建时的词法作用域,即使函数在原始作用域之外被调用。

def outer(msg):
    # 内部函数记住外部函数的变量
    def inner():
        print(msg)
    return inner

closure1 = outer("Hello")
closure2 = outer("World")

closure1()  # 输出: Hello
closure2()  # 输出: World

# 经典计数器示例
def make_counter():
    count = 0
    
    def counter():
        nonlocal count  # 修改外层变量
        count += 1
        return count
    
    return counter

counter1 = make_counter()
print(counter1())  # 1
print(counter1())  # 2
print(make_counter()())  # 1 (独立的计数器)

表达式对比:

  • 列表推导式:用方括号,立即生成完整列表,占用内存
  • 生成器表达式:用圆括号,惰性求值,按需生成,节省内存
# 列表推导式 - 立即生成列表
square_list = [x**2 for x in range(10)]
print(square_list)  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
print(type(square_list))  # 

# 生成器表达式 - 惰性求值
square_gen = (x**2 for x in range(10))
print(type(square_gen))  # 
print(list(square_gen))  # 转换为列表后可见

# 内存对比
import sys
large_list = [i for i in range(10000000)]
large_gen = (i for i in range(10000000))
print(sys.getsizeof(large_list))  # 大量内存
print(sys.getsizeof(large_gen))  # 很小!

异常处理机制:

try:
    num = int("abc")  # ValueError
except ValueError as e:
    print(f"值错误: {e}")
except ZeroDivisionError:
    print("不能除以0")
except Exception as e:
    print(f"其他错误: {e}")
else:
    print("没有异常发生")  # 仅在try成功时执行
finally:
    print("总是执行")  # 无论是否有异常

# 抛出自定义异常
class MyError(Exception):
    def __init__(self, message):
        self.message = message
        super().__init__(self.message)

raise MyError("这是一个自定义错误")

并发方案对比:

  • 多线程:共享内存,适合IO密集型任务,但受GIL限制
  • 多进程:独立内存,适合CPU密集型任务,可并行执行
# 多线程 - IO密集型
import threading

def download_file(url):
    # 模拟下载
    print(f"下载: {url}")

threads = []
for url in ["file1", "file2", "file3"]:
    t = threading.Thread(target=download_file, args=(url,))
    threads.append(t)
    t.start()

for t in threads:
    t.join()

# 多进程 - CPU密集型
from multiprocessing import Process

def calculate(n):
    return sum(i**2 for i in range(n))

if __name__ == "__main__":
    processes = []
    for i in range(4):
        p = Process(target=calculate, args=(10000000,))
        processes.append(p)
        p.start()
    
    for p in processes:
        p.join()

序列化模块对比:

  • json:人类可读的文本格式,跨语言兼容,只能序列化基本数据类型
  • pickle:Python专用的二进制格式,可序列化任意Python对象,不跨语言
import json, pickle

data = {"name": "小明", "age": 12, "scores": [95, 88]}

# JSON - 文本格式,跨语言
with open("data.json", "w") as f:
    json.dump(data, f, ensure_ascii=False)

with open("data.json", "r") as f:
    loaded_json = json.load(f)
print(type(loaded_json))  # 

# Pickle - 二进制格式,Python专用
with open("data.pkl", "wb") as f:
    pickle.dump(data, f)

with open("data.pkl", "rb") as f:
    loaded_pickle = pickle.load(f)
print(type(loaded_pickle))  # 

单例模式:确保一个类只有一个实例,并提供全局访问点。

# 方式1:使用 __new__ 方法
class Singleton1:
    _instance = None
    
    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

# 方式2:使用装饰器
def singleton(cls):
    instances = {}
    
    def get_instance(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    
    return get_instance

@singleton
class Database:
    def __init__(self):
        self.connection = "数据库连接"

# 测试
db1 = Database()
db2 = Database()
print(db1 is db2)  # True - 同一个实例