page contents

Python函数作用域揭秘:掌握LEGB规则的12个实战案例!

本文讲述了python函数作用域揭秘:掌握LEGB规则的12个实战案例!具有很好的参考价值,希望对大家有所帮助。一起跟随好学星城小编过来看看吧,具体如下:

attachments-2024-06-Hfo0xgQt66766442a0561.jpg本文讲述了python函数作用域揭秘:掌握LEGB规则的12个实战案例!具有很好的参考价值,希望对大家有所帮助。一起跟随好学星城小编过来看看吧,具体如下:

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编程魅力的一部分。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2024-06-22 13:42
  • 阅读 ( 50 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
小柒
小柒

1312 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1312 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章