函式物件 巢狀和閉包函式

2022-07-01 06:48:14 字數 4767 閱讀 5009

精髓:可以把函式當成變數去用

# func=記憶體位址

def func():

print('from func')

f=func # 函式func賦值給變數f

print(f,func) # 列印f和func的記憶體位址,完全相同

f() # 相當於呼叫了函式func()

輸出:func at 0x02f434a8> from func

def func():

print('from func')

def foo(x): # x = func的記憶體位址

print(x) # 列印func的記憶體位址,完全相同

x() # 相當於呼叫了函式func()

foo(func) # foo(func的記憶體位址)

輸出:func at 0x02f434f0>

from func

def func():

print('from func')

def foo(x): # x=func的記憶體位址

return x # return func的記憶體位址

res=foo(func) # foo(func的記憶體位址)

print(res) # res=func的記憶體位址

res() # 相當於呼叫了函式func()

輸出:func at 0x02fb34f0>

from func

def func():

print('from func')

l=[func,] # 把func當作列表的乙個元素

print(l) # 輸出列表l

l[0]() # l[0]=func,l[0]()相當於呼叫了函式func()

dic= # 把func當作字典dic第乙個key'k1'的值

print(dic) # 輸出字典dic

dic['k1']() # dic['k1']=func,dic['k1']()相當於呼叫了函式func()

輸出:from func

from func

def exit():

break

def login():

print('登入功能')

def transfer():

print('轉賬功能')

def check_banlance():

print('查詢餘額')

def withdraw():

print('提現')

def register():

print('註冊')

func_dic=

while true:

print("""

0 退出

1 登入

2 轉賬

3 查詢餘額

4 提現

5 註冊

""")

choice = input('請輸入命令編號:').strip()

if not choice.isdigit():

print('必須輸入編號,傻叉')

continue

if choice == '0':

break

if choice in func_dic:

func_dic[choice]()

else:

print('輸入的指令不存在')

# if choice == '1':

# login()

# elif choice == '2':

# transfer()

# elif choice == '3':

# check_banlance()

# elif choice == '4':

# withdraw()

# else:

# print('輸入的指令不存在')

def login():

print('登入功能')

def transfer():

print('轉賬功能')

def check_banlance():

print('查詢餘額')

def withdraw():

print('提現')

def register():

print('註冊')

func_dic =

while true:

for k in func_dic:

print(k, func_dic[k][0])

choice = input('請輸入命令編號:').strip()

if not choice.isdigit():

print('必須輸入編號,傻叉')

continue

if choice == '0':

break

if choice in func_dic:

func_dic[choice][1]()

else:

print('輸入的指令不存在')

def max2(x,y):

if x > y:

return x

else:

return y

def max4(a,b,c,d):

res1=max2(a,b) # 第一步:比較a,b得到res1

res2=max2(res1,c) # 第二步:比較res1,c得到res2

res3=max2(res2,d) # 第三步:比較res2,d得到res3

return res3

res=max4(1,2,3,4)

print(res)

輸出:4

def f1():

def f2():

pass

# 圓形

# 求圓形的求周長:2*pi*radius

def circle(radius,action=0):

from math import pi

def perimiter(radius):

return 2*pi*radius

# 求圓形的求面積:pi*(radius**2)

def area(radius):

return pi*(radius**2)

if action == 0:

return 2*pi*radius

elif action == 1:

return area(radius)

circle(33,action=0)

def f1():

x = 33333333333333333333

def f2():

print(x)

f2()

x=11111

def bar():

x=444444

f1()

def foo():

x=2222

bar()

foo()

輸出:33333333333333333333

思路:呼叫的是函式foo(),函式foo()內的x=2222未被呼叫,呼叫了函式bar()

函式bar()內的x=444444未被呼叫,呼叫了函式f1()

函式f1()內定義了x,定義了函式f2(),函式f2()內輸出x

函式f2()內未定義x,就去f1()中,找到了x=33333333333333333333

最後函式f1()呼叫了函式f2(),輸出33333333333333333333

def f1():

x = 33333333333333333333

def f2():

print('函式f2:',x)

return f2

f=f1() # 呼叫f1(),返回函式f2(),輸出:函式f2:33333333333333333333

def foo():

x=5555

f()foo() # 呼叫foo(),foo()內呼叫了f(),也就是呼叫了f2,輸出:函式f2:33333333333333333333

輸出:函式f2: 33333333333333333333

def f2(x):

print(x)

f2(1)

f2(2)

f2(3)

輸出:123

def f1(x): # x=3

# x=3

def f2():

print(x)

return f2

x=f1(3)

print(x)

x()輸出:

.f2 at 0x02f734a8>

3

函式物件 函式巢狀和閉包函式

函式物件指的是函式可以被當做 資料 來處理,具體可以分為四個方面的使用,如下 func 記憶體位址 deffunc print from func 1 可以賦值 f func 將函式的記憶體位址繫結給f print f,func f 記憶體位址加 呼叫函式 2 可以當做函式當做引數傳給另外乙個函式 ...

物件 巢狀和閉包函式

func 記憶體位址 def func print from func f func print f,func f def foo x x func的記憶體位址 print x x func foo func foo func的記憶體位址 def foo x x func的記憶體位址 return ...

python函式巢狀閉包 閉包與巢狀函式

沒有區別,因為沒有閉合函式,不是真的。有closures,但這一術語指的是在外部和內部範圍中儲存變數的技術。只剩下巢狀函式。在 巢狀函式只是在另乙個函式內部定義的函式 def outer def inner 當outer 定義了乙個inner 然後也使用的名稱,則該變數名稱為閉包單元,儲存在inne...