最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

???????Python?入門學(xué)習(xí)之函數(shù)式編程

 更新時(shí)間:2022年05月22日 10:23:50   作者:??Python編程學(xué)習(xí)圈????  
這篇文章主要介紹了???????Python?入門學(xué)習(xí)之函數(shù)式編程,?Python?中的函數(shù)式編程技術(shù)進(jìn)行了簡(jiǎn)單的入門介紹,下文詳細(xì)內(nèi)容需要的小伙伴可以參考一下

前言

本文對(duì) Python 中的函數(shù)式編程技術(shù)進(jìn)行了簡(jiǎn)單的入門介紹。

在 Python 中,函數(shù)是「頭等公民」(first-class)。也就是說,函數(shù)與其他數(shù)據(jù)類型(如 int)處于平等地位。

因而,我們可以將函數(shù)賦值給變量,也可以將其作為參數(shù)傳入其他函數(shù),將它們存儲(chǔ)在其他數(shù)據(jù)結(jié)構(gòu)(如 dicts)中,并將它們作為其他函數(shù)的返回值。

把函數(shù)作為對(duì)象

由于其他數(shù)據(jù)類型(如 string、list 和 int)都是對(duì)象,那么函數(shù)也是 Python 中的對(duì)象。我們來看示例函數(shù) foo,它將自己的名稱打印出來:

def?foo():
???print("foo")

由于函數(shù)是對(duì)象,因此我們可以將函數(shù) foo 賦值給任意變量,然后調(diào)用該變量。

例如,我們可以將函數(shù)賦值給變量 bar:

bar?=?foo
bar()
#will?print?"foo"?to?the?console

語(yǔ)句 bar = foo 將函數(shù) foo 引用的對(duì)象賦值給變量 bar。

把對(duì)象作為函數(shù)

當(dāng)對(duì)象可調(diào)用時(shí)(callable),它們與函數(shù)一樣,如 object()。這是通過 call 方法實(shí)現(xiàn)的。

示例如下:

class?Greeter:
???def?__init__(self,?greeting):
??????self.greeting?=?greeting
???def?__call__(self,?name):
??????return?self.greeting?+?"?"?+?name

每一次配置 Greeter 類的對(duì)象時(shí),我們都會(huì)創(chuàng)建一個(gè)新的對(duì)象,即打招呼時(shí)可以喊的新名字。

如下所示:

morning?=?Greeter("good?morning")?#creates?the?callable?object
morning("john")?#?calling?the?object
#prints?"good?morning?john"?to?the?console

我們可以調(diào)用 morning 對(duì)象的原因在于,我們已經(jīng)在類定義中使用了 call 方法。為了檢查對(duì)象是否可調(diào)用,我們使用內(nèi)置函數(shù) callable:

callable(morning)?#true
callable(145)?#false.?int?is?not?callable.?

數(shù)據(jù)結(jié)構(gòu)內(nèi)的函數(shù)

函數(shù)和其他對(duì)象一樣,可以存儲(chǔ)在數(shù)據(jù)結(jié)構(gòu)內(nèi)部。例如,我們可以創(chuàng)建 int to func 的字典。當(dāng) int 是待執(zhí)行步驟的簡(jiǎn)寫時(shí),這就會(huì)派上用場(chǎng)。

#?store?in?dictionary
mapping?=?{
???0?:?foo,
???1?:?bar
}
x?=?input()?#get?integer?value?from?user
mapping[x]()?#call?the?func?returned?by?dictionary?access

類似地,函數(shù)也可以存儲(chǔ)在多種其他數(shù)據(jù)結(jié)構(gòu)中。

把函數(shù)作為參數(shù)和返回值

函數(shù)還可以作為其他函數(shù)的參數(shù)和返回值。接受函數(shù)作為輸入或返回函數(shù)的函數(shù)叫做高階函數(shù),它是函數(shù)式編程的重要組成部分。

高階函數(shù)具備強(qiáng)大的能力。就像《Eloquent JavaScript》中解釋的那樣:

「高階函數(shù)允許我們對(duì)動(dòng)作執(zhí)行抽象,而不只是抽象數(shù)值?!?/p>

我們來看一個(gè)例子。假設(shè)我們想對(duì)一個(gè)項(xiàng)目列表(list of items)執(zhí)行迭代,并將其順序打印出來。我們可以輕松構(gòu)建一個(gè) iterate 函數(shù):

def?iterate(list_of_items):
????for?item?in?list_of_items:
????????print(item)

看起來很酷吧,但這只不過是一級(jí)抽象而已。如果我們想在對(duì)列表執(zhí)行迭代時(shí)進(jìn)行打印以外的其他操作要怎么做呢?

這就是高階函數(shù)存在的意義。我們可以創(chuàng)建函數(shù) iterate_custom,待執(zhí)行迭代的列表和要對(duì)每個(gè)項(xiàng)應(yīng)用的函數(shù)都是 iterate_custom 函數(shù)的輸入:

def?iterate_custom(list_of_items,?custom_func):
???for?item?in?list_of_items:
????????custom_func(item)

這看起來微不足道,但其實(shí)非常強(qiáng)大。

