• 020 函数之变量的作用域


    简介

    • 变量有作用范围限制

    分类

    • 按作用域可分为两类
      1. global: 全局变量,在函数外部定义
      2. local: 局部变量,在函数内部定义

    变量的作用范围

    • 全局变量
      • 在整个全局范围都有效
      • 全局变量在局部可以使用
      • 即,在函数内部可以使用在函数外部定义的变量
    • 局部变量
      • 仅在特定的局部范围内有效
      • 局部变量在出了自己的范围后就无法使用
    • LEGB 原则
      • 查找一个名称的顺序:local > enclosing function locals > global > builtin
      • L(Local) 局部作用域
      • E(Enclosing function locale) 外部嵌套函数作用域
      • G(Global module) 函数定义所在模块作用域
      • B(Builtin) Python 内置模块的作用域

    例1

    num1 = 100  # 全局变量
    
    def func():
        print("num1 =", num1)
    
        num2 = 99  # 局部变量
        print("num2 =", num2)
    
    
    print("num1 =", num1)
    func()
    print("num2 =", num2)
    

    >>>

    num1 = 100
    num1 = 100
    num2 = 99
    Traceback (most recent call last):
      File "main.py", line 13, in <module>
        print("num2 =", num2)
    NameError: name 'num2' is not defined
    

    例2

    • 使用 global 将局部变量提升为全局变量
    def func():
        global num1
        num1 = 100
        num2 = 99
        print("num1 =", num1)
        print("num2 =", num2)
    
    
    func()
    print("num1 =", num1)
    

    >>>

    num1 = 100
    num2 = 99
    num1 = 100
    

    globals() 与 locals()

    • 通过 globals()locals() 可以显示出全局变量和局部变量
    num1, num2 = 1, 2
    
    
    def func(n1, n2):
        n3 = 666
        print("Locals = {}".format(locals()))
        print("Globals = {}".format(globals()))
        
        
    func(11, 22)
    

    >>>

    Locals = {'n1': 11, 'n2': 22, 'n3': 666}
    Globals = {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000018A4BFA0B20>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'main.py', '__cached__': None, 'num1': 1, 'num2': 2, 'func': <function func at 0x0000018A4BFA51F0>}
    

    eval() 与 exec()

    • eval() 可以把一个字符串当成一个表达式来执行,并返回结果
    • exec()eval() 类似,但不返回结果
    >>> eval("1 + 2")
    3
    >>> 
    >>> exec("1 + 2")
    >>> exec("print(1)")
    1
    >>> 
    

    递归函数

    简介

    • 简单地说,就是“我调用我自己”
    • 优点:简洁,容易理解
    • 缺点:对递归深度有限制,消耗资源大
    • Python 对递归深度有限制,超过限制会抛出异常,不过可以手动更改递归深度
    • 写递归程序时,要注意结束条件

    例1

    def func(num):
        print(num)
        func(num + 1)  # 调用自己
    
    
    func(1)
    

    >>>

    1
    2
    3
    ...
    995
    996
    Traceback (most recent call last):
      File "main.py", line 6, in <module>
        func(0)
      File "main.py", line 3, in func
        func(num + 1)  # 调用自己
      File "main.py", line 3, in func
        func(num + 1)  # 调用自己
      File "main.py", line 3, in func
        func(num + 1)  # 调用自己
      [Previous line repeated 993 more times]
      File "main.py", line 2, in func
        print(num)
    RecursionError: maximum recursion depth exceeded while calling a Python object
    
    • 这个深度有点意思

    例2

    def fib(n):
        if n <= 2:
            return 1
        return fib(n - 1) + fib(n - 2)
    
    
    print(fib(10))  # 55
    
  • 相关阅读:
    如何使用Total Recorder录制软件发出的声音
    火狐浏览器Firefox如何使用插件,火狐有哪些好用的插件
    [Tools] Create a Simple CLI Tool in Node.js with CAC
    [Unit Testing] Mock a Node module's dependencies using Proxyquire
    [SCSS] Create a gradient with a Sass loop
    [Algorithm] Heap data structure and heap sort algorithm
    [Debug] Diagnose a Slow Page Using Developer Tools
    [Tools] Deploy a Monorepo to Now V2
    [PWA] Add Push Notifications to a PWA with React in Chrome and on Android
    [Algorithms] Using Dynamic Programming to Solve longest common subsequence problem
  • 原文地址:https://www.cnblogs.com/yorkyu/p/10297787.html
Copyright © 2020-2023  润新知