閉包函式
閉包函式的定義:
如果內函式使用了外函式的區域性變數
並且外函式把內函式返回出來的過程 叫做閉包
裡面的內函式是閉包函式
乙個簡單的閉包函式示例:
defsongyunjie_family():
father = "
王健林"
deff_hobby():
print("
這是我爸爸{}
".format(father)) #
內函式使用了外函式的區域性變數father
return f_hobby #
外函式把內函式返回出來了
複雜的閉包函式(多層)
defmashengping_family():
father = "馬雲"
jiejie = "馬蓉"
meimei = "馬諾"
money =1000
defjiejie():
nonlocal money
money-=700
print("
還剩下{}元
".format(money))
defmeimei():
nonlocal money
money-=200
print("
還剩下{}元
".format(money))
defbig_master():
return
(jiejie,meimei)
return
big_master
func =mashengping_family()
print(func) #
.big_master at 0x000001f4cb0f5620>
#返回的是元組
tup =func()
print(tup) #
(.jiejie at 0x0000013d5b175158>, .meimei at 0x0000013d5b175268>)
#獲取姐姐
jiejie =tup[0]
#獲取妹妹
meimei = tup[1]
#big_master 是閉包函式,是直接被mashengping_family返回出來的
#jiejie,meimei 是通過big_master間接被返回到函式外面的
#呼叫妹妹
meimei() #
還剩下800元
#呼叫姐姐
jiejie() #
還剩下100元
#獲取閉包函式所使用的變數 __closure__
res = func.__closure__
print(res) #
(, )
#cell_contents 用來獲取單元格物件當中的閉包函式
jiejie = res[0].cell_contents #
.jiejie at 0x0000019161005158>
meimei = res[1].cell_contents #
.meimei at 0x0000019161005268>
i = jiejie.__closure__[0] #
j = meimei.__closure__[0] #
a = jiejie.__closure__[0].cell_contents #
100b = meimei.__closure__[0].cell_contents #
100
閉包的特徵
內函式使用了外函式的區域性變數
那麼該變數與閉包函式發生繫結
延長該變數的生命週期
defouter(val):
definner(num):
return val+num
return
inner
func = outer(10) #
func = inner
res = func(15) #
res = func(15) =inner(15)
print(res) #
25"""
10實參-->val形參
因為內函式inner是閉包函式 使用了外函式val
那麼該變數val生命週期被延長 沒有隨著函式呼叫的結束而釋放
res = inner(15) => return val+num =>10+15 =>25
"""
閉包的意義
閉包的意義:閉包可以優先使用外函式中的變數,並對閉包中的值起到了封裝保護的作用,外部無法訪問
#模擬滑鼠點選次數
num =0
defclick_num():
global
num num += 1
(num)
click_num() #1
click_num() #
2click_num() #
3num = 100click_num()
#101
click_num() #
102'''
很顯然,這樣是不行的,定義了全域性變數100後,值就從100開始加了.
想乙個辦法,讓其就算在中間插入num=100也沒用
'''#
解決方案
defclick_num():
num=0
deffunc():
nonlocal num
num+=1
(num)
return
func
func =click_num()
func() #1
func() #
2num = 1000func() #3
func() #
4func() #
5
匿名函式
匿名函式 : 用一句話來表達只有返回值的函式
語法:lambda 引數 : 返回值
目的:追求**:簡潔,高效
1.無參的lambda 表示式
#1.無參的lambda 表示式
deffunc():
return
"123"#
改寫func = lambda : "
123"
res =func()
print(res)
2.有參的lambda 表示式
#2.有參的lambda 表示式
deffunc(n):
return
type(n)
#改寫
func = lambda
n : type(n)
print( func([1,2,3]) )
3.帶有判斷條件的lambda 表示式
deffunc(n):
if n % 2 ==0:
return"偶數
"else
:
return"奇數
"func = lambda n : "偶數"
if n % 2 == 0 else"奇數
"res = func(17)
print(res)
4.三元運算子(三目運算子)
"""語法: 真值 if 條件表示式 else 假值 如果條件表示式為真,返回真值,否則返回假值
"""n = 16res = "偶數"
if n % 2 == 0 else"奇數
"print(res)
5.小練習
#小練習 , 傳遞兩個數, 返回較大的那乙個
deffunc(x,y):
if x>y:
return
x
else
:
return
y
func = lambda x,y : x if x>y else
yres = func(200,100)
print(res)
day 12 函式名的應用 閉包 迭代器
今日主要內容 1,函式名的應用,第一類物件 函式名可以像變數一樣進行使用 再函式名後面新增 才是對函式的呼叫,否則列印的是函式的記憶體位址 1.賦值 2.作為list元素 3.作為引數 def func print 吃了 麼 def func2 fn print 我是func2 fn 執 行 傳遞過...
閉包 匿名函式 函式宣告
1 簡單的描述閉包 如果在函式func內部宣告函式inner,然後在函式外部呼叫inner,這個過程即產生了乙個閉包。1 閉包是指 有權訪問另乙個函式作用域中的變數的函式。2 閉包與變數 作用域鏈引出的乙個 閉包只能取得包含函式中任何變數的最後乙個值。閉包所儲存的是整個變數物件,而不是某個特殊的變數...
匿名函式與閉包
function box alert box leefunction var box function alert box lee function var box function alert box leealert function function age 100 函式裡面放匿名函式 形成閉...