物件 巢狀和閉包函式

2022-03-18 22:09:25 字數 3703 閱讀 2542

# 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 x # return func的記憶體位址

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

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

res()

l=[func,]

# print(l)

l[0]()

dic=

print(dic)

dic['k1']()

#簡單的atm功能

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('輸入的指令不存在')

#簡單優化版

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 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)

res2=max2(res1,c)

res3=max2(res2,d)

return res3

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

print(res)

​ 在函式內定義其他函式

def f1():

def f2():

pass

# 圓形

def circle(radius,action=0):

from math import pi

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

def perimiter(radius):

return 2*pi*radius

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

def area(radius):

return pi*(radius**2)

if action == 0:

return perimiter(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

def f1():

x = 33333333333333333333

def f2():

print('函式f2:',x)

return f2

f=f1()

print(f)# .f2 at 0x000001c757f1a430>

x=4444

f() # '函式f2:33333333333333333333

def foo():

x=5555

f()foo()

兩種為函式體傳參的方式:

方式一:直接把函式體需要的引數定義成形參

def f2(x):

print(x)

f2(1)

f2(2)

f2(3)

方式二:閉包函式

def f1(x): # x=3

x=3def f2():

print(x)

return f2

x=f1(3)

print(x)

x()

import requests

# 傳參的方案一:

def get(url):

response=requests.get(url)

print(len(response.text))

get('')

get('')

get('')

# 傳參的方案二:

函式物件 巢狀和閉包函式

精髓 可以把函式當成變數去用 func 記憶體位址 def func print from func f func 函式func賦值給變數f print f,func 列印f和func的記憶體位址,完全相同 f 相當於呼叫了函式func 輸出 func at 0x02f434a8 from func...

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

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

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

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