python之閉包函式及相關內容

2022-04-10 20:46:41 字數 3879 閱讀 7885

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

1、可以賦值

def func():

print('from func')

f=func

print(f,func)

f()

2、可以當做函式當做引數傳給另外乙個函式

def func():

print('from func')

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

# print(x)

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

3、可以當做函式當做另外乙個函式的返回值

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

return x # return func的記憶體位址

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

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

res()

4、可以當做容器型別的乙個元素

l=[func,]

# print(l)

l[0]()

dic=

print(dic)

dic['k1']()

函式物件應用示範:

def login():

print('登入功能')

def transfer():

print('轉賬功能')

def check_banlance():

print('查詢餘額')

def withdraw():

print('提現')

def register():

print('註冊')

func_dic=

# func_dic['1']()

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

1、函式的巢狀呼叫:在呼叫乙個函式的過程中又呼叫其他函式

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)

2、函式的巢狀定義:在函式內定義其他函式

def f1():

def f2():

pass

# 圓形

def circle(radius,action=0):

from math import pi

def perimiter(radius): # 求圓形的求周長:2*pi*radius

return 2*pi*radius

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

return pi*(radius**2)

if action == 0:

return 2*pi*radius

elif action == 1:

return area(radius)

circle(33,action=0)

1、大前提:

閉包函式=命名空間與作用域+函式巢狀+函式物件

核心點:名字的查詢關係是以函式定義階段為準

2、什麼是閉包函式

"閉"函式指的該函式是內嵌函式

"包"函式指的該函式包含對外層函式作用域名字的引用(不是對全域性作用域)

閉包函式:命名空間與作用域的應用+函式巢狀

def f1():

x = 33333333333333333333

def f2():

print(x)

f2()

x=11111

def bar():

x=444444

f1()

def foo():

x=2222

bar()

foo()

閉包函式:函式物件

def f1():

x = 33333333333333333333

def f2():

print('函式f2:',x)

return f2

f=f1()

# print(f)

# x=4444

# f()

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

# 傳參的方案二:

python之函式,閉包

引數 收集引數 引數名 def stu info print info 0 print info 1 print len info print type info stu shanxi 200008966 19 列印結果 shanxi 200008966 3 class tuple 返回值 def ...

python之閉包函式

def closure conf prefix def innerfunc name print prefix,name return innerfunc holiday closure conf 10月1日是 holiday 國慶節 print function name is holiday.n...

python之模組 包相關內容

在python中乙個.py檔案就是乙個模組,模組提高了 的可維護性。def add x,y print x y 模組越來越多,大家寫的模組名重複的概率就會比較大,為了合理的管理模組,引入了包 包是用來管理模組的,每個包下都有乙個 init py的檔案。匯入包的兩種方式 只有這兩種方法 不建議使用這樣...