zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    MVC模式-----struts2框架(2)
    MVC模式-----struts2框架
    html的<h>标签
    jsp脚本元素
    LeetCode "Paint House"
    LeetCode "Longest Substring with At Most Two Distinct Characters"
    LeetCode "Graph Valid Tree"
    LeetCode "Shortest Word Distance"
    LeetCode "Verify Preorder Sequence in Binary Search Tree"
    LeetCode "Binary Tree Upside Down"
  • 原文地址:https://www.cnblogs.com/yorkyu/p/10297787.html
Copyright © 2011-2022 走看看