目錄
一.函式巢狀
1.函式巢狀定義:在乙個函式內又定義了另外乙個函式
2.函式巢狀呼叫:
3.區域性命名空間:函式內的名字
示範2:站在區域性進行查詢
示範3:
示範4:
注意:示範5:
3.作用域
4.函式的引數傳遞是值拷貝
示範1:對全域性定義的不可變型別,不可以在函式內直接修改
示範2:對全域性定義的可變型別,可以在函式內直接修改
示範3:在函式內修改全域性的不可變型別(global)
示範4:nonlocal(了解)
三.閉包函式
為函式體**傳參的方式有兩種
方式1:直接通過引數的方式傳入
方式二:使用閉包函式
示例1:
def f1():
def f2():
print('from f2')
f2()
x=111111
return x
f1()
res=f1()
print(res)
示例2:
def f1():
def f2():
print('from f2')
return f2
res = f1()
print(res) # .f2 at 0x000001f21feed550>
res() # from f2
示例3:
import math
def circle(radius,mode):
def perimeter(radius):
return 2 * math.pi * radius
def area(radius):
return math.pi * (radius ** 2)
if mode == 1:
return perimeter(radius)
elif mode == 2:
return area(radius)
print(circle(18,1))
print(circle(18,2))
在呼叫乙個函式的過程中又呼叫了其他函式
def max2(x,y):
if x > y :
return x
else:
return y
def max4(a,b,c,d):
res1=max2(a,b)
res2=max2(res1,c)
res3=max2(res2,d)
return res3
print(max4(1,2,3,4))
二.命名空間與作用域
(1)命名空間就是存放名字的地方
1.內建命名空間:
存放的是python直譯器自帶的名字,如len,print,input
生命週期:直譯器啟動則建立,直譯器關閉就銷毀
2.全域性命名空間:
內建以及函式內的名字之外的都存放與全域性命名空間中
生命週期:執行頂級**/主流水線建立,頂級**/主流水線結束則銷毀
x = 10
y = 12
## foo=記憶體位址
def foo(): #foo本身也是全域性的
z = 11
#f1=記憶體位址
def f1():
pass
if true:
aaa = 33
生命週期:函式呼叫時則建立,函式呼叫完畢則立即銷毀
input = 33
def f1():
input=444
f1()
print(input)
def f1():
input=4444
print(input)
input=333
f1()
def f1():
#input = 444
print(input)
def f2():
#input = 555
print(input)
input = 333
f1() # 333
f2() # 333
def f1():
input = 444
def inner():
input = 555
print(input)
inner()
input = 333
f1() # 555
命名空間的』巢狀關係』是函式定義階段,也就是檢測語法的時候就確定的,與呼叫無關
x = 111
def f1():
print(x)
def f2():
x = 222
f1()
f2()
def f3():
print(x)
x = 3333
x = 222
f3() # 報錯 local variable 'x' referenced before assignment
全域性作用域:內建命名空間,全域性命名空間
全域性存活,全域性有效
區域性作用域:區域性命名空間
臨時存活,區域性有效
x = 10
def func(a):# a = 10的記憶體位址
a = 123
func(x) # x = 10的記憶體位址
print(x) # 10
x =
def func(a): # a=的記憶體位址
a = 123
func(x) # x=列表的記憶體位址
print(x) #[1111]
global:
如果函式外部有這個全域性變數,在函式內部使用global關鍵字,可以修改全域性變數,
如果函式外部沒有這個全域性變數,在函式內部使用global,可以定義全域性變數
x = 10
l =
def func():
global x
x = 666
func()
print(x) # 666
print(l) # [11111]
nonlocal:關鍵字,專門用來修改當前作用域上一級的區域性變數,遵循legb原則
x = 10
def f1():
x = 11
def f2():
#global x
nonlocal x
x = 666
f2()
print('f1內的x===>',x) # f1內的x===> 666
f1()
print(x) # 10
內函式使用了外函式的區域性變數,外函式將內函式返回出來的過程,叫做閉包,
裡面的函式叫做閉包函式
特點:內函式使用了外函式的區域性變數,該區域性變數與內函式發生繫結,
延長該變數的生命週期
閉包函式=函式物件+函式巢狀定義+命名空間與作用域
閉: 指的是定義函式內的函式
包:指的是內函式引用了外函式的變數
def outter():
x = 111
def inner():
print(x)
return inner # 這裡不能加括號
f = outter()
print(f)
def f3():
x = 222
f()f3()
def func(x):
print(x)
func(1)
func(2)
func(3)
def outter(x):
# x = 2
def func():
print(x)
return func
f1=outter(1)
f2=outter(2)
f3=outter(3)
f1()
f2()
f3()
函式物件,巢狀,命名空間與作用域
1 函式名可以被傳遞 2 函式名可以被當做引數傳遞給其餘函式 3 函式名可以當做函式的返回值 4 函式名可以當做容器型別的引數 例如 函式名可以被傳遞給變數 deffunc print test f func 變數名f指向函式的記憶體位址 通過該記憶體位址該變數可以找到函式對應的 塊 f 變數名f呼...
13 命名空間與作用域
一 命名空間 命名空間即存放名字與物件對映 繫結關係的地方。比如說,x 3,python會申請記憶體空間存放物件3,然後將名字x與3的繫結關係存放於命名空間中,del x表示清除該繫結關係。在程式執行期間最多會存在三種命名空間 二 命名空間的載入順序 python test.py 1 python直...
函式的巢狀,命名空間以及作用域
引入函式相關的了解部分 命名關鍵字引數 在函式定義階段 寫在 與 可變長引數之間的形參 在給命名關鍵字引數傳值的時候 只能用關鍵字為其傳值 在定義階段 給你感覺好像是z是預設值引數 放在了m這個位置引數的前面了 應該報錯 其實z和m都是命名關鍵字引數 不是預設值引數和位置引數 def func x,...