日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

淺談Python 函數式編程

瀏覽:16日期:2022-07-20 10:26:45

匿名函數lambda表達式

什么是匿名函數?

匿名函數,顧名思義就是沒有名字的函數,在程序中不用使用 def 進行定義,可以直接使用 lambda 關鍵字編寫簡單的代碼邏輯。lambda 本質上是一個函數對象,可以將其賦值給另一個變量,再由該變量來調用函數,也可以直接使用。

#平時,我們是先定義函數,再進行調用def power(x): return x ** 2print(power(2))#使用lambda表達式的時候,我們可以這樣操作power = lambda x : x ** 2print(power(2))#覺得太麻煩,還可以這樣調用print((lambda x: 2 * x)(8))

lambda表達式的基本格式:lambda 入參 : 表達式

#入參可以有多個,比如 power = lambda x, n: x ** nprint(power(2, 3))

lambda 表達式的使用場景

一般適用于創建一些臨時性的,小巧的函數。比如上面的 power函數,我們當然可以使用 def 來定義,但使用 lambda 來創建會顯得很簡潔,尤其是在高階函數的使用中。

定義一個函數,傳入一個list,將list每個元素的值加1

def add(l = []): return [x +1 for x in l]print(add([1,2,3]))

上面的函數改成將所有元素的值加2

可能大家會說,這還不簡單,直接把return里的1改成2就行了。但是真的行嗎?如果函數被多個地方使用,而其他地方并不想加2,怎么辦?

這好辦,把變得那部分抽出來,讓調用者自己傳

def add(func,l = []): return [func(x) for x in l]def add1(x): return x+1def add2(x): return x+2print(add(add1,[1,2,3]))print(add(add2,[1,2,3]))

一個簡簡單單的問題,一定要用這么多代碼實現?

def add(func,l = []): return [func(x) for x in l]print(add(lambda x:x+1,[1,2,3]))print(add(lambda x:x+2,[1,2,3]))

map函數

map的基本格式

map(func, *iterables)

map() 函數接收兩個以上的參數,開頭一個是函數,剩下的是序列,將傳入的函數依次作用到序列的每個元素,并把結果作為新的序列返回。也就是類似 map(func,[1,2,3])

同樣的,我們還是來完成這樣一個功能:將list每個元素的值加1

def add(x): return x + 1result = map(add, [1, 2, 3, 4])print(type(result))print(list(result))

使用lambda表達式簡化操作

result = map(lambda x: x + 1, [1, 2, 3, 4])print(type(result))print(list(result))

函數中帶兩個參數的map函數格式

使用map函數,將兩個序列的數據對應位置求和,之后返回,也就是對[1,2,3],[4,5,6]兩個序列進行操作之后,返回結果[5,7,9]

print(list(map(lambda x, y: x + y, [1, 2, 3], [4, 5, 6])))

對于兩個序列元素個數一樣的,相對好理解。如果兩個序列個數不一樣的,會不會報錯?

print(list(map(lambda x, y: x + y, [1, 2, 3], [4, 5])))

我們可以看到不會報錯,但是結果以個數少的為準

reduce函數

reduce函數的基本格式

reduce(function, sequence, initial=None)

reduce把一個函數作用在一個序列上,這個函數必須接收兩個參數,reduce函數把結果繼續和序列的下一個元素做累積計算,跟遞歸有點類似,reduce函數會被上一個計算結果應用到本次計算中

reduce(func, [1,2,3]) = func(func(1, 2), 3)

使用reduce函數,計算一個列表的乘積

from functools import reducedef func(x, y): return x * yprint(reduce(func, [1, 2, 3, 4]))

結合lambda表達式,簡化操作

from functools import reduceprint(reduce(lambda x, y: x * y, [1, 2, 3, 4]))

filter 函數

filter 顧名思義是過濾的意思,帶有雜質的(非需要的數據),經過 filter 處理之后,就被過濾掉。

filter函數的基本格式

filter(function_or_None, iterable)

filter() 接收一個函數和一個序列。把傳入的函數依次作用于每個元素,然后根據返回值是 True 還是 False 決定保留還是丟棄該元素。

使用 filter 函數對給定序列進行操作,最后返回序列中所有偶數

print(list(filter(lambda x: x % 2 == 0, [1, 2, 3, 4, 5])))

sorted 函數

sorted從字面上就可以看去這是個用來排序的函數,sorted 可以對所有可迭代的對象進行排序操作

sorted的基本格式

sorted(iterable, key=None, reverse=False)#iterable -- 可迭代對象。#key -- 主要是用來進行比較的元素,只有一個參數,具體的函數的參數就是取自于可迭代對象中,指定可迭代對象中的一個元素來進行排序。#reverse -- 排序規則,reverse = True 降序 , reverse = False 升序(默認)。 #對序列做升序排序print(sorted([1, 6, 4, 5, 9]))#對序列做降序排序print(sorted([1, 6, 4, 5, 9], reverse=True))#對存儲多個列表的列表做排序data = [['Python', 99], ['c', 88]]print(sorted(data, key=lambda item: item[1]))

