jkd1.8 .stream()操作
阿新 • • 發佈:2020-12-02
一. 概念
""" 如果內函式使用了外函式的區域性變數, 並且外函式把內函式返回出來的過程,叫做閉包 裡面的內函式是閉包函式 """
二、基本語法
def songyunjie_family(): father = "王健林" def f_hobby(): print("我們先頂一個小目標,比如賺它一個億,這是我爸爸{}".format(father)) return f_hobby func = songyunjie_family() func() obj = func.__closure__[0] print(obj.cell_contents,"<111>")
三、複雜版本
def mashengping_family(): father = "馬雲" jiejie_name = "馬蓉" meimei_name = "馬諾" money = 1000 def jiejie(): nonlocal money money -= 700 print("買包包,買名錶,買首飾,把錢都敗光了,家裡的錢還剩下{}元".format(money)) def meimei(): nonlocal money money-= 200 print("要找只找有錢人,寧願在寶馬裡面哭,也不願意在自行車上撒歡,家裡的敗光了還剩下{}元".format(money)) def big_master(): return (jiejie,meimei) return big_master func = mashengping_family() print(func) # 返回的是元組 tup = func() # big_master() print(tup) # tup = (jiejie,meimei) # 獲取姐姐 jiejie = tup[0] #jiejie 函式 # 獲取妹妹 meimei = tup[1] # meimei 函式 # big_master 是閉包函式,是直接被mashengping_family返回出來的 # jiejie,meimei 是通過big_master間接被返回到函式外面的 # 呼叫妹妹 meimei() # 呼叫妹妹函式 # 呼叫姐姐 jiejie() # 呼叫姐姐函式 #看它是不是閉包函式,是就可以用 # cell獲取單元格物件結果是一個函式名 # 加() 執行 # ### 獲取閉包函式使用的變數 __closure__ res = func.__closure__ print(res,"<222>") # cell_contents 用來獲取單元格物件當中的閉包函式 jiejie = res[0].cell_contents meimei = res[1].cell_contents # 通過獲取單元格物件 -> 獲取單元格物件中的內容 -> 實際的呼叫 jiejie() meimei() print(jiejie.__closure__[0].cell_contents) print(meimei.__closure__[0].cell_contents)
四、閉包的特徵和意義
1、特徵
內函式使用了外函式的區域性變數
那麼該變數與閉包函式發生繫結
延長該變數的生命週期
def outer(val): def inner(num): return val + num return inner func = outer(10) # func = inner res = func(15) # res = func(15) = inner(15) print(res) """ 10實參 -> val 形參 因為內函式inner是閉包函式,使用了外函式val 那麼該變數val生命週期被延長,沒有隨著函式呼叫的結束而釋放. func(15) 把15這個引數賦值給num這個形參 res = inner(15) => return val + num =>10 + 15 => 25
2、意義
引入:
# 模擬滑鼠點選次數 num = 0 def click_num(): global num num += 1 print(num) click_num() click_num() click_num() num = 100 click_num() click_num()
2.1 使用閉包函式改寫點選次數
閉包的意義:閉包可以優先使用外函式中的變數,並對閉包中的值起到了封裝保護的作用.外部無法訪問.
def click_num(): num = 0 def func(): nonlocal num num += 1 print(num) return func func = click_num() func() func() num = 1000 func() func() func() func() func()
五、匿名函式
用一句話來表達只有返回值的函式 """語法:lambda 引數 : 返回值 """ """追求程式碼:簡潔,高效"""
1、無參的lambda表示式
def func(): return "123" # 改寫 func = lambda : "123" res = func() print(res)
2、有參的lambda 表示式
def func(n): return type(n) # 改寫 func = lambda n : type(n) print( func([1,2,3]) )
3、帶有判斷條件的lambda 表示式
def func(n): if n % 2 == 0: return "偶數" else: return "奇數" func = lambda n : "偶數" if n % 2 == 0 else "奇數" res = func(17) print(res) # ### 三元(目)運算子 """ 語法: 真值 if 條件表示式 else 假值 如果條件表示式為真,返回真值,否則返回假值 """ n = 16 res = "偶數" if n % 2 == 0 else "奇數" print(res)
4、小練習:傳遞兩個數, 返回較大的那一個
def func(x,y): if x>y: return x else: return y func = lambda x,y : x if x>y else y res = func(200,100) print(res)