🌟 初级魔法书 🌟

和小猫一起开启Python编程的魔法之旅!✨

1.1

Python简介

什么是Python?

Python是一种高级编程语言,由吉多·范罗苏姆(Guido van Rossum)于1991年创建。 它的设计哲学强调代码的可读性和简洁性,使用缩进来划分代码块,而不是使用花括号或者关键字。

💡 小猫说:

Python就像魔法世界的通用语言!简单易学,功能强大,无论是新手还是大师都能轻松掌握!

Python的特点

🌈 简单易学

语法简洁清晰,接近自然语言,非常适合编程初学者

🚀 功能强大

拥有丰富的标准库和第三方库,支持多种编程范式

🌍 跨平台

可以在Windows、Mac、Linux等多种操作系统上运行

👥 社区活跃

拥有庞大的开发者社区,遇到问题很容易找到帮助

Python的应用领域

🤖

人工智能

机器学习、深度学习

🌐

Web开发

网站后端、API开发

📊

数据分析

数据处理、可视化

1.2

环境搭建

安装Python

在开始Python魔法之旅之前,我们需要先安装Python解释器。就像魔法师需要魔杖一样, 我们需要Python来执行我们的魔法代码!

⚠️ 重要提醒:

请确保下载Python 3.x版本,目前推荐使用Python 3.8或更高版本。不要使用Python 2.x,因为它已经停止维护了!

Windows系统安装步骤

1

访问Python官网

打开浏览器,访问 https://www.python.org

2

下载安装包

点击"Downloads"菜单,选择"Windows",然后下载最新的Python安装包

3

运行安装程序

双击下载的.exe文件,在安装界面中务必勾选"Add Python to PATH"选项

4

完成安装

点击"Install Now",等待安装完成

验证安装

安装完成后,让我们验证一下Python是否安装成功:

