1. 局部(Local)的魔法圈
def spell():
potion = "魔法药水" # 我是局部变量
print(potion)
spell()
- 解密:
potion
在函数spell
内部诞生,外界不可见,这就是局部作用域的魔力。
2. 环境(Enclosing)的迷雾森林
def forest():
secret = "隐藏的秘密"
def grove():
print(secret) # 我能看见森林的秘密
grove()
forest()
- 小知识:
grove
函数嵌套在forest
中,可以访问forest
的变量,这就是封闭作用域。
3. 全局(Global)的星空
galaxy = "宇宙"
def stargaze():
print(galaxy) # 星空,我来了!
stargaze()
- 解释:
galaxy
定义在函数外,属于全局变量,任何地方都能仰望这片星空。
4. 布尔陷阱:global关键字
def change_universe():
global galaxy # 告诉Python,我要修改全局的星星
galaxy = "新的宇宙"
change_universe()
print(galaxy) # 宇宙已变?
- 注意:使用
global
关键词,可以在函数内改变全局变量,但请谨慎使用,以免引起混乱。
5. Built-in(内置):Python的藏宝库
print(len("秘密")) # len是内置函数,宝藏之一
- 快记:内置作用域,Python预先准备好的工具箱,随时可用。
6. 案例实战:变量遮挡的误会
x = "外面的世界"
def mystery():
x = "内心的独白" # 遮挡了外面的x
print(x)
mystery()
print(x) # 这两个x,不是同一个世界
- 警告:局部变量会遮挡同名的全局变量,别让名字混淆了你的视线。
7. 寻找宝藏:LEGB实战
outer = "外围区域"
def outer_function():
middle = "中间地带"
def inner_function():
local = "核心机密"
print(local)
print(middle)
print(outer)
inner_function()
outer_function()
- 分析:从内到外,
local
→middle
→outer
,LEGB规则大显神威。
8. 隐藏通道:nonlocal关键字
def create_maze():
path = "起点"
def reveal_path():
nonlocal path # 指明我要修改外面的path
path = "终点"
reveal_path()
print(path) # 从起点到终点
create_maze()
- 破解:在嵌套函数里,用
nonlocal
可以修改最近一层非全局的变量。
9. 多层嵌套的迷宫
def maze():
clue1 = "第一关"
def next_clue():
clue2 = "第二关"
def final_clue():
print(clue1, clue2) # 穿越迷宫
final_clue()
next_clue()
maze()
- 挑战:理解每层变量的可见性,就像解开迷宫的线索。
10. 遗忘之地:未初始化的变量
def lost():
print(unknown) # 等待发现的错误
# 运行这段代码,你会遇到一个变量未定义的错误
- 提醒:确保变量在使用前已被定义,避免踏入未知的遗忘之地。
11. 实战:模拟银行账户
balance = 1000
def deposit(amount):
global balance # 修改全局余额
balance += amount
print(f"存款后余额:{balance}")
deposit(500)
- 应用:通过全局变量管理状态,但记得这是个特例,通常应避免过度使用全局变量。
12. 结语:掌握LEGB,编写清晰代码
- 总结:理解LEGB规则,就像拥有了透视代码的超能力,让你的Python程序结构更加清晰,逻辑更加严谨。每个案例都是你通往代码大师之路的一步石,继续探索,你会发现更多的奇迹。
深入理解:闭包与装饰器
闭包(Closure)的魔法
闭包是Python中一个非常强大的特性,它允许内部函数记住并访问外部函数的变量,即使外部函数已经执行完毕。
实战案例:记忆函数
def remember_last_number(last=0):
def tell_me():
return last
return tell_me
memory = remember_last_number(42)
print(memory()) # 输出:42
-## 解析:remember_last_number
返回了一个闭包tell_me
,这个闭包记住了last
的值。即使remember_last_number
执行结束,last
的值仍然被闭包保留。
🎯## 闭包的应用场景:缓存计算结果、创建带状态的函数等。
装饰器(Decorator):优雅的代码增强
装饰器是闭包的一种应用,它用于在不修改原有函数定义的情况下,给函数添加额外的功能。
实战案例:计时装饰器
import time
def timer_decorator(func):
def wrapper(*args,## kwargs):
start_time = time.time()
result = func(*args,## kwargs)
end_time = time.time()
print(f"{func.__name__} took {end_time - start_time} seconds.")
return result
return wrapper
@timer_decorator
def example_function():
time.sleep(1)
example_function()
-## 解析:@timer_decorator
语法糖将example_function
传递给timer_decorator
,返回的新函数替换了原函数。当调用example_function
时,实际上是执行了wrapper
函数,从而实现了计时功能。
装饰器的最佳实践:
- 保持装饰器简单,易于理解。
- 使用多层装饰器时,从内向外阅读逻辑。
- 对于复杂逻辑,考虑将部分功能移到独立函数中。
小结
通过这些深入的实践和概念探讨,你不仅掌握了Python的LEGB规则,还解锁了闭包和装饰器的高级应用。这些工具不仅提升了代码的灵活性和可维护性,也是Python编程魅力的一部分。