国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Python 中的“函數式編程”范式:寫出更簡潔、更優雅的代碼

開發
當我們談論Python時,我們常常稱其為一門“多范式”的編程語言。除了我們最熟悉的面向對象編程(OOP)和過程式編程,Python還優雅地支持一種強大而迷人的編程思想——函數式編程。

當我們談論Python時,我們常常稱其為一門“多范式”的編程語言。除了我們最熟悉的面向對象編程(OOP)和過程式編程,Python還優雅地支持一種強大而迷人的編程思想——函數式編程(Functional Programming, FP)。

第一章:函數式編程的核心思想——換個“大腦”看代碼

在深入代碼之前,我們必須先理解函數式編程的三個核心支柱。

(1) 可重復利用

你可以:

  • 將函數賦值給一個變量。
  • 將函數作為參數傳遞給另一個函數(高階函數)。
  • 將函數作為另一個函數的返回值。 這是Python實現函數式編程的基石。

(2) 數據不可變

我們傾向于不修改已存在的數據,而是創建新的數據。例如,不去修改一個列表,而是返回一個經過處理的新列表。這極大地減少了因數據狀態改變而引發的復雜性和潛在bug,尤其是在并發編程中。

(3) 函數獨立性

一個“純函數”(Pure Function)是指,對于相同的輸入,永遠產生相同的輸出,并且在這個過程中,不與外界發生任何交互(如修改全局變量、打印到控制臺、讀寫文件等)。這種函數就像一個封閉的數學公式,獨立、可預測、易于測試。

第二章:入門三劍客——map, filter, reduce

這三個函數是函數式編程的經典入門工具,它們能讓你用一種聲明式的方式來處理序列數據。

1. map():對序列中的每個元素應用同一個操作

想象一下,你想將一個列表中的所有數字都平方。用傳統的for循環,你會這么寫:

numbers = [1, 2, 3, 4, 5]
squared = []
for n in numbers:
    squared.append(n * n)
# squared -> [1, 4, 9, 16, 25]

而使用map,代碼會變得極其簡潔:

numbers = [1, 2, 3, 4, 5]
# map(function, iterable)
squared = list(map(lambda x: x * x, numbers))
# squared -> [1, 4, 9, 16, 25]

這里我們用了lambda來創建一個簡單的匿名函數。map的寫法,更像是在“聲明”一個意圖(“將平方操作映射到numbers上”),而不是描述具體的執行步驟。

更Pythonic的選擇:列表推導式在Python中,對于簡單的map操作,列表推導式通常更受歡迎,因為它更直觀:

squared = [n * n for n in numbers]

2. filter():篩選出序列中滿足條件的元素

假設你想從列表中篩選出所有的偶數。

傳統寫法:

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

使用filter:

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

同樣,列表推導式也能實現,并且更具可讀性:

evens = [n for n in numbers if n % 2 == 0]

3. reduce():對序列進行累積計算

reduce可能是三者中最不常用的一個,因為它在Python 3中被移入了functools模塊。它的作用是將一個接收兩個參數的函數,累積地應用到序列的元素上,從而將序列“減少”為一個單一的值。

例如,計算一個列表中所有數字的乘積:

from functools import reduce

numbers = [1, 2, 3, 4, 5]
# reduce(function, iterable)
product = reduce(lambda x, y: x * y, numbers)
# 過程: (((1*2)*3)*4)*5
# product -> 120

雖然reduce很強大,但Python之父Guido van Rossum認為,對于大多數場景,一個清晰的for循環更易于理解。因此,除非邏輯非常契合reduce的模式,否則不建議濫用。

第三章:進階的利器——functools模塊

functools模塊是Python函數式編程的“兵器庫”,它提供了一系列強大的高階函數和函數裝飾器。

1. functools.partial:凍結函數的參數

當你有一個多參數的函數,但希望在多次調用時,其中一些參數保持不變,partial就派上用場了。它能將一個函數的部分參數“凍結”起來,生成一個新的、更簡單的函數。

from functools import partial

def power(base, exponent):
    return base ** exponent

# 我們想創建一個專門計算平方的函數
square = partial(power, exponent=2)

# 創建一個專門計算立方的函數
cube = partial(power, exponent=3)

print(square(5))  # 輸出: 25 (相當于調用 power(5, exponent=2))
print(cube(5))    # 輸出: 125 (相當于調用 power(5, exponent=3))

partial在回調函數、事件處理等場景中非常有用,它能讓你的代碼更具模塊化和可復用性。

2. functools.wraps:優雅的裝飾器助手

當你編寫裝飾器時,一個常見的問題是,被裝飾后的函數,其元信息(如函數名__name__、文檔字符串__doc__)會丟失,變成了裝飾器內部函數的元信息。@functools.wraps就是為了解決這個問題而生的。

from functools import wraps

def my_decorator(func):
    @wraps(func)  # 關鍵!
    def wrapper(*args, **kwargs):
        """這是一個wrapper函數的文檔字符串"""
        print("Something is happening before the function is called.")
        result = func(*args, **kwargs)
        print("Something is happening after the function is called.")
        return result
    return wrapper

