[Python3] 020 借函数,谈一谈变量的作用域
目錄
- 1. 概述
- 2. 分類
- 3. 變量的作用范圍
- 少廢話,上例子
- 4. 將局部變量提升為全局變量
- 少廢話,上例子
- 5. 內建函數 globals() 與 locals()
- 少廢話,上例子
- 6. 邪惡的 eval() 與 執行者 exec()
- (1) eval()
- (2) exec()
- 7. 遞歸函數
- (1) 概述
- (2) 少廢話,上例子
1. 概述
- 從“變量作用域”這個詞不難看出:變量有作用范圍限制
2. 分類
- 按照作用域分類
3. 變量的作用范圍
- 全局變量:在整個全局范圍都有效
- 全局變量在局部可以使用(即,在函數內部可以使用在函數外部定義的變量)
- 局部變量:僅在特定的局部范圍內有效
- 局部變量在出了自己的范圍后就無法使用
- LEGB 原則
- L(Local)局部作用域
- E(Enclosing function locale)外部嵌套函數作用域
- G(Global module)函數定義所在模塊作用域
- B(Builtin):python 內置模塊的作用域
- LEGB 規定了查找一個名稱的順序為:local-->enclosing function locals-->global-->builtin
少廢話,上例子
# 例1num1 = 100 # 全局變量def func():print("num1 =", num1)num2 = 99 # 局部變量print("num2 =", num2)return Noneprint("num1 =", num1) func() print("num2 =", num2)- 運行結果
num1 = 100
num1 = 100
num2 = 99
---------------------------------------------------------------------------
NameError……name 'num2' is not defined
4. 將局部變量提升為全局變量
- 使用 global
少廢話,上例子
# 例2def func():global num1num1 = 100print("num1 =", num1)num2 = 99print("num2 =", num2)return Nonefunc() print("num1 =", num1)- 運行結果
num1 = 100
num2 = 99
num1 = 100
5. 內建函數 globals() 與 locals()
- 通過 globals() 和 locals() 可以顯示出全局變量和局部變量
少廢話,上例子
# 例3num1 = 1 num2 = 2def func(n1, n2):n3 = 666print("Local s= {0}".format(locals()))print("Globals = {0}".format(globals()))return Nonefunc(11, 22)- 運行結果
Locals = {'n1': 11, 'n2': 22, 'n3': 666}
Globals = {'name': 'main', 'doc': None, 'package': None, 'loader': <_frozen_importlib_external.SourceFileLoader object at 0x000001C21D86E940>, 'spec': None, 'annotations': {}, 'builtins': <module 'builtins' (built-in)>, 'file': '.\globals & locals.py', 'cached': None, 'num1': 1, 'num2': 2, 'func': <function func at 0x000001C21D82C2F0>}
6. 邪惡的 eval() 與 執行者 exec()
(1) eval()
- 把一個字符串當成一個表達式來執行, 返回表達式執行后的結果
- 示例
- 運行結果
300
300
(2) exec()
- 跟 eval() 功能類似, 但 exec() 不返回結果
- 示例
- 運行結果
num1 + num2 = 300
300
None
7. 遞歸函數
(1) 概述
- 簡單地說,就是“我調用我自己”
- 優點:簡潔,容易理解
- 缺點:對遞歸深度有限制,消耗資源大
- python 對遞歸深度有限制,超過限制報錯
- 也可以手動更改遞歸深度
- 寫遞歸程序時,要注意結束條件
(2) 少廢話,上例子
# 例6 錯誤示范num = 0def func(): # 會暴走的global numnum += 1print(num)func() # 調用自己return Nonefunc()- 運行結果
先是像 excel 一樣,縱向數字累加,然后拋出異常。
RecursionError……maximum recursion depth exceeded while calling a Python object
遞歸錯誤:調用 python 對象時超過了最大遞歸深度。
# 例7 斐波那契額數列 # 數學公式為: f(1) = 1, f(2) = 1, ... f(n) = f(n-1) + f(n-2)def fib(n): # n 表示斐波那契數列的第 n 個數if n == 1 or n ==2: # or 表示或者return 1return fib(n-1) + fib(n-2)print(fib(10))
- 運行結果
55
轉載于:https://www.cnblogs.com/yorkyu/p/10297787.html
總結
以上是生活随笔為你收集整理的[Python3] 020 借函数,谈一谈变量的作用域的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: u盘中的io错误是怎么回事 U盘出现IO
- 下一篇: Python爬取js动态添加的内容