1. 程式人生 > >python全棧開發中級班全程筆記(第二模組、第三章)第4節 :函式進階

python全棧開發中級班全程筆記(第二模組、第三章)第4節 :函式進階

python全棧開發筆記第二模組

第三章4節:函式進階

一、函式進階

1、函式進階--名稱空間

  名稱空間,又稱名稱空間,或名字空間,就是存放變數名的地方比如 n = 1 , 1是存在記憶體的,但n 這個名字和繫結關係就儲存在名稱空間

  *名稱空間和作用域是有直接關係的,

   主要分三種:

    • locals : 是函式內的名稱空間,包括區域性變數和形參
    • globals : 全域性變數,函式定義所在模組的名字空間
    • builtins:內建模組的名字空間
    • 不同變數的作用域不同,就是由這個變數或函式所在的名稱空間決定的

  **作用域的範圍

    • 全域性變數:全域性存活,全域性有效
    • 區域性變數:臨時存活,區域性有效
        • 檢視作用域一般用 locals() 和 globls()方法

 

程式碼實現功能:
>>> n = 6
>>> locals()                #列印當前變數
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__
': <class '_frozen_importlib.BuiltinImporter'>,

'__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'n': 6} >>> globals() #列印全域性變數 {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter
'>,

'__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'n': 6} >>> dir(__builtins__) #列印內建模組的所有變數(注意使用語法,要先dir下再2個下劃線) ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError',
'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError',
'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError',
'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', #發現報錯的語法,還有內建函式等
'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError',
'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning',
'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning',
'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True',
'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning',
'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '_', '__build_class__', '__debug__', '__doc__', '__import__',
'__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable', 'chr',
'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit',
'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance',
'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord',
'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str',
'sum', 'super', 'tuple', 'type', 'vars', 'zip']

 

 

2、函式進階--作用域的查詢順序(空間

 

例:
n = 10
def func():                   # 定義一個巢狀函式
    n = 20
    print("func:",n)          # 每層以函式名做記號

    def func1():
        n = 30
        print("func1",n)

        def func2():
            print("func2:",n)

        func2()                #發現內兩層的結果一樣,如果沒有n = 30,會向上一層找到 n = 20 以此類推

    func1()                    #這就是查詢變數名由內而外的順序

func()

 

 

 

  **由此就存在一個查詢小規則

 

  • LEGB: 是查詢順序的英文首字母縮寫
  • L: locals(函式內的名字空間)
  • E: enclosing(相鄰外部前套函式的名字空間)
  • G: globals(全域性變數:函式所在模組的名字空間)
  • B: builtins(內建模組的名字空間)

3、函式進階--閉包

  閉包。是一個使用概念,或者說是一個規則,沒有專門的語和定義,   

 

舉例說明:

 

def func():
    n = 15
    def func2():
        print("func2:",n)
    return func2             # 返回記憶體地址
s = func()                   # 執行後也會返回記憶體地址,而不是執行效果
print(s)                     # 此時,正常來說,函式已經執行完,內部變數已釋放
s()                          # 現在我再看下s()*加括號表示會執行函式的執行程式,不加括號會列印記憶體地址
# 此時發現func2 的程式碼被執行 n 被列印,為什麼函式執行完已經釋放記憶體了,還能執行函式內的程式碼呢?
這種效果就叫閉包,返回內部函式的名稱,而在外部也拿到了頂層函式,
一旦頂部函式(func())裡有返回值,這個函式的記憶體就不會被釋放、
在外部可以執行函式內的值,並且可以用內部函式作用域內所有的值,這個現象就叫閉包,
函式內套子函式,子函式被返回了,反回了記憶體地址,
在外邊執行子函式的時候,子函式又引用了外層函式的變數,子函式與外部函式存在了互相引用的關係,這種引用關係就叫閉包