python 作用域

 示例:

a = 'alex'

def foo():
    name='ly'
    def lek():
        name='bk'
        def tt():
            print(name)
        return tt
    return lek

lek=foo()
print(lek)
tt=lek()
print(tt)
tt()

foo()()()

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()
  • 分析:从内到外,localmiddleouter,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函数,从而实现了计时功能。

装饰器的最佳实践:

  • 保持装饰器简单,易于理解。

  • 使用多层装饰器时,从内向外阅读逻辑。

  • 对于复杂逻辑,考虑将部分功能移到独立函数中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值