閉包

在萬物皆對象的Python中,函數是否能作為函數的返回值進行返回呢?

def my_power(): n = 2 def power(x): return x ** n return powerp = my_power()print(p(4))#------------------------------------------------------------def my_power(): n = 2 def power(x): return x ** n return powern = 3p = my_power()print(p(4))

我們可以看到,my_power 函數在返回的時候,也將其引用的值(n)一同帶回,n 的值被新的函數所使用,這種情況我們稱之為閉包

當我們把n的值移除到my_power函數外面,這個時候來看下計算結果

n = 2def my_power(): def power(x): return x ** n return powern = 3p = my_power()print(p(4))

為什么輸出的結果會是64?

我們先來看看閉包時,p.__closure____的結果

#例1def my_power(): n = 2 def power(x): return x ** n return powerp = my_power()print(p.__closure__)#結果:(<cell at 0x00000264518F9A38: int object at 0x00007FFA7F617120>)#closure是內部函數的一個屬性,用來保存環境變量#---------------------------------------------------------------------#例2n = 2def my_power(): def power(x): return x ** n return powern = 3p = my_power()print(p.__closure__)#輸出結果 None

通過例1跟例2對比,我們可以知道,例2并不是閉包

閉包經典問題

下面的程序是否是閉包?能否正確運行

def my_power(): n = 2 def power(x): n += 1 return x ** n return powerp = my_power()print(p(3))

如何讓上面的程序正確運行?看看改正之后的結果

def my_power(): n = 2 def power(x): nonlocal n n += 1 return x ** n return powerp = my_power()print(p.__closure__)print(p(3))print(p(3))

看看下面的程序的運行結果

def my_power(): n = 2 L = [] for i in range(1, 3): def power(): return i ** n L.append(power) return Lf1, f2 = my_power()print(f1())print(f2())print(f1.__closure__[0].cell_contents)print(f2.__closure__[0].cell_contents)

python的函數只有在執行時,才會去找函數體里的變量的值,也就是說你連形參都不確定,你咋求知道 i為幾呢?在這里,你只需要記住如果你連形參都不確定,python就只會記住最后一個i值。

裝飾器及其應用

什么是裝飾器模式

裝飾器模式(Decorator Pattern)允許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬于結構型模式,它是作為現有的類的一個包裝。

這種模式創建了一個裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。

import timestart = time.time()time.sleep(4)end = time.time()print(end - start)

從實際例子來看裝飾器

def my_fun(): print('這是一個函數')my_fun()

要再打印“這是一個函數”前面在打印多一行hello world。

def my_fun(): begin = time.time() time.sleep(2) print('這里一個函數') end = time.time() print(end-begin)my_fun()

這個時候,如果不想修改原有的函數,咋整?

def my_fun(): print('這是一個函數')def my_time(func): begin = time.time() time.sleep(2) func() end = time.time() print(end - begin)my_time(func)

這種方式,因為要增加功能,導致所有的業務調用方都得進行修改,此法明顯不可取。

另一種方式:

def print_cost(func): def wrapper(): begin = time.time() time.sleep(2) func() end = time.time() print(end - begin) return wrapper@print_costdef my_fun(): print('這里一個函數')

第二種方式并沒有修改func函數的內部實現,而是使用裝飾器模式對其功能進行裝飾增強。