我們已經(jīng)把抽象的級(jí)別提高了一層,使代碼具備更強(qiáng)的可重用性?,F(xiàn)在,我們不僅可以在打印列表時(shí)調(diào)用該函數(shù),還可以對(duì)涉及序列迭代的列表執(zhí)行任意操作。

函數(shù)還能被返回,從而使事情變得更加簡(jiǎn)單。就像我們?cè)?dict 中存儲(chǔ)函數(shù)一樣,我們還可以將函數(shù)作為控制語(yǔ)句,來決定適合的函數(shù)。

例如:

def?add(x,?y):
????return?x?+?y
def?sub(x,?y):
????return?x?-?y
def?mult(x,?y):
????return?x?*?y
def?calculator(opcode):
????if?opcode?==?1:
???????return?add
????elif?opcode?==?2:
???????return?sub
????else:
???????return?mult?
my_calc?=?calculator(2)?#my?calc?is?a?subtractor
my_calc(5,?4)?#returns?5?-?4?=?1?
my_calc?=?calculator(9)?#my?calc?is?now?a?multiplier
my_calc(5,?4)?#returns?5?x?4?=?20.?

嵌套函數(shù)

函數(shù)還可以在其他函數(shù)內(nèi)部,這就是「內(nèi)部函數(shù)」。內(nèi)部函數(shù)在創(chuàng)建輔助函數(shù)時(shí)非常有用,輔助函數(shù)即作為子模塊來支持主函數(shù)的小型可重用函數(shù)。

在問題需要特定函數(shù)定義(參數(shù)類型或順序)時(shí),我們可以使用輔助函數(shù)。這種不遵循傳統(tǒng)做法的操作使得解決問題變得更加簡(jiǎn)單。

假設(shè)你想定義一個(gè)斐波那契函數(shù) fib(n),該函數(shù)只有一個(gè)參數(shù) n,我們必須返回第 n 個(gè)斐波那契數(shù)。

定義此類函數(shù)的一種可行方式是:使用輔助函數(shù)來追蹤斐波那契數(shù)列的前兩個(gè)項(xiàng)(因?yàn)殪巢瞧鯏?shù)是前兩個(gè)數(shù)之和)。

def?fib(n):
????def?fib_helper(fk1,?fk,?k):
????????if?n?==?k:
???????????return?fk
????????else:
???????????return?fib_helper(fk,?fk1+fk,?k+1)
????if?n?<=?1:
???????return?n
????else:
???????return?fib_helper(0,?1,?1)

將該計(jì)算從函數(shù)主體移到函數(shù)參數(shù),這具備非常強(qiáng)大的力量。因?yàn)樗鼫p少了遞歸方法中可能出現(xiàn)的冗余計(jì)算。

單表達(dá)式函數(shù)(Lambda 表達(dá)式)

如果我們想在未給函數(shù)命名之前寫一個(gè)函數(shù)要怎么做?如果我們想寫一個(gè)簡(jiǎn)短的單行函數(shù)(如上述示例中的函數(shù) foo 或 mult)要怎么做?

我們可以在 Python 中使用 lambda 關(guān)鍵字來定義此類函數(shù)。

示例如下:

mult?=?lambda?x,?y:?x?*?y
mult(1,?2)?#returns?2

該 mult 函數(shù)的行為與使用傳統(tǒng) def 關(guān)鍵字定義函數(shù)的行為相同。

注意:lambda 函數(shù)必須為單行,且不能包含程序員寫的返回語(yǔ)句。

事實(shí)上,它們通常具備隱式的返回語(yǔ)句(在上面的示例中,函數(shù)想表達(dá) return x * y,不過我們省略了 lambda 函數(shù)中的顯式返回語(yǔ)句)。

lambda 函數(shù)更加強(qiáng)大和精準(zhǔn),因?yàn)槲覀冞€可以構(gòu)建匿名函數(shù)(即沒有名稱的函數(shù)):

(lambda?x,?y:?x?*?y)(9,?10)?#returns?90

當(dāng)我們只需要一次性使用某函數(shù)時(shí),這種方法非常方便。例如,當(dāng)我們想填充字典時(shí):

import?collections
pre_fill?=?collections.defaultdict(lambda:?(0,?0))
#all?dictionary?keys?and?values?are?set?to?0

接下來我們來看 Map、Filter 和 Reduce,以更多地了解 lambda。

Map、Filter 和 Reduce

Map

map 函數(shù)基于指定過程(函數(shù))將輸入集轉(zhuǎn)換為另一個(gè)集合。這類似于上文提到的 iterate_custom 函數(shù)。

例如:

def?multiply_by_four(x):
????return?x?*?4
scores?=?[3,?6,?8,?3,?5,?7]
modified_scores?=?list(map(multiply_by_four,?scores))
#modified?scores?is?now?[12,?24,?32,?12,?20,?28]

在 Python 3 中,map 函數(shù)返回的 map 對(duì)象可被類型轉(zhuǎn)換為 list,以方便使用?,F(xiàn)在,我們無需顯式地定義 multiply_by_four 函數(shù),而是定義 lambda 表達(dá)式:

