第 13 函式巢狀,命名空間與作用域,閉包函式

2021-10-07 07:33:25 字數 4289 閱讀 4321

目錄

一.函式巢狀

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,...