@my_decorator
def say_hello():
    """這是一個say_hello函數的文檔字符串"""
    print("Hello!")

print(say_hello.__name__)  # 輸出: 'say_hello' (如果沒有@wraps,會輸出'wrapper')
print(say_hello.__doc__)   # 輸出: '這是一個say_hello函數的文檔字符串'

編寫裝飾器時,可嘗試使用@functools.wraps。

3. functools.lru_cache:一行代碼實現緩存

這是一個極其強大的裝飾器,它可以為函數的結果提供一個LRU(Least Recently Used,最近最少使用)緩存。對于那些計算開銷大,且同樣輸入會得到同樣輸出的純函數,lru_cache能極大地提升性能。

最經典的例子就是斐波那契數列:

from functools import lru_cache
import time

@lru_cache(maxsize=None)  # maxsize=None表示緩存大小無限制
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)

# 測試性能
start_time = time.time()
print(fib(40))  # 幾乎是瞬間完成
print(f"Time with cache: {time.time() - start_time:.4f}s")

# 如果沒有@lru_cache,計算fib(40)會花費數十秒甚至更久

只需一行@lru_cache,就將一個指數級時間復雜度的遞歸,優化為了近乎線性的時間復雜度。

第四章:擁抱函數式思維,重塑你的代碼

掌握了工具,更重要的是轉變思維。在日常編碼中,我們可以如何應用函數式思想?

  • 優先使用列表/字典推導式,而不是手寫for循環來創建新的集合。
  • 多編寫小的、單一職責的純函數,然后像搭積木一樣將它們組合起來解決復雜問題。
  • 盡量避免修改傳入的參數(尤其是可變類型如列表、字典),而是返回一個新的、修改后的對象。
  • 對于復雜的函數調用鏈,考慮使用函數式編程風格,例如將多個操作串聯起來:
# 命令式風格
result = []
for item in data:
    if condition(item):
        transformed_item = transform(item)
        result.append(transformed_item)

# 函數式風格
result = list(map(transform, filter(condition, data)))
# 或者更Pythonic的推導式
result = [transform(item) for item in data if condition(item)]

函數式編程并非要取代面向對象編程,而是為我們提供了另一種看待和組織代碼的視角。

當你在處理數據集合,或者構建復雜的函數邏輯時,不妨嘗試用函數式的“大腦”來思考一下。或許你會發現,那些曾經冗長復雜的代碼,可以用一種驚人簡潔和優雅的方式來表達。

責任編輯:趙寧寧 來源: Python數智工坊
相關推薦

2023-11-23 13:50:00

Python代碼

2025-04-03 09:27:35

JavaScript開發IIFE

2022-03-11 12:14:43

CSS代碼前端

2023-07-10 09:39:02

lambdaPython語言

2025-02-10 00:25:00

命令模式擴展機制系統

2024-12-04 15:10:21

2024-03-28 14:29:46

JavaScript編程

2021-12-07 08:16:34

React 前端 組件

2018-07-12 14:20:33

SQLSQL查詢編寫

2024-08-20 14:25:20

2022-12-26 07:47:37

JDK8函數式接口

2024-04-02 08:00:00

函數式編程開發

2024-02-23 08:57:42

Python設計模式編程語言

2022-09-27 15:34:05

VSCode插件開發

2024-12-19 09:05:13

Python鏈式調用

2025-04-21 17:55:25

2019-07-31 10:24:16

JavaScript瀏覽器口袋妖怪

2020-05-11 15:23:58

CQRS代碼命令

2021-01-04 05:46:08

代碼編程重構

2020-04-03 14:55:39

Python 代碼編程
點贊
收藏

51CTO技術棧公眾號

