函數(shù)是第一類(lèi)對(duì)象
函數(shù)名可以被引用
函數(shù)名可以當(dāng)作參數(shù)使用
函數(shù)名可以當(dāng)作返回值使用
函數(shù)名可以當(dāng)作容器類(lèi)型的元素
嵌套調(diào)用:在函數(shù)內(nèi)部中調(diào)用函數(shù)
嵌套定義:在函數(shù)內(nèi)部中定義函數(shù)
存放變量名稱的空間,分為內(nèi)置名稱空間、全局名稱空間、局部名稱空間
內(nèi)置名稱空間:python中,提前定義的名字,存在內(nèi)置名稱空間中。例如:關(guān)鍵字、內(nèi)置方法
全局名稱空間:存放于文件級(jí)別的名字,就是全局名稱空間
if / while / for 內(nèi)部定義的名字,在執(zhí)行之后都存放于全局名稱空間python教程
# if 的示例:var = 4if var > 5: var = "var 大于5"else: var = "var 小于等于5"print(var) # 打印結(jié)果:var 小于等于5# while 的示例:num = 0while num <= 3: num += 1print(num) # 打印結(jié)果:4# for 的示例for i in range(2): passprint(i) # 打印結(jié)果:1
局部名稱空間:函數(shù)內(nèi)部定義的所有名字都是存放于當(dāng)前函數(shù)的內(nèi)置名稱空間
如果想訪問(wèn)一個(gè)變量值,必須先訪問(wèn)對(duì)應(yīng)的名稱空間,獲取到該變量的名稱以及名稱和值內(nèi)存地址之間的關(guān)系。
內(nèi)置名稱空間:python 解釋器啟動(dòng)時(shí)生效,關(guān)閉時(shí)失效
全局名稱空間:當(dāng)前python文件執(zhí)行生效,執(zhí)行結(jié)束后失效
局部名稱空間:函數(shù)調(diào)用時(shí)生效,函數(shù)體代碼結(jié)束時(shí)失效
局部名稱:局部 → 全局 → 內(nèi)置函數(shù)
全局名稱:全局 → 內(nèi)置
內(nèi)置再找不到就會(huì)報(bào)錯(cuò)
函數(shù)內(nèi)部使用的名字,在定義階段已經(jīng)規(guī)定死了,與調(diào)用位置無(wú)關(guān)
全局作用域:全局可以調(diào)用的名字存在于全局作用域。內(nèi)置名稱空間和全局名稱空間屬于此處
局部作用域:局部可以調(diào)用的名字存在于局部作用域。局部名稱空間屬于此處
global:將局部名稱空間的變量聲明成全局變量
注意:global需要在函數(shù)內(nèi)部聲明,若在函數(shù)外聲明,則函數(shù)依然無(wú)法操作
# 這種情況不能修改x1的值x1 = 1def func1(): x1 = 2func1()print(x1) # 打印結(jié)果:1# 使用global 后,可以修改x2的值x2 = 1def func2(): global x2 # 先聲明成全局變量 x2 = 2func2()print(x2) # 打印結(jié)果:2# global 若在函數(shù)外聲明,無(wú)法操作變量global x3x3 = 1def func2(): x3 = 2func3()print(x3) # 打印結(jié)果:1
nonlocal:在局部名稱空間聲明局部變量。
nonlocal 聲明后的變量會(huì)從當(dāng)前函數(shù)的外層函數(shù)開(kāi)始一層層去查找該變量。若是一直到最外層函數(shù)都找不到,則會(huì)拋出異常。
def f3(): x = 4 def f1(): y = 2 def f2(): nonlocal x x = 3 f2() # 調(diào)用f2(),修改f1作用域中名字x的值 print(x) # 在f1作用域查看x。打印結(jié)果:3 f1() print(x) # 打印結(jié)果:3f3()
def f3(): x = 4 def f1(): x = 2 def f2(): nonlocal x x = 3 f2() # 調(diào)用f2(),修改f1作用域中名字x的值 print(x) # 在f1作用域查看x。打印結(jié)果:3 f1() print(x) # 打印結(jié)果:4f3()
聯(lián)系客服