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

Python中函數(shù)式編程的入門指南詳解

 更新時間:2026年04月24日 08:20:42   作者:小莊-Python辦公  
本文介紹了函數(shù)式編程(FP)的核心概念及其在Python中的應(yīng)用,特別適合非計算機科班轉(zhuǎn)碼者學(xué)習(xí),下面小編就來和大家詳細講講Python函數(shù)式編程的核心概念和具體應(yīng)用吧

引言:為什么非科班出身要懂函數(shù)式編程?

很多非計算機科班(比如文科、商科、傳統(tǒng)工科)轉(zhuǎn)碼的朋友,在剛接觸編程時,往往會被復(fù)雜的“面向?qū)ο螅∣OP)”、“類”、“實例”、“繼承”繞暈。其實,編程不只有這一種思維方式。

今天,我們來聊聊另一種極其優(yōu)雅、邏輯性極強,且對數(shù)學(xué)/邏輯思維非常友好的編程范式——函數(shù)式編程(Functional Programming, 簡稱 FP)。

什么是函數(shù)式編程?

簡單來說,函數(shù)式編程就是把電腦運算視為“數(shù)學(xué)上的函數(shù)計算”,并且避免使用程序狀態(tài)以及易變對象。聽起來有點抽象?沒關(guān)系,我們用大白話來拆解它的三大核心理念。

核心一:函數(shù)是一等公民 (First-Class Functions)

在 Python 中,函數(shù)不僅僅是一段執(zhí)行代碼,它就像普通的變量一樣:

  • 可以賦值給其他變量
  • 可以作為參數(shù)傳遞給另一個函數(shù)
  • 可以作為另一個函數(shù)的返回值
# 示例:把函數(shù)當(dāng)成變量傳給另一個函數(shù)
def shout(text):
    return text.upper()

def whisper(text):
    return text.lower()

def greet(func, message):
    print(func(message))

greet(shout, "Hello World")  # 輸出: HELLO WORLD
greet(whisper, "Hello World") # 輸出: hello world

核心二:純函數(shù) (Pure Functions)

純函數(shù)有兩個鐵律:

  1. 輸入決定輸出:給定相同的輸入,永遠返回相同的輸出。
  2. 沒有副作用(No Side Effects):函數(shù)執(zhí)行過程中,不會修改外部的變量,也不會和外界(如數(shù)據(jù)庫、文件系統(tǒng)、全局變量)發(fā)生意料之外的交互。

反面教材(非純函數(shù)):

total = 0
def add_to_total(x):
    global total
    total += x  # 修改了外部變量(副作用)
    return total

正面教材(純函數(shù)):

def add(x, y):
    return x + y  # 只依賴輸入,不影響外界

純函數(shù)的好處在于極其容易測試和調(diào)試,這對于非科班新手來說簡直是福音——你再也不用去猜到底是哪個角落的變量被誰偷偷改掉了!

核心三:不可變性 (Immutability)

在函數(shù)式編程中,數(shù)據(jù)一旦創(chuàng)建就不能改變。如果需要修改數(shù)據(jù),那就創(chuàng)建一個包含新變化的新數(shù)據(jù)。
雖然 Python 原生并沒有嚴格強制不可變性(比如列表是可以被修改的),但在運用 FP 思想時,我們應(yīng)盡量避免直接修改原數(shù)據(jù)。

Python 中的函數(shù)式“三劍客”

Python 雖然不是純粹的函數(shù)式語言(如 Haskell),但它內(nèi)置了非常強大的函數(shù)式編程工具。掌握它們,你的代碼會瞬間變得簡潔且高大上。

1.map():批量轉(zhuǎn)換

把一個函數(shù)應(yīng)用到一個序列的所有元素上。

場景:把列表里的每個數(shù)字都平方。

傳統(tǒng)寫法(命令式):

numbers = [1, 2, 3, 4]
squared = []
for n in numbers:
    squared.append(n ** 2)

函數(shù)式寫法:

numbers = [1, 2, 3, 4]
# lambda 是一種匿名函數(shù),表示輸入 x,返回 x 的平方
squared = list(map(lambda x: x ** 2, numbers))

2.filter():智能過濾

根據(jù)指定的函數(shù),過濾掉序列中不符合條件的元素。

場景:挑出列表里的偶數(shù)。

傳統(tǒng)寫法:

numbers = [1, 2, 3, 4, 5, 6]
evens = []
for n in numbers:
    if n % 2 == 0:
        evens.append(n)

函數(shù)式寫法:

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

3.reduce():歸約聚合

把序列前兩個元素傳給函數(shù),得到結(jié)果后,再與第三個元素進行累積計算,直到遍歷完整個序列。(注意:在 Python 3 中需要從 functools 模塊導(dǎo)入)

場景:計算列表中所有數(shù)字的乘積。

from functools import reduce

numbers = [1, 2, 3, 4]
product = reduce(lambda x, y: x * y, numbers)
# 計算過程: (((1 * 2) * 3) * 4) = 24

Pythonic 的進階:列表推導(dǎo)式 (List Comprehensions)