亚洲午夜久久久| 日韩免费在线看| 亚洲欧美se| 久久久成人av| 久久精品国产大片免费观看| 极品日韩久久| 成人精品亚洲人成在线| 全部a∨一极品视觉盛宴| 欧美伊人久久大香线蕉综合69 | 欧美成人免费在线观看| 青青草91久久久久久久久| 欧美日韩综合网| 国产清纯白嫩初高生在线观看91| 亚洲kkk444kkk在线观看| 精品美女在线观看| 色吊丝一区二区| 亚洲成人午夜在线| 亚洲最色的网站| 久久青青视频| 亚洲已满18点击进入在线看片| 国产成人av在线影院| 领导边摸边吃奶边做爽在线观看 | 欧美va亚洲va日韩∨a综合色| 夜夜嗨av色综合久久久综合网| 国产伦理久久久久久妇女| 国产综合精品一区二区三区| 久久免费看少妇高潮| 欧美成人性生活视频| 久久97精品久久久久久久不卡| 亚洲精品女人| 成人性生交免费看| 亚洲国产精品久久久久久| 激情五月色综合国产精品| 青青草免费在线视频观看| 欧美日韩美女在线观看| 电影一区中文字幕| 日本一区二区三区精品视频| 亚洲免费观看高清完整版在线观看 | 国产曰批免费观看久久久| 日本aⅴ中文| 一个色综合导航| 在线免费观看日本欧美爱情大片| 国产主播精品| 久久久久国产一区| 日韩情涩欧美日韩视频| 亚洲大奶少妇| 欧美日韩精品免费观看| av电影一区二区| 波多野结衣50连登视频| 欧美色道久久88综合亚洲精品| 天堂√8在线中文| 九九久久99| 色噜噜狠狠色综合网图区 | 在线看的你懂得| 7777女厕盗摄久久久| 欧洲精品99毛片免费高清观看 | 我不卡影院28| 免费污视频在线| 极品粉嫩国产18尤物| 俺也去精品视频在线观看| 亚洲欧美日韩一区| 亚洲一级在线| 欧美一区二区三区| 久久久国产精品一区二区三区| 欧美午夜视频一区二区| 国产精品7m凸凹视频分类| 亚洲精品国产嫩草在线观看| 一级欧美视频| 川上优av中文字幕一区二区| 国产成人av影视| 51精品国产人成在线观看| 久久久成人av| 欧美日韩专区在线| 激情综合网最新| 丝袜诱惑制服诱惑色一区在线观看 | 羞羞的网站在线观看| 免费黄色av电影| 色婷五月综激情亚洲综合| igao视频网在线视频| 黄色动漫在线免费看| 日本一区二区不卡高清更新| 97精品伊人久久久大香线蕉 | 在线天堂资源www在线污| 一区国产精品| 日韩电影免费观看高清完整| 不卡视频一区二区| 国产精品永久免费观看| 两个人的视频www国产精品| 色悠悠久久久久| 成人h猎奇视频网站| 亚洲一区二区三区在线观看视频| 国产精品视频网站在线观看| 亚洲精品日韩在线观看| 国产专区在线视频| 国产欧美在线播放| 国产一级爱c视频| 亚洲欧美日韩另类精品一区二区三区| 亚洲精品色图| yourporn在线观看中文站| 国产精品久久久久av免费| 亚洲一区二区三区四区五区中文| 蜜桃视频欧美| 绯色av一区二区| 91久久精品无嫩草影院| 日本欧美大码aⅴ在线播放| 一本大道综合伊人精品热热| 91丝袜美腿高跟国产极品老师 | 国精产品一区| 久久久久一区二区三区| 欧美乱妇一区二区三区不卡视频| 亚洲一区二区三区免费在线观看| 手机在线免费av| 高清无码视频直接看| 欧美激情按摩在线| 欧美日韩免费网站| 亚洲欧美日韩精品一区二区| 国产白丝在线观看| 日韩av一二三四区| 日本sm极度另类视频| 日本韩国欧美一区| 精品一区二区三区在线观看| 色天使综合视频| 黄色三级高清在线播放| 精品国产一区二区三| 一区国产精品视频| 最近日韩中文字幕| 国产精品一页| 91麻豆精品国产综合久久久| 天天草夜夜草| 偷拍视频一区二区| 久久久久久久电影一区| 欧洲亚洲国产日韩| 国产99久久久国产精品潘金| 蜜桃精品wwwmitaows| 性欧美高清come| 国产高清视频网站| 国产在线一区二区三区欧美| 在线亚洲国产精品网| 亚洲自拍偷拍九九九| 奇米影视一区二区三区小说| 国产精品videossex| 麻豆最新免费在线视频| 免费在线激情视频| 91久久偷偷做嫩草影院| 亚洲免费视频一区二区| 亚洲一区二区三区四区在线免费观看| 美女视频一区二区三区| 亚洲制服欧美另类| 性国裸体高清亚洲| 亚洲免费av一区二区| 黄色小视频大全| 91免费版网站入口| 久久精品一偷一偷国产| 欧美日韩色一区| 国产精品欧美久久久久无广告| 99精品热6080yy久久| 日韩精品中文字幕吗一区二区| 在线观看av黄网站永久| 无码人妻丰满熟妇区五十路百度| 国产精品视频入口| 欧美激情视频在线观看| 精品欧美乱码久久久久久1区2区| 亚洲精品欧美二区三区中文字幕| 精品无人码麻豆乱码1区2区 | 婷婷国产v国产偷v亚洲高清| 国产福利精品一区二区| 第四色成人网| 日韩城人网站| 麻豆视频网站在线观看| 97看剧电视剧大全| 欧美 国产 精品| 国产精品一区二区三区免费观看| 欧美高清一级大片| 日韩成人激情视频| 欧美日韩一区二区三区四区| 一区二区中文视频| 丰满白嫩尤物一区二区| 奶水喷射视频一区| 久久精品青草| 免费看成人哺乳视频网站| 国产精品黄色片| 超碰在线97国产| 美女免费久久| 国产youjizz在线| 操操操综合网| 第四色亚洲色图| 国产精品97在线| 日本男女交配视频| 亚洲人成77777| 久久精品aaaaaa毛片| 成人福利网站在线观看| 97精品在线观看| 久久人人爽人人爽人人片av高请 | 免费一区二区三区在在线视频| 国产精品久久国产精品99gif| 欧美成人在线影院| 伊人伊人伊人久久| 亚洲国产精品免费| 亚洲大胆人体视频| 精品国产乱码久久久久久影片|