# 打开命令提示符(CMD)或PowerShell
python --version
# 如果看到类似 "Python 3.9.7" 的输出,说明安装成功!
# 也可以输入 python 进入交互式环境
python
Python 3.9.7 (default, Sep 16 2021, 16:59:28) [GCC 7.5.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
# 看到 >>> 提示符,就可以开始输入Python代码了!
# 输入 exit() 或按 Ctrl+Z 然后回车退出

选择代码编辑器

就像魔法师需要魔法书来记录咒语一样,我们需要一个好的代码编辑器来编写Python代码。 推荐以下几个选择:

🐍 VS Code

轻量级但功能强大,拥有丰富的Python插件

# 推荐安装的插件:
- Python (Microsoft)
- Pylance
- Python Indent

🎯 PyCharm

专业的Python IDE,功能全面,适合大型项目

Community版本免费,Professional版本付费
1.3

第一个程序

Hello, World! - 你的第一个魔法咒语

在编程世界中,"Hello, World!"是每个程序员的第一个程序。 让我们一起来施展这个简单的魔法咒语吧!

# 创建一个名为 hello.py 的文件
print("Hello, World!")
print("🐱 欢迎来到Python魔法世界!")

💡 运行程序:

在命令行中输入:python hello.py

print() 函数详解

print()是Python中最常用的函数之一,用于在控制台输出内容。 让我们看看它的更多用法:

# 基本输出
print("这是一个字符串")
print(42) # 输出数字
print(3.14) # 输出小数
# 输出多个内容
print("我的名字是", "小猫", "今年", 3, "岁")
# 使用sep参数指定分隔符
print("苹果", "香蕉", "橙子", sep=", ")
# 输出: 苹果, 香蕉, 橙子
# 使用end参数指定结束符
print("Hello", end=" ")
print("World!")
# 输出: Hello World!

练习时间

现在轮到你来施展魔法了!试试完成以下练习:

🎯 练习1:自我介绍

使用print()函数输出你的自我介绍,包括姓名、年龄和爱好。

# 示例
print("我叫小明")
print("今年18岁")
print("喜欢编程和画画")

🎯 练习2:创意输出

使用不同的sep和end参数,创建有趣的输出效果。

# 示例
print("*" * 10)
print("Python", "魔法", "世界", sep="✨")
print("*" * 10)
1.4

变量与数据类型

什么是变量?

变量就像魔法师的魔法盒子,可以用来存储各种类型的数据。 在Python中,我们不需要声明变量的类型,直接赋值即可使用。

# 变量赋值示例
name = "小猫" # 字符串类型
age = 3 # 整数类型
height = 25.5 # 浮点数类型
is_magic = True # 布尔类型
# 使用变量
print(name + "今年" + str(age) + "岁")
print("身高:", height, "厘米")
print("会魔法吗:", is_magic)

Python的基本数据类型

📝 字符串 (str)

用于存储文本数据,用单引号或双引号包围

message = "Hello World"
name = '小猫'
spell = "✨魔法咒语✨"

🔢 整数 (int)

用于存储整数,没有小数部分

level = 10
score = 100
magic_power = 50

📊 浮点数 (float)

用于存储带小数点的数字

pi = 3.14159
height = 25.5
speed = 1.5

✅ 布尔值 (bool)

只有True或False两个值

is_magic = True
is_sleeping = False
has_power = True

类型转换

有时候我们需要在不同数据类型之间进行转换,Python提供了内置的转换函数:

# 类型转换示例
# 字符串转整数
age_str = "18"
age_int = int(age_str)
print(age_int + 2) # 输出: 20
# 整数转字符串
score = 100
score_str = str(score)
print("得分:" + score_str) # 输出: 得分:100
# 字符串转浮点数
height_str = "25.5"
height_float = float(height_str)
print(height_float + 1.5) # 输出: 27.0

⚠️ 注意:

不是所有的字符串都能转换为数字!如果字符串包含非数字字符,转换会失败并报错。

变量命名规则

在Python中,变量命名需要遵循一些规则,就像魔法咒语有固定的语法一样:

✅ 好的命名

player_name = "小明"
magicLevel = 10
has_potion = True
_private_var = "秘密"

❌ 错误的命名

# 以下命名都是错误的
2player = "错误" # 不能以数字开头
player-name = "错误" # 不能使用连字符
class = "错误" # 不能使用关键字
player name = "错误" # 不能包含空格

魔法练习

让我们来做一个有趣的魔法游戏,练习变量的使用:

# 魔法角色创建游戏
# 创建角色属性
character_name = "魔法小猫"
level = 1
health = 100
magic_power = 50
is_alive = True
# 显示角色信息
print("=== 角色信息 ===")
print("姓名:", character_name)
print("等级:", level)
print("生命值:", health)
print("魔法值:", magic_power)
print("存活状态:", is_alive)
# 角色升级
level = level + 1
health = health + 20
magic_power = magic_power + 10
# 显示升级后的信息
print("\n=== 升级后 ===")
print("新等级:", level)
print("新生命值:", health)
print("新魔法值:", magic_power)

小猫的异常处理技巧

💡 小猫说:

  • 使用具体的异常类型而不是通用的 Exception
  • except 块中提供有用的错误信息
1.5

控制流 - 条件语句

if 语句 - 魔法的选择

if语句就像魔法师的决策能力,根据不同的情况选择不同的魔法咒语。 让我们学习如何使用条件语句来控制程序的流程。

# 基本的if语句
magic_power = 30
if magic_power > 20:
print("可以施展高级魔法!")
print("魔法值充足")
print("魔法检查完成")

💡 缩进很重要:

Python使用缩进来表示代码块,通常使用4个空格。同一代码块中的代码必须有相同的缩进。

if-else 语句

当我们需要在两种情况之间选择时,可以使用if-else语句。

# if-else 示例
has_mana_potion = True
if has_mana_potion:
print("使用魔法药水恢复魔法值")
print("魔法值已恢复")
else:
print("没有魔法药水,需要休息恢复")
print("等待魔法值自然恢复")

if-elif-else 语句

当有多个条件需要判断时,我们可以使用if-elif-else语句。

# 多条件判断
player_level = 15
if player_level >= 20:
print("高级魔法师")
print("可以学习所有魔法")
elif player_level >= 10:
print("中级魔法师")
print("可以学习中级魔法")
elif player_level >= 5:
print("初级魔法师")
print("可以学习基础魔法")
else:
print("魔法学徒")
print("需要先学习基础知识")

比较运算符

在条件语句中,我们经常使用比较运算符来判断条件是否成立:

🔍 等于和不等于

x == 5 # 等于
x != 5 # 不等于

⚡ 大于和小于

x > 5 # 大于
x < 5 # 小于

📏 大于等于和小于等于

x >= 5 # 大于等于
x <= 5 # 小于等于

🎯 逻辑运算符

and # 与运算
or # 或运算
not # 非运算

魔法练习

让我们来做一个魔法决策游戏,练习条件语句的使用:

# 魔法决策游戏
player_level = 8
magic_power = 45
has_spell_book = True
# 判断是否可以学习新魔法
if player_level >= 10 and magic_power >= 50:
print("可以学习高级魔法!")
elif player_level >= 5 and has_spell_book:
print("可以学习中级魔法")
elif player_level >= 1:
print("可以学习基础魔法")
else:
print("还需要更多经验")
1.6

控制流 - 循环语句

for 循环 - 魔法的重复

for循环就像魔法师的重复咒语,可以让我们重复执行某些操作。 让我们学习如何使用for循环来简化重复的代码。

# 基本的for循环
for i in range(5):
print(f"施展第{i+1}次魔法")
# 遍历列表
spells = ["火球术", "冰冻术", "治疗术"]
for spell in spells:
print(f"学习魔法: {spell}")

while 循环

while循环会在条件为真时持续执行,就像魔法师持续施法直到魔法值耗尽。

# 基本的while循环
magic_power = 30
while magic_power > 0:
print(f"施展魔法,剩余魔法值: {magic_power}")
magic_power -= 5 # 每次消耗5点魔法值
print("魔法值耗尽,需要休息")

⚠️ 注意:

使用while循环时要确保循环最终会结束,否则会造成无限循环!

循环控制语句

有时候我们需要在循环中进行特殊控制,比如提前结束循环或跳过某些迭代:

# break - 提前结束循环
for i in range(10):
if i == 5:
break # 当i等于5时结束循环
print(f"当前数字: {i}")
# continue - 跳过当前迭代
for i in range(5):
if i == 2:
continue # 跳过i等于2的情况
print(f"处理数字: {i}")

魔法练习

让我们来做一个魔法训练游戏,练习循环语句的使用:

# 魔法训练游戏
# 练习1: 魔法连击
combo_count = 0
max_combo = 5
while combo_count < max_combo:
combo_count += 1
print(f"魔法连击 x{combo_count}!")
print(f"完成{max_combo}连击!")
# 练习2: 魔法收集
magic_items = ["红药水", "蓝药水", "魔法石", "卷轴"]
for item in magic_items:
if item == "魔法石":
print(f"找到稀有物品: {item}!")
continue
print(f"收集到: {item}")
1.7

函数基础

什么是函数?

函数就像魔法师的咒语书,可以把常用的魔法咒语封装起来, 需要的时候直接调用即可。函数让代码更加模块化和可重用。

# 定义一个简单的函数
def say_hello():
print("Hello, 魔法世界!")
print("欢迎来到Python魔法学院")
# 调用函数
say_hello() # 执行函数中的代码
say_hello() # 可以多次调用

带参数的函数

函数可以接受参数,就像魔法咒语可以根据不同的材料产生不同的效果。

# 带参数的函数
def cast_spell(spell_name, power):
print(f"施展魔法: {spell_name}")
print(f"魔法威力: {power}")
if power > 50:
print("这是高级魔法!")
# 调用带参数的函数
cast_spell("火球术", 30)
cast_spell("终极光束", 80)

返回值的函数

函数可以使用return语句返回值,就像魔法咒语可以产生具体的效果。

# 返回值的函数
def calculate_damage(base_damage, multiplier):
total_damage = base_damage * multiplier
return total_damage
# 使用返回值
damage = calculate_damage(10, 2.5)
print(f"总伤害: {damage}")
# 在表达式中使用函数
final_damage = calculate_damage(15, 1.8) + 5
print(f"最终伤害: {final_damage}")

默认参数值

函数参数可以有默认值,当调用时不提供该参数时,会使用默认值。

# 带默认参数的函数
def create_potion(potion_type="治疗药水", size="中等"):
print(f"制作{size}的{potion_type}")
# 使用默认参数
create_potion() # 输出: 制作中等的治疗药水
# 提供部分参数
create_potion("魔法药水") # 输出: 制作中等的魔法药水
# 提供所有参数
create_potion("力量药水", "大型") # 输出: 制作大型的力量药水

魔法练习

让我们来创建一个魔法角色系统,练习函数的使用:

# 魔法角色系统
def create_character(name, character_class="魔法师", level=1):
character = {
"name": name,
"class": character_class,
"level": level,
"health": 100 + level * 10,
"magic_power": 50 + level * 5
}
return character
def display_character(character):
print("=== 角色信息 ===")
print(f"姓名: {character['name']}")
print(f"职业: {character['class']}")
print(f"等级: {character['level']}")
print(f"生命值: {character['health']}")
print(f"魔法值: {character['magic_power']}")
# 创建和显示角色
hero = create_character("魔法小猫", "大魔法师", 5)
display_character(hero)
1.8

列表和元组

列表 - 可变的魔法收藏

列表就像魔法师的收藏袋,可以存放多个物品,而且可以随时添加、删除或修改物品。 列表是可变的,意味着创建后可以改变其内容。

# 创建列表
spells = ["火球术", "冰冻术", "治疗术"]
numbers = [1, 2, 3, 4, 5]
mixed = ["魔法书", 42, True, 3.14]
# 访问列表元素
print(spells[0]) # 输出: 火球术
print(spells[-1]) # 输出: 治疗术 (最后一个元素)
# 修改列表元素
spells[1] = "雷电术" # 替换第二个元素
print(spells) # 输出: ['火球术', '雷电术', '治疗术']

列表操作

列表提供了丰富的操作方法,让我们可以方便地管理魔法收藏:

# 添加元素
inventory = ["红药水", "蓝药水"]
inventory.append("魔法石") # 在末尾添加
inventory.insert(0, "卷轴") # 在指定位置插入
# 删除元素
inventory.remove("红药水") # 删除指定元素
popped_item = inventory.pop() # 删除并返回最后一个元素
# 列表排序
scores = [85, 92, 78, 96, 88]
scores.sort() # 升序排序
scores.sort(reverse=True) # 降序排序
# 列表长度和统计
print(f"物品数量: {len(inventory)}")
print(f"最高分: {max(scores)}")
print(f"平均分: {sum(scores) / len(scores)}")

元组 - 不可变的魔法封印

元组就像被封印的魔法物品,一旦创建就不能改变。元组是不可变的, 适合存储不应该被修改的数据。

# 创建元组
coordinates = (10, 20) # 2D坐标
rgb_color = (255, 0, 0) # RGB颜色
player_stats = ("魔法师", 5, 100) # 玩家状态
# 访问元组元素
print(f"X坐标: {coordinates[0]}")
print(f"Y坐标: {coordinates[1]}")
# 元组解包
player_class, player_level, player_health = player_stats
print(f"职业: {player_class}, 等级: {player_level}")

⚠️ 注意:

元组一旦创建就不能修改,尝试修改元组元素会导致错误!

魔法练习

让我们来创建一个魔法物品管理系统,练习列表和元组的使用:

# 魔法物品管理系统
def add_item(inventory, item_name, item_type, rarity):
item = (item_name, item_type, rarity)
inventory.append(item)
print(f"添加物品: {item_name}")
def display_inventory(inventory):
print("=== 物品栏 ===")
for i, item in enumerate(inventory, 1):
name, item_type, rarity = item
print(f"{i}. {name} ({item_type}) - {rarity}")
def find_rare_items(inventory):
rare_items = []
for item in inventory:
if item[2] == "稀有":
rare_items.append(item[0])
return rare_items
# 使用物品管理系统
magic_inventory = []
add_item(magic_inventory, "火焰之杖", "武器", "稀有")
add_item(magic_inventory, "治疗药水", "消耗品", "普通")
add_item(magic_inventory, "魔法护符", "饰品", "史诗")
display_inventory(magic_inventory)
rare_items = find_rare_items(magic_inventory)
print(f"稀有物品: {rare_items}")
1.9

字典和集合

字典 - 魔法宝典

字典就像魔法师的宝典,使用键值对的方式来存储信息。 每个键都是唯一的,可以通过键快速找到对应的值。

# 创建字典
player = {
"name": "魔法小猫", div> "level": 5,
"class": "魔法师", div> "health": 100,
"magic_power": 50
}
# 访问字典值
print(f"玩家姓名: {player['name']}")
print(f"玩家等级: {player['level']}")
# 修改字典值
player['level'] = 6 # 升级
player['health'] += 20 # 增加生命值
# 添加新的键值对
player['experience'] = 1200
player['skills'] = ["火球术", "冰冻术"]

字典操作

字典提供了丰富的操作方法,让我们可以方便地管理魔法宝典:

# 遍历字典
for key, value in player.items():
print(f"{key}: {value}")
# 获取所有键或值
keys = player.keys() # 获取所有键
values = player.values() # 获取所有值
# 检查键是否存在
if 'name' in player:
print(f"玩家姓名: {player['name']}")
# 删除键值对
removed_value = player.pop('experience') # 删除并返回值
del player['skills'] # 直接删除
# 获取值(安全方式)
age = player.get('age', '未知') # 如果键不存在,返回默认值
print(f"年龄: {age}")

集合 - 魔法元素

集合就像魔法元素,每个元素都是唯一的,没有重复。 集合非常适合用于去重和数学运算。

# 创建集合
elements = {"火", "水", "风", "土"}
numbers = {1, 2, 3, 4, 5, 5, 4, 3} # 重复元素会被自动去除
print(numbers) # 输出: {1, 2, 3, 4, 5}
# 集合操作
fire_elements = {"火", "炎", "熔岩"}
water_elements = {"水", "冰", "蒸汽"}
# 并集 - 所有元素
all_elements = fire_elements.union(water_elements)
print(f"所有元素: {all_elements}")
# 交集 - 共同元素
common_elements = fire_elements.intersection(water_elements)
print(f"共同元素: {common_elements}")
# 差集 - 在第一个集合但不在第二个集合
unique_fire = fire_elements.difference(water_elements)
print(f"火系特有元素: {unique_fire}")

魔法练习

让我们来创建一个魔法技能系统,练习字典和集合的使用:

# 魔法技能系统
def create_skill(name, skill_type, damage, mana_cost, description):
return {
"name": name,
"type": skill_type,
"damage": damage,
"mana_cost": mana_cost,
"description": description
}
def add_skill(skill_dict, skill):
skill_dict[skill['name']] = skill
print(f"添加技能: {skill['name']}")
def get_skills_by_type(skill_dict, skill_type):
return [skill for skill in skill_dict.values() if skill['type'] == skill_type]
def get_skill_types(skill_dict):
return {skill['type'] for skill in skill_dict.values()}
# 创建技能系统
skills = {}
fireball = create_skill("火球术", "攻击", 30, 20, "发射火球攻击敌人")
heal = create_skill("治疗术", "辅助", 0, 25, "恢复生命值")
lightning = create_skill("闪电术", "攻击", 45, 35, "召唤闪电攻击")
shield = create_skill("魔法护盾", "防御", 0, 30, "创建护盾保护自己")
add_skill(skills, fireball)
add_skill(skills, heal)
add_skill(skills, lightning)
add_skill(skills, shield)
# 查询技能
attack_skills = get_skills_by_type(skills, "攻击")
print(f"攻击技能: {[skill['name'] for skill in attack_skills]}")
skill_types = get_skill_types(skills)
print(f"技能类型: {skill_types}")
1.10

文件操作

文件操作 - 魔法卷轴的读写

在Python中,文件操作就像魔法师读写魔法卷轴一样。我们可以创建、读取、写入和关闭文件, 保存我们的魔法数据和程序结果。

# 打开文件的基本语法
file = open('文件名', '模式') # 模式:r(读取), w(写入), a(追加), r+(读写)
# 进行文件操作...
file.close() # 关闭文件
# 推荐使用 with 语句(自动关闭文件)
with open('魔法卷轴.txt', 'w', encoding='utf-8') as file:
file.write('这是一个魔法卷轴!\n')
file.write('包含着强大的魔法力量!\n')

写入文件

写入文件就像在魔法卷轴上记录咒语,我们可以保存文本、数据等信息:

# 写入模式(w)- 覆盖原有内容
with open('魔法咒语.txt', 'w', encoding='utf-8') as file:
file.write('火球术\n')
file.write('冰冻术\n')
file.write('治疗术\n')
# 追加模式(a)- 在文件末尾添加内容
with open('魔法咒语.txt', 'a', encoding='utf-8') as file:
file.write('闪电术\n')
file.write('风刃术\n')
# 写入多行内容
spells = ['火球术', '冰冻术', '治疗术', '闪电术']
with open('魔法咒语.txt', 'w', encoding='utf-8') as file:
for spell in spells:
file.write(f'{spell}\n')

读取文件

读取文件就像解读魔法卷轴中的内容,我们可以获取之前保存的信息:

# 读取整个文件
with open('魔法咒语.txt', 'r', encoding='utf-8') as file:
content = file.read() # 读取所有内容
print(f'文件内容:\n{content}')
# 逐行读取
with open('魔法咒语.txt', 'r', encoding='utf-8') as file:
for line in file:
spell = line.strip() # 去除换行符
print(f'魔法咒语:{spell}')
# 读取所有行到列表
with open('魔法咒语.txt', 'r', encoding='utf-8') as file:
spells = file.readlines() # 返回包含所有行的列表
print(f'咒语列表:{spells}')
# 读取指定行数
with open('魔法咒语.txt', 'r', encoding='utf-8') as file:
first_line = file.readline() # 读取第一行
print(f'第一个咒语:{first_line.strip()}')

魔法练习 - 魔法师日志系统

让我们创建一个魔法师日志系统,记录魔法师的冒险经历:

# 魔法师日志系统
def add_log_entry(filename, wizard_name, action, details):
"""添加日志条目"""
import datetime
timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
log_entry = f'[{timestamp}] {wizard_name}: {action} - {details}\n'
with open(filename, 'a', encoding='utf-8') as file:
file.write(log_entry)
print(f'日志已添加:{log_entry.strip()}')
def read_log_file(filename):
"""读取日志文件"""
try:
with open(filename, 'r', encoding='utf-8') as file:
print('=== 魔法师日志 ===')
for line in file:
print(line.strip())
except FileNotFoundError:
print('日志文件不存在!')
def search_logs(filename, keyword):
"""搜索日志中的关键词"""
try:
with open(filename, 'r', encoding='utf-8') as file:
print(f'=== 搜索 "{keyword}" 的结果 ===')
found = False
for line_num, line in enumerate(file, 1):
if keyword.lower() in line.lower():
print(f'第{line_num}行: {line.strip()}')
found = True
if not found:
print(f'未找到包含 "{keyword}" 的日志')
except FileNotFoundError:
print('日志文件不存在!')
# 使用日志系统
log_file = '魔法师日志.txt'
add_log_entry(log_file, '魔法小猫', '学习新咒语', '掌握了火球术')
add_log_entry(log_file, '魔法小猫', '战斗胜利', '击败了邪恶巫师')
add_log_entry(log_file, '魔法小猫', '升级', '达到了5级')
add_log_entry(log_file, '魔法小猫', '获得装备', '得到了魔法杖')
print('\n')
read_log_file(log_file)
print('\n')
search_logs(log_file, '咒语')

小猫的文件操作技巧

💡 小猫说:

  • 总是使用 with 语句处理文件,这样可以自动关闭文件
  • 记得指定编码格式 encoding='utf-8',避免中文乱码
  • 处理文件前最好检查文件是否存在,可以使用 try-except
  • 大文件处理时,建议逐行读取而不是一次性读取全部内容
  • 文件路径可以使用相对路径或绝对路径,建议使用 os.path 模块处理路径
1.11

异常处理

异常处理 - 魔法的错误防护

在魔法世界中,即使是最强大的魔法师也会遇到咒语失败的情况。 异常处理就像魔法护盾,保护我们的程序在遇到错误时不会崩溃, 而是优雅地处理错误并继续执行。

# 基本的异常处理结构
try:
# 可能出现错误的代码
result = 10 / 0
except ZeroDivisionError:
# 处理除零错误
print('不能除以零!')
else:
# 如果没有错误,执行这里的代码
print(f'计算结果:{result}')
finally:
# 无论是否有错误,都会执行这里的代码
print('计算结束')

常见异常类型

就像魔法世界中有不同类型的魔法失败,Python中也有不同类型的异常:

# 常见异常类型示例
def demonstrate_exceptions():
# 1. NameError - 名称错误
try:
print(undefined_variable)
except NameError as e:
print(f'名称错误:{e}')
# 2. TypeError - 类型错误
try:
result = '5' + 5
except TypeError as e:
print(f'类型错误:{e}')
# 3. ValueError - 值错误
try:
number = int('abc')
except ValueError as e:
print(f'值错误:{e}')
# 4. IndexError - 索引错误
try:
my_list = [1, 2, 3]
print(my_list[5])
except IndexError as e:
print(f'索引错误:{e}')
# 5. KeyError - 键错误
try:
my_dict = {'name': '魔法小猫'}
print(my_dict['age'])
except KeyError as e:
print(f'键错误:{e}')
# 6. FileNotFoundError - 文件未找到错误
try:
with open('不存在的文件.txt', 'r') as file:
content = file.read()
except FileNotFoundError as e:
print(f'文件未找到错误:{e}')
demonstrate_exceptions()

高级异常处理

魔法师可以学习更高级的防护技巧,让我们的程序更加健壮:

# 多重异常处理
def advanced_exception_handling():
try:
# 用户输入处理
user_input = input('请输入一个数字:')
number = int(user_input)
result = 100 / number
print(f'100 ÷ {number} = {result}')
except ValueError:
print('错误:请输入有效的数字!')
except ZeroDivisionError:
print('错误:不能除以零!')
except Exception as e:
print(f'未知错误:{e}')
else:
print('计算成功完成!')
finally:
print('程序执行结束')
# 自定义异常
class MagicError(Exception):
"""自定义魔法错误"""
pass
class InsufficientManaError(MagicError):
"""法力不足错误"""
def __init__(self, required, available):
self.required = required
self.available = available
super().__init__(f'法力不足!需要{required},当前只有{available}')
def cast_spell(spell_name, mana_cost, current_mana):
"""施放魔法咒语"""
if current_mana < mana_cost:
raise InsufficientManaError(mana_cost, current_mana)
print(f'成功施放{spell_name}!消耗法力:{mana_cost}')
return current_mana - mana_cost
# 使用自定义异常
try:
remaining_mana = cast_spell('火球术', 30, 20)
except InsufficientManaError as e:
print(f'施法失败:{e}')
print('建议:先恢复法力再施法!')

魔法练习 - 魔法战斗系统

让我们创建一个带有完整异常处理的魔法战斗系统:

# 魔法战斗系统
class Wizard:
def __init__(self, name, health, mana, level=1):
self.name = name
self.health = health
self.mana = mana
self.level = level
self.max_health = health
self.max_mana = mana
def cast_spell(self, spell_name, mana_cost, damage=0):
"""施放魔法咒语"""
try:
if self.health <= 0:
raise Exception(f'{self.name}已经倒下,无法施法!')
if self.mana < mana_cost:
raise InsufficientManaError(mana_cost, self.mana)
self.mana -= mana_cost
print(f'{self.name}施放了{spell_name}!')
return damage
except InsufficientManaError as e:
print(f'施法失败:{e}')
return 0
except Exception as e:
print(f'错误:{e}')
return 0
def take_damage(self, damage):
"""受到伤害"""
try:
if damage < 0:
raise ValueError('伤害值不能为负数!')
self.health -= damage
if self.health < 0:
self.health = 0
print(f'{self.name}受到{damage}点伤害,剩余生命值:{self.health}')
except ValueError as e:
print(f'伤害计算错误:{e}')
def heal(self, amount):
"""恢复生命值"""
try:
if amount < 0:
raise ValueError('治疗量不能为负数!')
self.health += amount
if self.health > self.max_health:
self.health = self.max_health
print(f'{self.name}恢复了{amount}点生命值,当前生命值:{self.health}')
except ValueError as e:
print(f'治疗错误:{e}')
def restore_mana(self, amount):
"""恢复法力值"""
try:
if amount < 0:
raise ValueError('法力恢复量不能为负数!')
self.mana += amount
if self.mana > self.max_mana:
self.mana = self.max_mana
print(f'{self.name}恢复了{amount}点法力值,当前法力值:{self.mana}')
except ValueError as e:
print(f'法力恢复错误:{e}')
# 战斗演示
def magic_battle():
player = Wizard('魔法小猫', 100, 50)
enemy = Wizard('邪恶巫师', 80, 40)
print('=== 魔法战斗开始 ===')
# 玩家回合
damage = player.cast_spell('火球术', 20, 25)
if damage > 0:
enemy.take_damage(damage)
# 敌人回合
damage = enemy.cast_spell('冰冻术', 15, 20)
if damage > 0:
player.take_damage(damage)
# 恢复法力
player.restore_mana(10)
enemy.restore_mana(8)
print('\n=== 战斗结束 ===')
print(f'{player.name} - 生命值:{player.health},法力值:{player.mana}')
print(f'{enemy.name} - 生命值:{enemy.health},法力值:{enemy.mana}')
magic_battle()
1.12

模块和包

什么是模块?

模块就像魔法书中的章节,是一个包含Python定义和语句的文件。 通过模块,我们可以将代码组织成更小的、可重用的部分。

💡 小猫说:

模块就像魔法师的咒语收藏册!每个模块都有特定的魔法功能,需要时就可以召唤使用!

导入模块

在Python中,我们可以使用import语句来导入模块:

# 导入整个模块
import math
print(math.pi) # 3.141592653589793
print(math.sqrt(16)) # 4.0
# 导入模块中的特定函数
from math import pi, sqrt
print(pi) # 3.141592653589793
print(sqrt(25)) # 5.0
# 给模块起别名
import math as m
print(m.pi) # 3.141592653589793

创建自己的模块

让我们创建一个魔法模块来存储常用的魔法函数:

# magic_spells.py - 魔法咒语模块
def fire_ball(damage=10):
"""火球术"""
return f"施放火球术,造成{damage}点伤害!"
def heal_spell(amount=20):
"""治疗术"""
return f"施放治疗术,恢复{amount}点生命值!"
def shield_spell(duration=30):
"""护盾术"""
return f"施放护盾术,持续{duration}秒!"
# 魔法常量
MAGIC_POWER = 100
MAX_MANA = 200
# 使用自定义模块
import magic_spells as ms
print(ms.fire_ball(15))
print(ms.heal_spell())
print(ms.shield_spell(60))
print(f"魔法力量:{ms.MAGIC_POWER}")

什么是包?

包是包含多个模块的目录,就像魔法学院的各个系一样, 每个系都有自己专门的魔法课程和咒语。

# 包的结构示例:
magic_academy/
├── __init__.py
├── elemental_magic/
│ ├── __init__.py
│ ├── fire.py
│ ├── water.py
│ └── earth.py
├── healing_magic/
│ ├── __init__.py
│ ├── basic_healing.py
│ └── advanced_healing.py
└── defensive_magic/
├── __init__.py
├── shields.py
└── barriers.py

使用第三方包

Python有丰富的第三方包,就像魔法世界中的各种魔法道具一样, 可以大大增强我们的魔法能力!

# 使用pip安装第三方包
pip install numpy
pip install pandas
pip install matplotlib
# 在代码中使用第三方包
import numpy as np
import matplotlib.pyplot as plt
# 创建魔法能量数组
magic_power = np.array([10, 25, 30, 45, 60])
print(f"魔法能量数组:{magic_power}")

魔法练习 - 魔法学院系统

让我们创建一个完整的魔法学院系统,使用模块和包来组织代码:

# student.py - 学生模块
class Student:
def __init__(self, name, house, magic_power=50):
self.name = name
self.house = house
self.magic_power = magic_power
self.spells_learned = []
def learn_spell(self, spell_name):
self.spells_learned.append(spell_name)
print(f"{self.name}学会了{spell_name}!")
def cast_spell(self, spell_name):
if spell_name in self.spells_learned:
if self.magic_power >= 10:
self.magic_power -= 10
print(f"{self.name}成功施放{spell_name}!")
else:
print(f"{self.name}法力不足!")
else:
print(f"{self.name}还没有学会{spell_name}!")
# academy.py - 学院模块
from student import Student
class MagicAcademy:
def __init__(self, name):
self.name = name
self.students = []
self.spells_available = ["火球术", "治疗术", "护盾术"]
def enroll_student(self, student):
self.students.append(student)
print(f"{student.name}加入了{self.name}!")
def teach_spell(self, spell_name):
if spell_name in self.spells_available:
for student in self.students:
student.learn_spell(spell_name)
else:
print(f"学院没有{spell_name}这门课程!")
def list_students(self):
print(f"{self.name}的学生名单:")
for student in self.students:
print(f"- {student.name} ({student.house})")
# main.py - 主程序
from academy import MagicAcademy
from student import Student
# 创建魔法学院
hogwarts = MagicAcademy("霍格沃茨魔法学院")
# 招收学生
harry = Student("哈利·波特", "格兰芬多")
hermione = Student("赫敏·格兰杰", "格兰芬多")
ron = Student("罗恩·韦斯莱", "格兰芬多")
hogwarts.enroll_student(harry)
hogwarts.enroll_student(hermione)
hogwarts.enroll_student(ron)
# 教授咒语
hogwarts.teach_spell("火球术")
hogwarts.teach_spell("治疗术")
# 学生施法
harry.cast_spell("火球术")
hermione.cast_spell("治疗术")
ron.cast_spell("护盾术")
# 列出学生
hogwarts.list_students()

小猫的模块技巧

💡 小猫说:

  • 给模块起有意义的名字,让别人一看就知道这个模块是做什么的
  • 在模块中添加文档字符串(docstring),说明模块的用途
  • 避免循环导入,这会导致程序出错
  • 使用相对导入来导入同一包中的其他模块
1.13

面向对象编程

什么是面向对象编程?

面向对象编程(OOP)就像创造魔法世界中的各种生物和物品一样, 我们可以定义它们的属性和行为,然后创建具体的实例。

💡 小猫说:

面向对象编程就像魔法世界的创造法则!你可以定义魔法生物的模板,然后创造出无数个具体的魔法生物!

类和对象

类是对象的模板,对象是类的具体实例。就像魔法生物的种族和具体的魔法生物个体一样。

# 定义一个魔法师类
class Wizard:
"""魔法师类"""
# 类属性 - 所有魔法师共享的属性
academy = "霍格沃茨魔法学院"
def __init__(self, name, house, magic_power=50):
"""初始化方法 - 创建魔法师时调用"""
# 实例属性 - 每个魔法师独有的属性
self.name = name
self.house = house
self.magic_power = magic_power
self.spells = []
def cast_spell(self, spell_name, mana_cost=10):
"""施放魔法咒语"""
if self.magic_power >= mana_cost:
self.magic_power -= mana_cost
print(f"{self.name}施放了{spell_name}!")
return True
else:
print(f"{self.name}法力不足!")
return False
def learn_spell(self, spell_name):
"""学习新的魔法咒语"""
self.spells.append(spell_name)
print(f"{self.name}学会了{spell_name}!")
def rest(self):
"""休息恢复法力"""
self.magic_power = min(100, self.magic_power + 20)
print(f"{self.name}休息了一下,法力恢复到{self.magic_power}")
def __str__(self):
"""字符串表示方法"""
return f"魔法师{self.name},来自{self.house}学院,法力值:{self.magic_power}"
# 创建魔法师对象
harry = Wizard("哈利·波特", "格兰芬多", 80)
hermione = Wizard("赫敏·格兰杰", "格兰芬多", 95)
malfoy = Wizard("德拉科·马尔福", "斯莱特林", 70)
# 使用对象
print(harry) # 调用__str__方法
harry.learn_spell("除你武器")
harry.cast_spell("除你武器", 15)
harry.rest()
# 访问属性
print(f"{harry.name}的法力值:{harry.magic_power}")
print(f"所有魔法师都来自:{Wizard.academy}")

继承

继承就像魔法世界的血脉传承,子类可以继承父类的属性和方法, 同时还可以添加自己特有的属性和方法。

# 基类 - 魔法生物
class MagicalCreature:
def __init__(self, name, age, power):
self.name = name
self.age = age
self.power = power
def speak(self):
return f"{self.name}发出了声音!"
def use_power(self):
return f"{self.name}使用了魔法力量!"
# 子类 - 龙
class Dragon(MagicalCreature):
def __init__(self, name, age, power, wing_span, element="火"):
# 调用父类的初始化方法
super().__init__(name, age, power)
# 子类特有的属性
self.wing_span = wing_span
self.element = element
# 重写父类方法
def speak(self):
return f"{self.name}发出了震耳欲聋的龙吼!"
# 子类特有的方法
def fly(self):
return f"{self.name}展开了{self.wing_span}米宽的翅膀,翱翔在天空中!"
def breathe_fire(self):
if self.element == "火":
return f"{self.name}喷出了炽热的{self.element}焰!"
else:
return f"{self.name}喷出了强大的{self.element}系吐息!"
# 子类 - 独角兽
class Unicorn(MagicalCreature):
def __init__(self, name, age, power, horn_length, healing_power):
super().__init__(name, age, power)
self.horn_length = horn_length
self.healing_power = healing_power
def speak(self):
return f"{self.name}发出了清脆的鸣叫!"
def heal(self, target):
return f"{self.name}用{self.horn_length}厘米长的角治疗了{target}!"
def purify_water(self):
return f"{self.name}净化了水源,水质变得清澈甘甜!"
# 创建魔法生物对象
dragon = Dragon("诺伯", 100, 500, 20, "火")
unicorn = Unicorn("银蹄", 50, 200, 30, 80)
# 使用继承的方法
print(dragon.speak()) # 调用重写后的方法
print(dragon.use_power()) # 调用继承的方法
print(dragon.fly()) # 调用子类特有的方法
print(dragon.breathe_fire()) # 调用子类特有的方法
print(unicorn.speak())
print(unicorn.use_power())
print(unicorn.heal("受伤的小精灵"))
print(unicorn.purify_water())

多态

多态就像魔法世界中的变形术,不同的魔法生物对同一个咒语可能有不同的反应。

# 定义一个魔法战斗函数
def magic_battle(creature):
"""让魔法生物进行战斗"""
print(f"{creature.name}进入战斗状态!")
print(creature.speak()) # 多态:不同生物有不同的叫声
print(creature.use_power()) # 多态:不同生物使用不同的力量
print("---")
# 创建不同的魔法生物
creatures = [
Dragon("诺伯", 100, 500, 20, "火"),
Unicorn("银蹄", 50, 200, 30, 80),
MagicalCreature("小精灵", 10, 50)
]
# 让所有生物都参与战斗
for creature in creatures:
magic_battle(creature)

封装

封装就像魔法咒语的保密机制,通过私有属性和方法来保护内部状态不被外部直接访问。

# 带有封装的魔法药水类
class MagicPotion:
def __init__(self, name, effect, power_level):
self.name = name # 公开属性
self._effect = effect # 受保护属性(约定)
self.__power_level = power_level # 私有属性
self.__ingredients = [] # 私有属性
def add_ingredient(self, ingredient):
"""添加药材"""
self.__ingredients.append(ingredient)
print(f"添加了药材:{ingredient}")
def get_power_level(self):
"""获取药水威力(只读)"""
return self.__power_level
def set_power_level(self, new_level):
"""设置药水威力(有验证)"""
if 0 <= new_level <= 100:
self.__power_level = new_level
print(f"药水威力已设置为:{new_level}")
else:
print("威力必须在0-100之间!")
def __secret_formula(self):
"""私有方法:秘密配方"""
return f"{self.name}的秘密配方已激活!"
def brew(self):
"""酿造药水"""
if len(self.__ingredients) >= 3:
return self.__secret_formula()
else:
return "药材不足,无法酿造!"
# 使用封装的药水类
potion = MagicPotion("生命药水", "恢复生命", 80)
# 访问公开属性
print(f"药水名称:{potion.name}")
# 访问受保护属性(不推荐,但可以访问)
print(f"药水效果:{potion._effect}")
# 通过方法访问私有属性
print(f"药水威力:{potion.get_power_level()}")
# 修改私有属性
potion.set_power_level(90)
potion.set_power_level(150) # 会显示错误信息
# 添加药材并酿造
potion.add_ingredient("龙血")
potion.add_ingredient("凤凰羽毛")
potion.add_ingredient("独角兽毛")
print(potion.brew())

魔法练习 - 魔法世界模拟器

让我们创建一个完整的魔法世界模拟器,综合运用面向对象编程的各种特性:

# 抽象基类
from abc import ABC, abstractmethod
class MagicalEntity(ABC):
"""魔法实体抽象基类"""
def __init__(self, name, location):
self.name = name
self.location = location
self.__energy = 100
@abstractmethod
def use_magic(self):
"""抽象方法:使用魔法"""
pass
def rest(self):
"""休息恢复能量"""
self.__energy = min(100, self.__energy + 30)
return f"{self.name}休息了一下,能量恢复到{self.__energy}"
def get_energy(self):
return self.__energy
def consume_energy(self, amount):
if self.__energy >= amount:
self.__energy -= amount
return True
return False
# 具体类 - 魔法师
class Wizard(MagicalEntity):
def __init__(self, name, location, house, wand_type):
super().__init__(name, location)
self.house = house
self.wand_type = wand_type
self.spells = []
def use_magic(self):
if self.consume_energy(20):
return f"{self.name}挥舞着{self.wand_type}魔杖施放了魔法!"
return f"{self.name}能量不足,无法施法!"
def learn_spell(self, spell):
self.spells.append(spell)
return f"{self.name}学会了{spell}!"
def __str__(self):
return f"魔法师{self.name}({self.house}学院)"
# 具体类 - 魔法生物
class MagicalCreature(MagicalEntity):
def __init__(self, name, location, species, special_ability):
super().__init__(name, location)
self.species = species
self.special_ability = special_ability
def use_magic(self):
if self.consume_energy(15):
return f"{self.name}使用了{self.special_ability}能力!"
return f"{self.name}太累了,无法使用能力!"
def migrate(self, new_location):
self.location = new_location
return f"{self.name}迁移到了{new_location}"
def __str__(self):
return f"{self.species}{self.name}"
# 魔法物品类
class MagicalItem:
def __init__(self, name, item_type, power):
self.name = name
self.item_type = item_type
self.power = power
self.__durability = 100
def use(self, user):
if self.__durability > 0:
self.__durability -= 10
return f"{user}使用了{self.name},发动了{self.power}效果!"
return f"{self.name}已经损坏了!"
def repair(self):
self.__durability = 100
return f"{self.name}已修复!"
def __str__(self):
return f"{self.item_type}:{self.name}"
# 魔法世界类
class MagicWorld:
def __init__(self, name):
self.name = name
self.entities = []
self.items = []
def add_entity(self, entity):
self.entities.append(entity)
return f"{entity}加入了{self.name}!"
def add_item(self, item):
self.items.append(item)
return f"{item}被添加到{self.name}!"
def world_event(self):
"""世界事件:所有实体和物品互动"""
events = []
for entity in self.entities:
events.append(entity.use_magic())
events.append(entity.rest())
return events
def status_report(self):
"""状态报告"""
report = [f"=== {self.name}状态报告 ==="]
report.append("魔法实体:")
for entity in self.entities:
report.append(f"- {entity},能量:{entity.get_energy()},位置:{entity.location}")
report.append("魔法物品:")
for item in self.items:
report.append(f"- {item}")
return "\n".join(report)
# 创建魔法世界
world = MagicWorld("奇幻魔法世界")
# 创建魔法师
harry = Wizard("哈利·波特", "霍格沃茨", "格兰芬多", "冬青木")
hermione = Wizard("赫敏·格兰杰", "霍格沃茨", "格兰芬多", "藤木")
# 创建魔法生物
hedwig = MagicalCreature("海德薇", "霍格沃茨", "猫头鹰", "送信")
buckbeak = MagicalCreature("巴克比克", "霍格沃茨", "鹰头马身有翼兽", "飞行")
# 创建魔法物品
cloak = MagicalItem("隐形衣", "衣物", "隐形")
map = MagicalItem("活点地图", "地图", "显示位置")
stone = MagicalItem("复活石", "宝石", "复活死者")
# 添加到世界
print(world.add_entity(harry))
print(world.add_entity(hermione))
print(world.add_entity(hedwig))
print(world.add_entity(buckbeak))
print(world.add_item(cloak))
print(world.add_item(map))
print(world.add_item(stone))
# 学习咒语
print(harry.learn_spell("呼神护卫"))
print(hermione.learn_spell("幻影移形"))
# 使用物品
print(cloak.use(harry.name))
print(map.use(hermione.name))
# 世界事件
print("\n=== 世界事件开始 ===")
events = world.world_event()
for event in events:
print(event)
# 状态报告
print("\n" + world.status_report())

小猫的面向对象编程技巧

💡 小猫说:

  • 类名使用大驼峰命名法(PascalCase),如 MagicWizard
  • 方法名使用小写下划线命名法(snake_case),如 cast_spell
  • 合理使用继承,避免过深的继承层次
  • 优先使用组合而不是继承来实现代码复用
  • 善用抽象基类来定义接口规范
1.14

装饰器和生成器

装饰器 - 魔法增强咒语

装饰器是Python中的一种高级特性,它允许你在不修改原函数代码的情况下,为函数添加额外的功能。 就像给魔法咒语添加增强效果一样!

# 基础装饰器示例
def magic_enhancer(func):
def wrapper(*args, **kwargs):
print(f"✨ 正在为 {func.__name__} 施加魔法增强...")
result = func(*args, **kwargs)
print(f"🌟 {func.__name__} 魔法增强完成!")
return result
return wrapper
# 使用装饰器
@magic_enhancer
def cast_fireball(target):
return f"🔥 火球术攻击 {target}!"
# 调用被装饰的函数
print(cast_fireball("恶龙"))

💡 小猫说:

装饰器就像是给函数穿上了一件魔法袍子,让函数在执行前后都能施展额外的魔法!

带参数的装饰器

装饰器也可以接受参数,这样我们就可以根据不同的需求来定制装饰器的行为。

# 带参数的装饰器
def magic_power(level):
def decorator(func):
def wrapper(*args, **kwargs):
print(f"⚡ 使用等级 {level} 的魔法力量增强 {func.__name__}")
result = func(*args, **kwargs)
print(f"✨ 等级 {level} 魔法效果释放完毕")
return result
return wrapper
return decorator
# 使用带参数的装饰器
@magic_power(level=5)
def heal_spell(target):
return f"💚 治疗术治愈了 {target}!"
@magic_power(level=10)
def ultimate_spell(target):
return f"💎 终极魔法攻击 {target}!"
print(heal_spell("勇士"))
print(ultimate_spell("魔王"))

生成器 - 魔法能量流

生成器是一种特殊的函数,它可以生成一系列的值,而不是一次性返回所有结果。 就像魔法能量的持续流动一样!

# 简单的生成器示例
def magic_potion_generator():
potions = ["生命药水", "魔法药水", "力量药水", "敏捷药水"]
for potion in potions:
yield f"🧪 制作了 {potion}"\div>
print(f"⚗️ {potion} 制作完成")
# 使用生成器
potion_maker = magic_potion_generator()
# 逐个获取生成的值
print(next(potion_maker)) # 🧪 制作了 生命药水
print(next(potion_maker)) # 🧪 制作了 魔法药水
print(next(potion_maker)) # 🧪 制作了 力量药水
print(next(potion_maker)) # 🧪 制作了 敏捷药水
# 无限生成器示例
def infinite_magic_power():
power = 1
while True:
yield f"⚡ 魔法力量等级 {power}"\div>
power += 1
# 使用无限生成器(注意要控制次数)
power_generator = infinite_magic_power()
for i in range(5):
print(next(power_generator))

魔法练习

🎯 练习:魔法计时器装饰器

创建一个装饰器,用于计算魔法咒语的施放时间:

# 魔法计时器装饰器
import time
def spell_timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
casting_time = end_time - start_time
print(f"⏱️ {func.__name__} 施放时间: {casting_time:.4f} 秒")
return result
return wrapper
# 测试魔法咒语
@spell_timer
def complex_spell():
time.sleep(0.1) # 模拟复杂咒语的施放
return "🌟 复杂魔法咒语施放成功!"
@spell_timer
def simple_spell():
return "✨ 简单魔法咒语施放成功!"
print(complex_spell())
print(simple_spell())

小猫的装饰器和生成器技巧

💡 小猫说:

  • 装饰器使用 @ 符号,放在函数定义之前
  • 生成器使用 yield 关键字,而不是 return
  • 装饰器可以叠加使用,形成多重魔法增强
  • 生成器可以节省内存,特别适合处理大量数据
  • 使用 functools.wraps 保留原函数的元数据
1.15

多线程和并发

多线程基础 - 并行魔法师

多线程允许程序同时执行多个任务,就像多个魔法师同时施展不同的魔法咒语一样! 在Python中,我们可以使用 threading 模块来实现多线程。

# 导入线程模块
import threading
import time
# 定义魔法师线程函数
def wizard_spell(wizard_name, spell_name, duration):
print(f"🧙‍♂️ {wizard_name} 开始施展 {spell_name}...")
time.sleep(duration)
print(f"✨ {wizard_name} 的 {spell_name} 施放完成!")
# 创建多个线程
threads = []
# 魔法师1:施展火球术
thread1 = threading.Thread(
target=wizard_spell,
args=("哈利", "火球术", 2)
)
threads.append(thread1)
# 魔法师2:施展治疗术
thread2 = threading.Thread(
target=wizard_spell,
args=("赫敏", "治疗术", 1)
)
threads.append(thread2)
# 魔法师3:施展防护罩
thread3 = threading.Thread(
target=wizard_spell,
args=("罗恩", "防护罩", 3)
)
threads.append(thread3)
# 启动所有线程
for thread in threads:
thread.start()
# 等待所有线程完成
for thread in threads:
thread.join()
print("🎉 所有魔法师都完成了他们的咒语!")

💡 小猫说:

多线程就像是雇佣了多个魔法助手,他们可以同时工作,大大提高了魔法施放的效率!

线程同步 - 魔法协调

当多个线程同时访问共享资源时,我们需要使用线程同步机制来避免冲突。 就像多个魔法师需要协调他们的魔法,避免相互干扰一样!

# 线程同步示例
import threading
# 共享的魔法能量池
magic_energy = 100
energy_lock = threading.Lock()
# 魔法师消耗能量的函数
def consume_energy(wizard_name, amount):
global magic_energy
with energy_lock:
if magic_energy >= amount:
print(f"🧙‍♂️ {wizard_name} 正在消耗 {amount} 点魔法能量")
magic_energy -= amount
print(f"💫 {wizard_name} 成功消耗能量,剩余能量: {magic_energy}")
else:
print(f"❌ {wizard_name} 能量不足,需要 {amount} 点,剩余 {magic_energy} 点")
# 创建多个魔法师线程
wizards = ["哈利", "赫敏", "罗恩", "邓布利多"]
threads = []
for wizard in wizards:
thread = threading.Thread(
target=consume_energy,
args=(wizard, 30)
)
threads.append(thread)
thread.start()
# 等待所有线程完成
for thread in threads:
thread.join()
print(f"🔮 最终剩余魔法能量: {magic_energy}")

线程池 - 魔法师公会

线程池是一种管理多个线程的机制,它可以重用线程,避免频繁创建和销毁线程的开销。 就像魔法师公会管理着一批专业的魔法师,随时准备执行任务!

# 线程池示例
from concurrent.futures import ThreadPoolExecutor
import time
# 魔法任务函数
def magic_task(task_name, difficulty):
print(f"🔮 开始执行任务: {task_name} (难度: {difficulty})")
time.sleep(difficulty)
result = f"✅ 任务 {task_name} 完成,获得 {difficulty * 10} 经验值"\div>
print(result)
return result
# 创建魔法任务列表
tasks = [
("收集魔法草药", 1),
("炼制魔法药水", 2),
("研究古代咒语", 3),
("击败邪恶巫师", 4),
("拯救魔法世界", 5)
]
# 使用线程池执行任务
with ThreadPoolExecutor(max_workers=3) as executor:
# 提交所有任务
futures = [executor.submit(magic_task, task[0], task[1]) for task in tasks]
# 获取结果
for future in futures:
result = future.result()
print(f"📜 任务结果: {result}")
print("🎊 所有魔法任务都已完成!")

魔法练习

🎯 练习:魔法战斗系统

创建一个多线程的魔法战斗系统,多个英雄同时攻击Boss:

# 魔法战斗系统
import threading
import time
import random
# Boss类
class Boss:
def __init__(self, name, hp):
self.name = name
self.hp = hp
self.max_hp = hp
self.lock = threading.Lock()
def take_damage(self, damage, attacker_name):
with self.lock:
if self.hp > 0:
self.hp -= damage
print(f"⚔️ {attacker_name} 对 {self.name} 造成了 {damage} 点伤害!")
print(f"❤️ {self.name} 剩余生命值: {self.hp}/{self.max_hp}")
if self.hp <= 0:
print(f"💀 {self.name} 被击败了!")
return True
return False
# 英雄类
class Hero:
def __init__(self, name, attack_power):
self.name = name
self.attack_power = attack_power
def attack(self, boss):
while boss.hp > 0:
damage = random.randint(self.attack_power - 5, self.attack_power + 5)
if boss.take_damage(damage, self.name):
break
time.sleep(0.5) # 攻击间隔
# 创建Boss和英雄
boss = Boss("邪恶龙王", 1000)
heroes = [
Hero("剑圣", 50),
Hero("法师", 40),
Hero("弓箭手", 35),
Hero("牧师", 30)
]
# 创建并启动英雄线程
threads = []
for hero in heroes:
thread = threading.Thread(target=hero.attack, args=(boss,))
threads.append(thread)
thread.start()
# 等待所有英雄完成攻击
for thread in threads:
thread.join()
print("🎉 战斗结束!")

小猫的多线程技巧

💡 小猫说:

  • 使用 threading.Lock() 保护共享资源,避免竞争条件
  • 线程池适合处理大量短任务,可以显著提高性能
  • Python的GIL(全局解释器锁)限制了CPU密集型任务的并行性
  • 对于CPU密集型任务,考虑使用 multiprocessing 模块
  • 使用 concurrent.futures 可以简化线程和进程管理