函式物件,函式巢狀,命名空間,作用域,閉包函式

2022-08-28 13:48:12 字數 3632 閱讀 4282

一、函式物件

函式是第一類物件:值的記憶體位址可以像變數一樣去使用

def foo():#foo=函式的記憶體位址,可以當做一種變數值去使用

1、函式可以被引用

def foo():

print('hello')

f=foo

print(f)

f()2、可以當作引數傳遞

def foo():

print('hello')

def bar(x):

print(x)

x()bar(foo)

3.可以當做函式的返回值

def foo():

print('hello')

def func(x):

return(x)

f=func(foo)

print(f)

4.可以當做容器類的元素

def foo():

print('hello')

dic=

print(dic)

dic['1']()

def register():

print('註冊')

def login():

print('登入')

def pay():

print('支付')

def transfer():

print('轉賬')

dic_choice=

while true:

print('''

0 退出

1 註冊

2 登入

3 支付

4 轉賬

''')

choice=input('請輸入你的操作:').strip()

if choice == '0':break

if choice not in dic_choice:

print('輸入有誤,請重新輸入')

continue

dic_choice[choice]()

二.函式巢狀

#函式的巢狀呼叫:在乙個函式內部呼叫其他函式

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

#函式的巢狀定義:在函式內又定義了其他函式

from math import pi

def circle(radius,mode=0):

def perimiter(radius):

return 2 * pi * radius

def area(radius):

return pi * (radius ** 2)

if mode == 0:

return perimiter(radius)

elif mode == 1:

return area(radius)

circle(10,0)

三.命名空間

存放名字與值記憶體位址繫結關係的空間

命名空間的分類

內建命名空間 儲存直譯器自帶的一些名稱與值的對應關係

(python直譯器啟動時建立 所有**全部執行完畢 關閉直譯器時 銷毀)

print len max min

全域性命名空間

只要你的名字的定義是頂著最左邊寫的就在全域性空間

除了內建的函式內的 都在全域性中

(執行py檔案建立全域性命名空間 檔案執行結束 銷毀)

區域性命名空間 只要是函式內的名稱就是區域性的

(呼叫函式時建立 函式執行完畢就銷毀)

命名空間的載入順序

內建的 -> 全域性的 ->區域性的

名稱的查詢順序

區域性 -> 全域性的 -> 內建的

結論:1.查詢名字的位置是從當前位置往外查詢

2.命名空間的巢狀關係是在函式定義階段就固定死了,與呼叫位置無關

def outter():

x=1111

def inner():

print(x)

return inner

f=outter()

def foo():

x=2222

f()foo()

輸出的是1111

四.作用域(作用範圍)

域 指的是區域 範圍的的意思

全域性的命名空間和內建的命名空間 在使用上沒什麼區別

區域性的 和 全域性的內建的 就有區別了 區域性定義的只能在區域性使用

給三個空間劃分範圍:

全域性的和內建可以劃分為同乙個範圍

global 全域性作用域

區域性的單獨劃分為乙個範圍

local 區域性作用域

globals()

locals()

檢視全域性作用域中的內容

# print(dir(globals()['__builtins__']))

檢視區域性作用域中的內容 注意:在全域性中使用locals 看到的就是全域性的內容與globals沒有區別

print(globals())

print(locals())

age=18

def func():

age=19

print(age) #19

func()

print(age) #18

age=18

def func():

global age #明確宣告要使用全域性中的age

age=19

print(age) #19

func()

print(age) #19

a=1def func():

a=10

def inner():

a=100

print(a) #100

inner()

print('這是func中a',a) #這是func中a 10

func()

print(a) #1

a=1def func():

a=10

def inner():

nonlocal a #明確宣告要使用上一層中的a,如果上一層沒有則找上上層,但是注意不能找到全域性中

a=100

print(a) #100

inner()

print('這是func中的a',a) #這是func中的a 100

func()

print(a) #1

五.閉包函式

閉包函式 也是乙個函式

閉函式:該函式一定是定義在函式內的函式

包函式: 該內部函式包含對外層函式作用域名字的引用

為函式體傳值的解決方案:

①為函式體傳值的方案一:直接以引數的形式傳入

def f(x):

print(x)

f(10)

f(11)

②為函式體傳值的方案二:用閉包函式傳值

def outter(x):

def f():

print(x)

return f

fff=outter(10)

fff()

函式物件 命名空間 作用域

定義函式的三種方式 1.空函式 可以快速構建專案框架,使專案架構清晰明了 def func pass 2.無參函式 def func print from func 3.有參函式 def func x,y,args,kwargs pass 命名關鍵字引數 在函式定義階段 寫在 與 可變長引數之間的形...

函式的巢狀及命名空間 作用域

六.函式的巢狀 1.在函式內又呼叫了其他函式 def max2 x,y 兩個值比較 if x y return x else return yres max2 1,3 print res def max3 x,y,z 三個值比較 res1 max2 x,y res2 max2 res1,z retu...

函式物件,巢狀,命名空間與作用域

1 函式名可以被傳遞 2 函式名可以被當做引數傳遞給其餘函式 3 函式名可以當做函式的返回值 4 函式名可以當做容器型別的引數 例如 函式名可以被傳遞給變數 deffunc print test f func 變數名f指向函式的記憶體位址 通過該記憶體位址該變數可以找到函式對應的 塊 f 變數名f呼...