以上就是淺談Python 函數式編程的詳細內容,更多關于Python 函數式編程的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
首页国产精品| 欧美激情福利| 国产精品免费不| 亚洲综合电影一区二区三区| 中国字幕a在线看韩国电影| 亚洲最新av| 久久久久91| 狠狠久久伊人中文字幕| 国产精品一页| 日韩国产在线不卡视频| 日本va欧美va瓶| 一区二区三区四区在线观看国产日韩| 日韩欧美在线中字| 久久麻豆视频| 高清久久精品| 欧美黑人巨大videos精品| 日本欧美一区二区在线观看| 亚洲精品日本| 四虎国产精品免费久久| 亚洲免费中文| 欧美 日韩 国产一区二区在线视频| 日韩欧美二区| 欧美日韩中文一区二区| 红桃视频国产精品| 国产精品蜜芽在线观看| 精品日产乱码久久久久久仙踪林| 久久不卡日韩美女| 国产美女高潮在线| 亚洲黄色免费看| 日韩欧美午夜| 亚洲韩日在线| 亚洲在线久久| 日韩精品导航| 日本aⅴ免费视频一区二区三区| 伊人久久亚洲热| 性欧美精品高清| 亚洲色图综合| 91精品国产自产在线丝袜啪| 日韩高清二区| 成人在线视频免费看| 国产一区二区三区国产精品| 国产精品毛片久久| 日韩精品欧美激情一区二区| 中文字幕一区日韩精品| 日韩精品欧美成人高清一区二区| 91成人精品在线| 欧美成人一二区| 免费成人在线视频观看| 日韩在线观看中文字幕| 国产日韩三级| 国产精品一区二区精品视频观看| 麻豆国产精品视频| 欧美日韩第一| 美国三级日本三级久久99| 日韩不卡一区二区| 美女精品一区二区| 亚洲深夜av| 欧美在线首页| 激情国产在线| 伊人精品久久| 国产精品亚洲欧美| 国产亚洲一区二区手机在线观看| 午夜国产欧美理论在线播放| 国产乱人伦精品一区| 日韩国产综合| 免费精品国产的网站免费观看| 天使萌一区二区三区免费观看| 亚洲精品高潮| 成人va天堂| 亚洲精品免费观看| 色欧美自拍视频| 好看的亚洲午夜视频在线| 久久精品国产久精国产爱| 亚洲va在线| 日本v片在线高清不卡在线观看| 久久婷婷国产| 婷婷视频一区二区三区| а√在线中文在线新版| 美女久久一区| 日韩不卡一区| 三级欧美在线一区| 国产一区二区三区四区二区| 色婷婷成人网| 国产美女精品| 香蕉成人av| 国产精品大片免费观看| 麻豆9191精品国产| 久久久亚洲一区| 精品国产美女a久久9999| 日韩综合小视频| 国产美女一区| 激情婷婷综合| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 亚洲欧美久久| a天堂资源在线| 国产精品一线天粉嫩av| 四虎精品一区二区免费| 男女男精品视频网| 尤物精品在线| 亚洲精品2区| 午夜国产一区二区| 1000部精品久久久久久久久| 日韩三区免费| 日韩伦理一区| 日韩欧美三级| 一本大道色婷婷在线| 97在线精品| 精品午夜视频| 国产精品成人a在线观看| 精品视频亚洲| 欧美aⅴ一区二区三区视频| 欧美一区自拍| 国产调教精品| 国产精品入口久久| 国产精品日韩精品在线播放| 国产精品一区二区三区美女| 久久国产日韩欧美精品| 日韩av网站在线免费观看| 日本成人手机在线| 日本中文字幕一区二区| 亚洲aa在线| 91精品国产自产观看在线| 日韩高清在线观看一区二区| 日本成人手机在线| 国产亚洲高清在线观看| 国产精选久久| 精品一区二区三区的国产在线观看 | 久久xxxx| 亚洲欧美视频| 亚洲一区二区成人| 日本aⅴ亚洲精品中文乱码| 日本综合视频| 国产欧美日韩影院| 欧美国产极品| 久久久免费人体| 成人台湾亚洲精品一区二区| 另类专区亚洲| 日韩一区二区在线免费| 999久久久国产精品| 欧美日韩国产传媒| 丝袜a∨在线一区二区三区不卡| 人人爽香蕉精品| 日日夜夜免费精品视频| 国产精品毛片aⅴ一区二区三区| 精品72久久久久中文字幕| 色偷偷偷在线视频播放| 激情欧美一区| 免费的成人av| 国产私拍福利精品视频二区| 国产精品黄色| 日韩黄色大片网站| 9色国产精品| 偷拍亚洲精品| 麻豆一区二区三区| 四虎884aa成人精品最新| 欧美午夜不卡| 欧美亚洲三区| 日韩欧美自拍| 亚洲综合精品| 国产精品亚洲欧美一级在线| 精品视频在线你懂得| 色婷婷久久久| 亚洲三级网站| 欧美激情视频一区二区三区在线播放| 精品九九在线| 欧美日韩一二三四| 日本一区免费网站| 欧美国产美女| 国产午夜精品一区二区三区欧美 | 成人av二区| 日韩精品视频一区二区三区| 精品国产精品久久一区免费式| 欧美日韩色图| 日本不卡一区二区三区| 天堂√8在线中文| 国产亚洲精品久久久久婷婷瑜伽| 中文字幕av亚洲精品一部二部 | 国产欧美一区二区精品久久久| 美女一区网站| 在线精品福利| 亚洲永久av| 日韩一区二区三区在线看| 精品国产18久久久久久二百| 伊人影院久久| 精品资源在线| 日韩中文字幕不卡| 久久久男人天堂| 亚洲性视频在线| 日韩国产在线| 蜜臀精品久久久久久蜜臀| 国产精品观看| 在线视频精品| 美腿丝袜在线亚洲一区| 亚洲视频www| 日韩1区在线| 最新亚洲国产| 日韩av有码| 日韩不卡一区二区| 国产一区欧美| 国产精品白丝久久av网站|