摘要:項(xiàng)目地址中的函數(shù)式編程函數(shù)式編程英語或稱函數(shù)程序設(shè)計(jì),又稱泛函編程,是一種編程范型,它將電腦運(yùn)算視為數(shù)學(xué)上的函數(shù)計(jì)算,并且避免使用程序狀態(tài)以及易變對象。
項(xiàng)目地址:https://git.io/pytips
Python 中的函數(shù)式編程函數(shù)式編程(英語:functional programming)或稱函數(shù)程序設(shè)計(jì),又稱泛函編程,是一種編程范型,它將電腦運(yùn)算視為數(shù)學(xué)上的函數(shù)計(jì)算,并且避免使用程序狀態(tài)以及易變對象。函數(shù)編程語言最重要的基礎(chǔ)是λ演算(lambda calculus)。而且λ演算的函數(shù)可以接受函數(shù)當(dāng)作輸入(引數(shù))和輸出(傳出值)。(維基百科:函數(shù)式編程)
所謂編程范式(Programming paradigm)是指編程風(fēng)格、方法或模式,比如面向過程編程(C語言)、面向?qū)ο缶幊蹋–++)、面向函數(shù)式編程(Haskell),并不是說某種編程語言一定屬于某種范式,例如 Python 就是多范式編程語言。
函數(shù)式編程函數(shù)式編程具有以下特點(diǎn):
避免狀態(tài)變量
函數(shù)也是變量(一等公民,F(xiàn)irst-Class Citizen)
高階函數(shù)
面向問題描述而不是面向問題解決步驟
值得一提的是,函數(shù)式編程的這些特點(diǎn)在實(shí)踐過程中可能并不是那么 Pythonic,甚至與0x00中提到的 The Zen of Python 相悖。例如函數(shù)式編程面向問題描述的特點(diǎn)可能讓你更快地寫出更簡潔的代碼,但可讀性卻也大打折扣(可參考這一段Haskell代碼)。不過,雖然 Pythonic 很重要但并不是唯一的準(zhǔn)則,_The Choice Is Yours_。
map(function, iterable, ...)/filter(function, iterable)# map 函數(shù)的模擬實(shí)現(xiàn) def myMap(func, iterable): for arg in iterable: yield func(arg) names = ["ana", "bob", "dogge"] print(map(lambda x: x.capitalize(), names)) # Python 2.7 中直接返回列表 for name in myMap(lambda x: x.capitalize(), names): print(name)
# filter 函數(shù)的模擬實(shí)現(xiàn) def myFilter(func, iterable): for arg in iterable: if func(arg): yield arg print(filter(lambda x: x % 2 == 0, range(10))) # Python 2.7 中直接返回列表 for i in myFilter(lambda x: x % 2 == 0, range(10)): print(i)
functools.reduce(function, iterable[, initializer])0 2 4 6 8
Python 3.5 中reduce 被降格到標(biāo)準(zhǔn)庫functools,reduce 也是遍歷可迭代對象元素作為第一個(gè)函數(shù)的參數(shù),并將結(jié)果累計(jì):
from functools import reduce print(reduce(lambda a, b: a*b, range(1,5)))
24functools.partial(func, *args, **keywords)
偏應(yīng)用函數(shù)(Partial Application)讓我們可以固定函數(shù)的某些參數(shù):
from functools import partial add = lambda a, b: a + b add1024 = partial(add, 1024) add1024(1)
1025
這里簡單介紹了一些常用函數(shù)式編程的方法和概念,實(shí)際上要傳達(dá)的一個(gè)最重要的觀念就是函數(shù)本身也可以作為變量被返回、傳遞給高階函數(shù),這使得我們可以更靈活地運(yùn)用函數(shù)解決問題。但是這并不意味著一定要使用上面這些方法來簡化代碼,例如更 Pythonic 的方法推薦盡可能使用 List Comprehension 替代map/filter(關(guān)于 List Comprehension 后面會(huì)再多帶帶介紹)。如果一定想要用函數(shù)式編程的方法來寫 Python,也可以嘗試Fn.py,或者,試試 Haskell。
參考維基百科:函數(shù)式編程
byvoid:APIO講稿——函數(shù)式編程
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/37797.html
摘要:項(xiàng)目地址閉包在計(jì)算機(jī)科學(xué)中,閉包英語,又稱詞法閉包或函數(shù)閉包,是引用了自由變量的函數(shù)。這個(gè)被引用的自由變量將和這個(gè)函數(shù)一同存在,即使已經(jīng)離開了創(chuàng)造它的環(huán)境也不例外。 項(xiàng)目地址:https://git.io/pytips 閉包(Closure) 在計(jì)算機(jī)科學(xué)中,閉包(英語:Closure),又稱詞法閉包(Lexical Closure)或函數(shù)閉包(function closures),是...
摘要:借鑒了中的某些迭代器的構(gòu)造方法,并在中實(shí)現(xiàn)該模塊是通過實(shí)現(xiàn),源代碼。 項(xiàng)目地址:https://git.io/pytips 0x01 介紹了迭代器的概念,即定義了 __iter__() 和 __next__() 方法的對象,或者通過 yield 簡化定義的可迭代對象,而在一些函數(shù)式編程語言(見 0x02 Python 中的函數(shù)式編程)中,類似的迭代器常被用于產(chǎn)生特定格式的列表(或序列)...
摘要:項(xiàng)目地址提供兩種內(nèi)置排序方法,一個(gè)是只針對的原地排序方法,另一個(gè)是針對所有可迭代對象的非原地排序方法。 項(xiàng)目地址:https://git.io/pytips Python 提供兩種內(nèi)置排序方法,一個(gè)是只針對 List 的原地(in-place)排序方法 list.sort(),另一個(gè)是針對所有可迭代對象的非原地排序方法 sorted()。 所謂原地排序是指會(huì)立即改變被排序的列表對象,就...
摘要:項(xiàng)目地址列表推導(dǎo)中提到的方法可以通過簡化的語法快速構(gòu)建我們需要的列表或其它可迭代對象,與它們功能相似的,還提供列表推導(dǎo)的語法。 項(xiàng)目地址:https://git.io/pytips 0x03 - Python 列表推導(dǎo) 0x02 中提到的 map/filter 方法可以通過簡化的語法快速構(gòu)建我們需要的列表(或其它可迭代對象),與它們功能相似的,Python 還提供列表推導(dǎo)(List C...
項(xiàng)目地址:https://git.io/pytips Python 的修飾器是一種語法糖(Syntactic Sugar),也就是說: @decorator @wrap def func(): pass 是下面語法的一種簡寫: def func(): pass func = decorator(wrap(func)) 關(guān)于修飾器的兩個(gè)主要問題: 修飾器用來修飾誰 誰可以作為修飾器...
閱讀 1349·2021-09-28 09:43
閱讀 4115·2021-09-04 16:41
閱讀 1917·2019-08-30 15:44
閱讀 3728·2019-08-30 15:43
閱讀 775·2019-08-30 14:21
閱讀 2037·2019-08-30 11:00
閱讀 3319·2019-08-29 16:20
閱讀 1923·2019-08-29 14:21