10岁掌握AI时代的核心语言,从星际编程开始
告别枯燥语法,用游戏化闯关解锁编程超能力
⭐ 已有 5,000+ 名星际学员加入,下一个编程小极客就是你!
完整课程体系
初级8章 + 中级10章 + 高级6章,从Hello World到机器学习入门,知识点循序渐进,零基础到专业级全覆盖。
习题深度解析
20道经典Python面试题和编程练习题,详细讲解思路和实现方案,彻底掌握核心概念。
核心单词速记
精选Python编程常用英文词汇,结合编程场景理解记忆,让代码阅读更顺畅。
实战项目驱动
每个阶段都有配套项目,从简单游戏到实用工具,让你在实践中检验学习成果。
完整课程体系
初级8章 + 中级10章 + 高级6章,从Hello World到机器学习入门,知识点循序渐进,零基础到专业级全覆盖。
习题深度解析
20道经典Python面试题和编程练习题,详细讲解思路和实现方案,彻底掌握核心概念。
核心单词速记
精选Python编程常用英文词汇,结合编程场景理解记忆,让代码阅读更顺畅。
实战项目驱动
每个阶段都有配套项目,从简单游戏到实用工具,让你在实践中检验学习成果。
🎓 初级课程
8大核心章节,从零开始构建Python基础能力,完成从了解到入门的蜕变
Python 初探
什么是编程 · 安装Python · 第一行代码 · print()详解
🚀 免费开启星际之旅变量与数据类型
数字 · 字符串 · 类型转换 · 运算符
🚀 免费开启星际之旅输入与输出
input()函数 · 格式化输出 · 交互程序 · 类型转换
🚀 免费开启星际之旅条件判断
if语句 · 比较运算符 · 逻辑判断 · 嵌套if
🚀 免费开启星际之旅循环结构
for循环 · while循环 · 循环控制 · range详解
🚀 免费开启星际之旅列表与元组
列表操作 · 索引切片 · 遍历列表 · 常用方法
🚀 免费开启星际之旅函数基础
定义函数 · 参数与返回值 · 模块化编程 · 作用域
🚀 免费开启星际之旅综合项目实战
猜数字游戏 · 简易计算器 · 成绩管理系统 · 石头剪刀布
🚀 免费开启星际之旅⚡ 中级课程
10个进阶章节,掌握Python高级特性,迈向专业程序员之路
面向对象编程
类与对象 · 构造函数 · 属性与方法 · 封装特性
进入学习 →继承与多态
类的继承 · super()函数 · 方法重写 · 多态特性
进入学习 →文件操作与持久化
文件读写 · JSON格式 · 异常处理 · 上下文管理
进入学习 →装饰器与高阶函数
闭包详解 · 装饰器模式 · 多重装饰 · wraps装饰
进入学习 →生成器与迭代器
迭代协议 · yield关键字 · 生成器表达式 · 惰性计算
进入学习 →Lambda与函数式编程
匿名函数 · map/filter/reduce · 函数组合
进入学习 →正则表达式
re模块详解 · 元字符 · 分组捕获 · 贪婪匹配
进入学习 →模块与包管理
模块导入 · __name__机制 · 包结构 · pip安装
进入学习 →时间与日期处理
datetime模块 · 时间戳 · 日期格式化 · timedelta
进入学习 →综合项目实战
个人日记本 · 通讯录管理 · 数据分析脚本
进入学习 →🚀 高级课程
掌握专业级技能,成为真正的Python开发者
🌐 网络编程与Web开发
Socket编程基础、HTTP协议解析、使用Flask构建Web应用、RESTful API设计。
进入学习 →⚡ 异步编程与并发
深入理解asyncio库、协程与事件循环、异步IO操作、高并发程序设计。
进入学习 →📊 数据分析与可视化
NumPy数值计算、Pandas数据处理、Matplotlib数据可视化、数据清洗。
进入学习 →🤖 机器学习入门
Scikit-learn核心算法、监督学习与无监督学习、模型训练与评估、特征工程。
进入学习 →🗄️ 数据库与SQL
SQLite基础操作、MySQL连接与查询、SQLAlchemy ORM、数据库设计。
进入学习 →🧪 测试与安全编程
单元测试与pytest、异常处理进阶、日志记录、性能分析与优化。
进入学习 →🎓 Python初级课程
点击章节展开,开始学习知识点并完成练习
Python 初探
什么是编程 · 安装Python · 第一行代码 · print()详解🎯 本章目标
- ✅ 了解什么是编程以及 Python 的特点
- ✅ 学会安装 Python 和 IDLE
- ✅ 掌握 print() 函数的基本用法
- ✅ 理解字符串和数字的区别
什么是编程?
Python 是一种非常适合初学者学习的编程语言,它的语法简洁明了,读起来几乎像英语。很多学校、科技馆和互联网公司都在使用 Python。Python 的名字来源于英国喜剧团体"蒙提·派森的飞行马戏团",创始人 Guido van Rossum 希望这门语言像这个喜剧一样有趣。
Python 能做很多事情:写小游戏、处理数据、做网站、甚至训练人工智能。世界上很多大公司(Google、YouTube、Instagram)都在用 Python。
安装 Python
安装步骤:
1. 打开浏览器,访问 python.org
2. 点击 "Downloads",下载最新版 Python 3.x
3. 运行安装程序,记得勾选 "Add Python to PATH"
4. 安装完成后,在开始菜单找到 "IDLE",这就是 Python 自带的编程环境
IDLE 是什么? 它是 Python 自带的简单编辑器,你可以在里面写代码并立刻看到结果。界面是黑底白字(或白底黑字)的窗口,非常适合初学者。
你的第一行代码:Hello World
print("Hello, World!")
print("你好,Python!")
print("我在学习编程!")注意:Python 严格区分大小写!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("Hello") # 注释也可以写在代码后面
# print("这行被注释掉了,不会执行")📝 本章小结
- 💡 编程就是给计算机写指令
- 💡 print() 用于输出内容到屏幕
- 💡 字符串需要用引号包围,数字不需要
- 💡 Python 语法简洁,适合初学者
📝 练习题(共5题)
💻 编程练习
变量与数据类型
数字 · 字符串 · 类型转换 · 运算符🎯 本章目标
- ✅ 理解变量的概念(存储数据的"盒子")
- ✅ 掌握三种基本数据类型: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) # 输出:131. 只能包含字母、数字和下划线
2. 不能以数字开头
3. 区分大小写(Age 和 age 是两个不同的变量)
4. 不能用 Python 关键字(如 if、for、print)作为变量名
5. 最好起有意义的名字,比如 student_name 比 x 好
三种基本数据类型
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类型查看与转换
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) + 12. 再把结果转回字符串:
str(int(age) + 1)3. 或者直接用 f-string:
f"明年你就{int(age)+1}岁了"
📝 本章小结
- 💡 变量 = 名字,用来存储数据
- 💡 整数(int)、浮点数(float)、字符串(str)
- 💡 字符串和数字不能直接相加,需要转换
- 💡 type() 可以查看数据类型
📝 练习题(共5题)
💻 编程练习
输入与输出
input()函数 · 格式化输出 · 交互程序 · 类型转换🎯 本章目标
- ✅ 掌握 input() 函数获取用户输入
- ✅ 理解 input() 返回的是字符串
- ✅ 学会使用 f-string 格式化输出
- ✅ 掌握 int()、float() 转换输入数据
获取用户输入:input()
name = input("请输入你的名字:")
print("你好," + name + "!欢迎学习Python!")重要:input() 返回的是字符串!
age = input("你今年几岁了?") # 假设输入 12
# age 现在是字符串 "12",不是数字 12
# 需要转换成整数
age = int(input("你今年几岁了?")) # 现在 age 是数字 12
print("明年你就" + str(age + 1) + "岁了!")类型转换函数
float():把内容转成浮点数(如 "3.5" → 3.5)
str():把内容转成字符串(如 100 → "100")
注意:int("abc") 会报错,因为 "abc" 不是数字!
# 做一个简单的加法计算器
num1 = int(input("请输入第一个数字:"))
num2 = int(input("请输入第二个数字:"))
print("两数之和是:", num1 + num2)格式化字符串:f-string
name = "小明"
age = 12
print(f"你好,{name}!你今年{age}岁。")
# 输出:你好,小明!你今年12岁。
# 甚至可以在大括号里计算
print(f"5 + 3 = {5+3}") # 输出:5 + 3 = 8📝 本章小结
- 💡 input() 用于获取键盘输入
- 💡 input() 返回的永远是字符串
- 💡 f-string 是格式化输出的最佳方式
- 💡 计算前记得把输入转成数字
📝 练习题(共5题)
💻 编程练习
条件判断
if语句 · 比较运算符 · 逻辑判断 · 嵌套if🎯 本章目标
- ✅ 理解 Python 的缩进规则
- ✅ 掌握 if、elif、else 的用法
- ✅ 学会使用比较运算符:>、<、==、!=
- ✅ 理解逻辑运算符:and、or、not
- ✅ 能够编写简单的条件判断程序
📝 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 语句:让程序做选择
score = 85
if score >= 60:
print("恭喜你,及格了!")
else:
print("别灰心,下次加油!")比较运算符
!= 不等于
> 大于 < 小于
>= 大于等于 <= 小于等于
if score == 100:
print("满分!太厉害了!")
elif score >= 90:
print("优秀!")
elif score >= 80:
print("良好!")
elif score >= 60:
print("及格!")
else:
print("不及格,需要努力!")逻辑运算符: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
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题)
if score>=90: print("A")
elif score>=80: print("B")
elif score>=60: print("C")
else: print("D")
💻 编程练习
循环结构
for循环 · while循环 · 循环控制 · range详解🎯 本章目标
- ✅ 掌握 for 循环遍历 range()
- ✅ 理解 range() 的三种用法
- ✅ 掌握 while 循环的条件控制
- ✅ 学会使用 break 和 continue
- ✅ 理解循环嵌套的概念
for 循环:重复做一件事
# range(5) 会产生 0, 1, 2, 3, 4
for i in range(5):
print(i)
# 输出:
# 0
# 1
# 2
# 3
# 4range() 的更多用法
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() 可视化演示
while 循环:条件满足就一直执行
count = 1
while count <= 5:
print("第" + str(count) + "次")
count = count + 1 # 重要!要让条件最终变为False,否则会无限循环break 和 continue
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题)
💻 编程练习
列表与元组
列表操作 · 索引切片 · 遍历列表 · 常用方法🎯 本章目标
- ✅ 理解列表(list)的基本操作
- ✅ 掌握索引访问和切片
- ✅ 学会列表的增删改查
- ✅ 理解元组(tuple)的不可变性
- ✅ 掌握列表推导式
列表:可以装很多东西的"书包"
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
scores = [85, 92, 78, 96, 88]
mixed = [1, "hello", 3.14, True] # 列表里可以混放不同类型的数据
empty = [] # 空列表索引:取出列表中的某个元素
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遍历列表
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}")元组:不可变的列表
point = (3, 4) # 坐标点
date = (2024, 5, 22) # 日期
print(point[0]) # 3
# point[0] = 5 # ❌ 报错!元组不能修改📝 本章小结
- 💡 列表用 [],可以存放多个数据
- 💡 索引从 0 开始,负数表示倒数
- 💡 append() 添加,remove() 删除
- 💡 元组用 (),创建后不能修改
📝 练习题(共5题)
for i, v in enumerate(["a","b","c"]):
print(i, v)
💻 编程练习
函数基础
定义函数 · 参数与返回值 · 模块化编程 · 作用域🎯 本章目标
- ✅ 理解字典(dict)的键值对结构
- ✅ 掌握字典的增删改查操作
- ✅ 学会遍历字典的键、值、键值对
- ✅ 了解集合(set)的去重功能
什么是函数?
使用函数的好处:代码复用(写一次用多次)、代码组织更清晰、方便调试和修改。
def say_hello():
print("你好!")
print("欢迎来到Python世界!")
# 调用函数
say_hello()
say_hello() # 可以反复使用!带参数的函数
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
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("小红", "早上好") # 早上好,小红!变量的作用域
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题)
def add(a, b=10):
return a + b
print(add(5))
💻 编程练习
综合项目实战
猜数字游戏 · 简易计算器 · 成绩管理系统 · 石头剪刀布🎯 本章目标
- ✅ 综合运用所学知识
- ✅ 学会分析和拆解问题
- ✅ 培养编程思维
- ✅ 完成多个实战项目
项目一:猜数字游戏
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("太大了,再小一点!")项目二:简易计算器
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()项目四:成绩管理系统(分步实现)
步骤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题)
📝 本章小结
- 💡 猜数字游戏:random + 循环 + 条件
- 💡 计算器:函数 + 条件判断
- 💡 成绩管理:列表 + 循环 + 统计
- 💡 编程需要多练习,熟能生巧
💻 终极挑战
1. 限制最多猜7次
2. 每次提示"还剩X次机会"
3. 猜对后显示"你用了X次猜中"
4. 加入一个"再玩一次"的选项
🚀 Python高级课程
掌握专业级技能,成为真正的Python开发者
网络编程与Web开发
Socket编程 · HTTP协议 · Flask框架 · RESTful API🎯 本章目标
- ✅ 理解网络编程基础概念
- ✅ 掌握Socket编程
- ✅ 学会使用Flask构建Web应用
- ✅ 理解RESTful API设计原则
🌐 网络编程基础
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框架入门
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题)
异步编程与并发
asyncio · 协程 · 事件循环 · 高并发🎯 本章目标
- ✅ 理解同步与异步的区别
- ✅ 掌握async/await语法
- ✅ 学会使用asyncio库
- ✅ 理解协程和事件循环
⚡ 异步编程基础
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题)
数据分析与可视化
NumPy · Pandas · Matplotlib · 数据清洗🎯 本章目标
- ✅ 掌握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题)
机器学习入门
Scikit-learn · 监督学习 · 特征工程 · 模型评估🎯 本章目标
- ✅ 理解机器学习基本概念
- ✅ 学会使用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题)
数据库与SQL
SQLite · MySQL · SQLAlchemy · ORM🎯 本章目标
- ✅ 掌握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题)
测试与安全编程
pytest · 异常处理 · 日志 · 性能优化🎯 本章目标
- ✅ 学会使用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题)
📖 Python 常用单词学习
掌握这些单词,看懂代码更容易!每个单词都带音标、日常意思和编程意思
🎯 学习建议
Python 代码中大量使用英语单词,提前熟悉这些词汇能让你读代码时更顺畅。建议每天记5-10个,结合代码示例理解记忆。
输入输出相关
print · input · output| 单词 | 日常意思 | 编程意思 | 代码示例 |
|---|---|---|---|
| print/prɪnt/☆ | 印刷;打印 | 把内容输出到屏幕 | print("Hello") |
| input/ˈɪnpʊt/☆ | 输入;投入 | 获取用户键盘输入 | name = input("名字?") |
| output/ˈaʊtpʊt/☆ | 输出;产量 | 程序输出的结果 | # print() 产生 output |
| display/dɪˈspleɪ/☆ | 展示;陈列 | 在屏幕上显示内容 | # 同义词:show, print |
数据类型相关
int · float · string · boolean| 单词 | 日常意思 | 编程意思 | 代码示例 |
|---|---|---|---|
| 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 · else · for · while · break · continue| 单词 | 日常意思 | 编程意思 | 代码示例 |
|---|---|---|---|
| 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 · function · import · module · class| 单词 | 日常意思 | 编程意思 | 代码示例 |
|---|---|---|---|
| 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 · or · not · in · is · True · False| 单词 | 日常意思 | 编程意思 | 代码示例 |
|---|---|---|---|
| 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 · insert · remove · len · range · enumerate| 单词 | 日常意思 | 编程意思 | 代码示例 |
|---|---|---|---|
| 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 · global · error · exception · try · except| 单词 | 日常意思 | 编程意思 | 代码示例 |
|---|---|---|---|
| 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 学习体系,专为零基础学习者打造
📚 学习路线图
初级课程
8章内容 · 入门阶段
- Python 初探与环境搭建
- 变量与数据类型
- 条件与循环控制
- 列表与元组
- 函数基础
- 综合项目实战
中级课程
10章内容 · 进阶阶段
- 面向对象编程
- 继承与多态
- 文件操作与持久化
- 装饰器与高阶函数
- 正则表达式
- 模块与包管理
- 综合项目实战
高级课程
6章内容 · 专业阶段
- 网络编程与Web开发
- 异步编程与并发
- 数据分析与可视化
- 机器学习入门
- 数据库与SQL
- 测试与安全编程
✨ 课程特色
目标清晰
每章都有明确的学习目标和成果,从基础到高级循序渐进
实战驱动
丰富的代码示例和项目练习,边学边练,快速上手
习题巩固
每章配套练习题,检验学习效果,巩固知识点
面试解析
20道经典面试题解析,深入理解 Python 核心概念
词汇速记
核心编程词汇表,配合场景记忆,告别死记硬背
全球标准
采用 Python 3.x 最新版本,符合行业规范和最佳实践
零基础友好
不需要任何编程基础,只要会基本电脑操作就能学习
前景广阔
Python 是 AI 时代首选语言,为未来发展奠定坚实基础
👥 适合人群
在校学生
提前掌握编程技能,为未来就业加分,培养计算思维
职场人士
提升工作效率,实现办公自动化,开拓职业发展道路
转行者
从零开始学习编程,进入技术领域,实现职业转型
爱好者
对编程感兴趣,想要探索科技世界,实现自己的创意
🌈 为什么选择 Python?
简洁易学
语法清晰简洁,读起来像英语,非常适合初学者入门
应用广泛
从网站开发到人工智能,从数据分析到自动化办公,Python 无所不能
社区活跃
全球最大的编程社区之一,丰富的资源和库,遇到问题容易解决
企业青睐
Google、Instagram、Netflix、Dropbox 等科技巨头都在使用
AI 首选
人工智能和机器学习领域的首选语言,未来发展潜力巨大
高薪职业
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) # 输出: 星际编程学校
📝 课后小测验
继承与多态
代码复用的艺术🎭 什么是继承?
继承允许我们创建一个类(子类),它继承另一个类(父类)的属性和方法。这就像生物学的遗传,子类自动获得父类的特征,同时还能添加自己特有的内容。
# 父类:动物
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属性
📝 课后小测验
文件操作与数据持久化
数据的存储与读取📁 文件读写基础
# 写入文件
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秒📝 课后小测验
生成器与迭代器
惰性计算的魔力⚡ 什么是生成器?
生成器是一种特殊的迭代器,它使用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 生成器
📦 列表 (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匿名函数
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) # 按年龄排序
📝 课后小测验
正则表达式
强大的文本匹配工具🔍 正则表达式基础
正则表达式是一种强大的模式匹配工具,可以用来搜索、验证和提取文本中的特定内容。
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
📝 课后小测验
时间与日期处理
时间戳与格式化⏰ 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面试题与练习题详细讲解,点击展开查看解析
Python中的list和tuple有什么区别?
可变性 · 性能对比 · 使用场景核心区别:
- 可变性: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 assignmentPython中的深拷贝和浅拷贝有什么区别?
概念解释 · 代码示例 · 内存分析概念解释:
- 浅拷贝:只拷贝对象的第一层,嵌套的对象仍然引用原对象
- 深拷贝:递归拷贝所有层级,生成一个完全独立的新对象
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!
# 函数执行后Python中的*args和**kwargs是什么?
参数说明 · 位置参数 · 关键字参数参数说明:
- *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关键字 · 惰性计算生成器特点:
- 使用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]Python中的map()、filter()、reduce()函数有什么区别?
函数对比 · map映射 · filter过滤 · reduce累积函数对比:
- 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) # 15Python中的GIL是什么?它有什么影响?
GIL概念 · 多线程限制 · 多进程方案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)什么是猴子补丁(Monkey Patching)?
动态修改 · 运行时修改 · 代码示例猴子补丁定义:在运行时动态修改模块、类或函数的行为,而不需要修改源代码。
# 在运行时修改类的行为
class MyClass:
def method(self):
return "原始方法"
# 猴子补丁 - 修改方法
def new_method(self):
return "修改后的方法"
MyClass.method = new_method
obj = MyClass()
print(obj.method()) # 修改后的方法Python中的__init__和__new__有什么区别?
方法对比 · 对象创建顺序 · 代码示例方法对比:
- __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__被调用什么是Python中的上下文管理器?如何创建?
资源管理 · 自动释放 · 语法特性上下文管理器:用于管理资源的获取和释放,确保资源正确使用。
# 方式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("在上下文中")Python中的迭代器和可迭代对象有什么区别?
概念对比 · 可迭代对象 · 迭代器概念对比:
- 可迭代对象:可以用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, 3Python中的with语句有什么作用?
资源管理 · 自动释放 · 语法特性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()Python中的is和==有什么区别?
运算符对比 · 身份比较 · 值比较运算符对比:
- 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是单例Python中的LEGB规则是什么?
作用域查找顺序 · L · E · G · B作用域查找顺序:
- 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)什么是Python中的闭包?
闭包定义 · 词法作用域 · 计数器示例闭包定义:闭包是指一个函数记住并访问其创建时的词法作用域,即使函数在原始作用域之外被调用。
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 (独立的计数器)Python中的列表推导式和生成器表达式有什么区别?
表达式对比 · 内存占用 · 惰性求值表达式对比:
- 列表推导式:用方括号,立即生成完整列表,占用内存
- 生成器表达式:用圆括号,惰性求值,按需生成,节省内存
# 列表推导式 - 立即生成列表
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)) # 很小! Python中的异常处理如何工作?
异常处理机制 · try-except · 自定义异常异常处理机制:
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("这是一个自定义错误")Python中的多线程和多进程有什么区别?
并发方案对比 · IO密集型 · CPU密集型并发方案对比:
- 多线程:共享内存,适合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()Python中的pickle和json模块有什么区别?
序列化模块对比 · 文本格式 · 二进制格式序列化模块对比:
- 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)) # Python中如何实现单例模式?
单例模式 · __new__方法 · 装饰器实现单例模式:确保一个类只有一个实例,并提供全局访问点。
# 方式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 - 同一个实例