雖然 mapfilter 很有函數(shù)式味道,但在 Python 社區(qū),更推薦使用列表推導(dǎo)式,它被認為更加 “Pythonic”(符合 Python 的設(shè)計哲學(xué)),同時兼具函數(shù)式編程的聲明式特點。

numbers = [1, 2, 3, 4, 5, 6]
# 相當(dāng)于 map + filter: 把所有偶數(shù)挑出來并求平方
result = [x ** 2 for x in numbers if x % 2 == 0]

是不是既好讀又優(yōu)雅?

給轉(zhuǎn)碼新手的建議

  1. 不要陷入教條:Python 支持多范式編程(面向?qū)ο?+ 函數(shù)式 + 過程式)。不要為了函數(shù)式而函數(shù)式,哪種方式讓代碼最易讀、最好維護,就用哪種。
  2. 多用無副作用的函數(shù):即使你寫的是面向?qū)ο蟮拇a,在類的方法中盡量保持“純函數(shù)”的特性,這會大幅降低 Bug 產(chǎn)生的概率,對初學(xué)者調(diào)試非常友好。
  3. 擁抱數(shù)據(jù)管道思維:試著把程序看作是數(shù)據(jù)流經(jīng)一系列處理管道(函數(shù)),而不是一堆在不斷改變狀態(tài)的變量。這種思維能讓復(fù)雜邏輯變得極其清晰。

結(jié)語

對于非科班轉(zhuǎn)碼的同學(xué),編程不僅僅是死記硬背語法,更是掌握解決問題的思維方式。函數(shù)式編程提供了一種像數(shù)學(xué)公式一樣嚴謹、干凈的思考工具。下次寫代碼時,不妨試著少寫幾個嵌套的 for 循環(huán),多寫幾個純函數(shù),體會一下這種極致的簡潔之美吧!

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

相關(guān)文章

  • Python?multiprocessing?共享對象的示例代碼

    Python?multiprocessing?共享對象的示例代碼

    在 Python 中使用 multiprocessing,一個新的進程可以獨立運行并擁有自己的內(nèi)存空間,下面通過示例代碼講解Python multiprocessing共享對象的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧
    2023-07-07
  • python/golang 刪除鏈表中的元素

    python/golang 刪除鏈表中的元素

    這篇文章主要介紹了python/golang 如何刪除鏈表中的元素,幫助大家更好的理解和使用python/golang,感興趣的朋友可以了解下
    2020-09-09
  • python實現(xiàn)兩個一維列表合并成一個二維列表

    python實現(xiàn)兩個一維列表合并成一個二維列表

    今天小編就為大家分享一篇python實現(xiàn)兩個一維列表合并成一個二維列表,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 抵御代碼復(fù)雜性使python函數(shù)更加Pythonic技巧示例詳解

    抵御代碼復(fù)雜性使python函數(shù)更加Pythonic技巧示例詳解

    這篇文章主要介紹了抵御代碼復(fù)雜性使python函數(shù)更加Pythonic技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • python中如何使用正則表達式的非貪婪模式示例

    python中如何使用正則表達式的非貪婪模式示例

    貪婪與非貪婪模式影響的是被量詞修飾的子表達式的匹配行為,下面這篇文章主要給大家介紹了關(guān)于python中如何使用正則表達式的非貪婪模式的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-10-10
  • 解決python寫的windows服務(wù)不能啟動的問題

    解決python寫的windows服務(wù)不能啟動的問題

    使用py2exe生成windows服務(wù)在win7下可以正常運行,但是到了xp下面可以安裝,但是無法啟動
    2014-04-04
  • python中partial()基礎(chǔ)用法說明

    python中partial()基礎(chǔ)用法說明

    這篇文章主要給大家介紹了關(guān)于python中partial()基礎(chǔ)用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧
    2018-12-12
  • 基于logstash實現(xiàn)日志文件同步elasticsearch

    基于logstash實現(xiàn)日志文件同步elasticsearch

    這篇文章主要介紹了基于logstash實現(xiàn)日志文件同步elasticsearch,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • 教你怎么用Python實現(xiàn)自動生日祝福

    教你怎么用Python實現(xiàn)自動生日祝福

    這篇文章主要介紹了教你怎么用Python實現(xiàn)自動生日祝福,文中有非常詳細的代碼示例,對正在學(xué)習(xí)python的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • django rest framework 自定義返回方式

    django rest framework 自定義返回方式

    這篇文章主要介紹了django rest framework 自定義返回方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07

最新評論

东源县| 阿城市| 遵义市| 灵丘县| 临武县| 博野县| 饶平县| 利川市| 泸水县| 潼关县| 嵊泗县| 大埔县| 龙陵县| 时尚| 吉木萨尔县| 淳化县| 石景山区| 万全县| 合川市| 象山县| 德清县| 昆山市| 杭锦旗| 达日县| 西昌市| 南华县| 大连市| 友谊县| 乳山市| 宣武区| 高唐县| 清涧县| 鄂托克前旗| 万山特区| 西和县| 达拉特旗| 南昌县| 南宫市| 吉安市| 如皋市| 水城县|