modified_scores?=?list(map(lambda?x:?4?*?x,?scores))

當(dāng)我們想對(duì)集合內(nèi)的所有值執(zhí)行某項(xiàng)操作時(shí),map 函數(shù)很有用。

Filter

就像名稱所顯示的那樣,filter 函數(shù)可以幫助篩除不想要的項(xiàng)。例如,我們想要去除 scores 中的奇數(shù),那么我們可以使用 filter:

even_scores?=?list(filter(lambda?x:?True?if?(x?%?2?==?0)?else?False,?scores))
#even_scores?=?[6,?8]

由于提供給 filter 的函數(shù)是逐個(gè)決定是否接受每一個(gè)項(xiàng)的,因此該函數(shù)必須返回 bool 值,且該函數(shù)必須是一元函數(shù)(即只使用一個(gè)輸入?yún)?shù))。

Reduce

reduce 函數(shù)用于「總結(jié)」或「概述」數(shù)據(jù)集。例如,如果我們想要計(jì)算所有分?jǐn)?shù)的總和,就可以使用 reduce:

sum_scores?=?reduce((lambda?x,?y:?x?+?y),?scores)
#sum_scores?=?32

這要比寫循環(huán)語(yǔ)句簡(jiǎn)單多了。注意:提供給 reduce 的函數(shù)需要兩個(gè)參數(shù):一個(gè)表示正在接受檢查的項(xiàng),另一個(gè)表示所用運(yùn)算的累積結(jié)果。

到此這篇關(guān)于Python 入門學(xué)習(xí)之函數(shù)式編程的文章就介紹到這了,更多相關(guān)Python 函數(shù)式編程 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • pandas DataFrame創(chuàng)建方法的方式

    pandas DataFrame創(chuàng)建方法的方式

    這篇文章主要介紹了pandas DataFrame創(chuàng)建方法的方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • python中pd.Series()函數(shù)的使用

    python中pd.Series()函數(shù)的使用

    本文主要介紹了python中pd.Series()函數(shù)的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • python返回昨天日期的方法

    python返回昨天日期的方法

    這篇文章主要介紹了python返回昨天日期的方法,涉及Python日期操作的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • 基于Python-Pycharm實(shí)現(xiàn)的猴子摘桃小游戲(源代碼)

    基于Python-Pycharm實(shí)現(xiàn)的猴子摘桃小游戲(源代碼)

    這篇文章主要介紹了基于Python-Pycharm實(shí)現(xiàn)的猴子摘桃小游戲,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Python 深入了解opencv圖像分割算法

    Python 深入了解opencv圖像分割算法

    本文主要介紹了Python通過opencv實(shí)現(xiàn)圖像分割的詳細(xì)過程與代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • Python虛擬環(huán)境的創(chuàng)建和包下載過程分析

    Python虛擬環(huán)境的創(chuàng)建和包下載過程分析

    這篇文章主要介紹了Python虛擬環(huán)境的創(chuàng)建和包下載,本文通過實(shí)例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Python基礎(chǔ)教程,Python入門教程(超詳細(xì))

    Python基礎(chǔ)教程,Python入門教程(超詳細(xì))

    Python由荷蘭數(shù)學(xué)和計(jì)算機(jī)科學(xué)研究學(xué)會(huì) 于1990 年代初設(shè)計(jì),作為一門叫做ABC語(yǔ)言的替代品。Python語(yǔ)法和動(dòng)態(tài)類型,以及解釋型語(yǔ)言的本質(zhì),使它成為多數(shù)平臺(tái)上寫腳本和快速開發(fā)應(yīng)用的編程語(yǔ)言
    2021-06-06
  • Python包和模塊的分發(fā)詳細(xì)介紹

    Python包和模塊的分發(fā)詳細(xì)介紹

    這篇文章主要介紹了Python包和模塊的分發(fā),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • python中字符串String及其常見操作指南(方法、函數(shù))

    python中字符串String及其常見操作指南(方法、函數(shù))

    String方法是用來處理代碼中的字符串的,它幾乎能搞定你所遇到的所有字符串格式,下面這篇文章主要給大家介紹了關(guān)于python中字符串String及其常見操作(方法、函數(shù))的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • TensorFlow實(shí)現(xiàn)模型評(píng)估

    TensorFlow實(shí)現(xiàn)模型評(píng)估

    這篇文章主要為大家詳細(xì)介紹了TensorFlow實(shí)現(xiàn)模型評(píng)估,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09

最新評(píng)論

方山县| 迭部县| 黄平县| 馆陶县| 沧源| 静乐县| 西青区| 麦盖提县| 凤台县| 冷水江市| 江津市| 怀远县| 北票市| 宣化县| 华池县| 秦安县| 巴青县| 夏邑县| 隆安县| 兴山县| 南丹县| 中牟县| 招远市| 托里县| 重庆市| 锡林郭勒盟| 宁化县| 庄浪县| 海盐县| 南木林县| 信阳市| 榆社县| 平原县| 辽阳县| 齐河县| 茌平县| 梧州市| 女性| 鞍山市| 镇平县| 六枝特区|