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