1. 程式人生 > 實用技巧 >jkd1.8 .stream()操作

jkd1.8 .stream()操作

一. 概念

"""
如果內函式使用了外函式的區域性變數,
並且外函式把內函式返回出來的過程,叫做閉包
裡面的內函式是閉包函式
"""

二、基本語法

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)