簡(jiǎn)析Python函數(shù)式編程字符串和元組及函數(shù)分類與高階函數(shù)
函數(shù)式編程中的字符串
在函數(shù)式編程中,經(jīng)常用到 Python 字符串,因其是不可變數(shù)據(jù)結(jié)構(gòu)。
字符串本身是一個(gè)對(duì)象,具備很多對(duì)象方法,與常識(shí)中函數(shù)的使用不太相同,例如下述代碼
my_str = "xiangpica" print(my_str.upper()) print(len(my_str.upper()))
其中 len()
函數(shù)的用法被稱為前置寫法,而 my_str.upper()
被稱為后置寫法,這樣很容易造成函數(shù)式編程的理解問(wèn)題,所以需要系統(tǒng)性的解決該問(wèn)題。
如果上述代碼可以修改為 len(upper(my_str))
,就變得相對(duì)容易理解。
# 類型 Text 是 str 的別名 from typing import Text my_str = "xiangpica" def upper(str: Text) -> Text: return str.upper() print(upper(my_str)) print(len(upper(my_str)))
上述代碼重新定義了一個(gè)前置用法的函數(shù) upper
,用于解決函數(shù)式編程中的一致性問(wèn)題,該解決辦法在后續(xù)代碼中會(huì)經(jīng)常出現(xiàn)。
不變類型元組
除字符串外,Python 中的另一個(gè)不可變數(shù)據(jù)類型為元組,元組分為普通元組與命名元組。
普通元組的聲明與訪問(wèn)
在之前的文章中對(duì)元組的基本知識(shí),已經(jīng)進(jìn)行了說(shuō)明,可以去稍微復(fù)習(xí)一下,然后在進(jìn)入本文的學(xué)習(xí)。
先看一下代碼,然后再判斷是否可以理解。
from typing import Tuple, Text, Callable LANGUAGE = Tuple[Text, Text, Text] python: Callable[[LANGUAGE], Text] = lambda languages: languages[1] items = ("c","python","js") a = python(items) print(a)
上述代碼定義了一個(gè)新的類型 LANGUAGE
,該類型是一個(gè)元組,具備三個(gè)元素。
python
類型注解是 Callable[[LANGUAGE], Text]
,即它的參數(shù)是 LANGUAGE
類型,返回值是字符串類型。
注意 typing
模塊加入不會(huì)影響程序的運(yùn)行不會(huì)報(bào)正式的錯(cuò)誤,僅作為類型檢查,防止運(yùn)行時(shí)出現(xiàn)參數(shù)、返回值類型不符,開發(fā)人員查閱。
除上述內(nèi)容外,還可以使用命名元組來(lái)實(shí)現(xiàn)。
from collections import namedtuple Language = namedtuple("Language",("name1", "name2", "name3")) l = Language("c", "python", "js") print(l) print(l.name1)
或者直接使用 typing
模塊的 NamedTuple
也可以。
from typing import NamedTuple, Text class Language(NamedTuple): name: Text description: Text l = Language("C", "C語(yǔ)言") print(l) print(l.name) print(l.description)
函數(shù)式的分類
函數(shù)大類分為兩種:
- 標(biāo)量函數(shù):函數(shù)的返回結(jié)果為一個(gè)值;
- 集合函數(shù):函數(shù)的結(jié)果為可迭代的集合。
集合函數(shù)也可以細(xì)分:
- 規(guī)約/累積函數(shù):將集合內(nèi)的元素進(jìn)行累積計(jì)算,最后得到一個(gè)值;
- 映射函數(shù):將標(biāo)量函數(shù)應(yīng)用于幾個(gè)的每個(gè)元素,最后得到一個(gè)與原集合相同長(zhǎng)度的新集合;
- 過(guò)濾函數(shù):將標(biāo)量函數(shù)應(yīng)用于每個(gè)元素,保留一部分,得到一個(gè)子集。
有了上述概念之后,對(duì)于函數(shù)式編程的理解可以更進(jìn)一步。
any() 、all() 、len()、sum() 對(duì)比學(xué)習(xí)
any
與 all
兩個(gè)函數(shù)屬于規(guī)約函數(shù),進(jìn)行的操作叫做布爾規(guī)約,即將一個(gè)集合的元素歸約為 True 或者 False,all
需要所有值都是 True,any
只要有一個(gè)值是 True 即可。
len
與 sum
也是歸約函數(shù),它們分別表示計(jì)算集合中所有值的個(gè)數(shù)和匯總值。
zip()、reversed()、enumerate()
zip
函數(shù)可以把多個(gè)可迭代對(duì)象或者序列,之間的數(shù)據(jù)進(jìn)行交叉組合,即將 n 個(gè)元素的可迭代對(duì)象轉(zhuǎn)換為 n 元組,然后返回一個(gè)生成器。
如果 zip
函數(shù)沒(méi)有輸入?yún)?shù),那將返回一個(gè)空列表 []
。
a = zip() print(list(a))
reversed
函數(shù)用于改變序列順序,即反轉(zhuǎn)序列。
enumerate
函數(shù)獲取序列或者可迭代對(duì)象的下標(biāo)值,轉(zhuǎn)換成概念描述就是將可迭代對(duì)象映射為二元組序列(帶上序號(hào)了),每個(gè)二元組序列中,第一個(gè)元素是下標(biāo)值,第二個(gè)元素是值本身。
高階函數(shù)
學(xué)習(xí) Python 函數(shù)式編程,繞不開高階函數(shù)的學(xué)習(xí),高階函數(shù)就是以函數(shù)為參數(shù),或者以返回值為函數(shù)的函數(shù)。
函數(shù) max 和 min()
上述兩個(gè)函數(shù)是規(guī)約函數(shù),即輸入的是集合,輸出的是單個(gè)值,主要用途就是尋找極值。
一般在學(xué)習(xí)的時(shí)候,可以把二者當(dāng)成普通的函數(shù),也可用于高階函數(shù),主要為參數(shù)位置的差異。
最簡(jiǎn)單的用法為:
max_num = max(1, 2, 3, 4) min_num = min(1, 2, 3, 4) print(max_num) print(min_num)
接下來(lái)就是其高階函數(shù)模式的實(shí)現(xiàn),自定義比較規(guī)則。
# 第一種寫法,比較字符串長(zhǎng)度 max_num = max("a", "abc", "ceda", "aaaaa", key=lambda x: len(x)) min_num = min("a", "abc", "ceda", "aaaaa", key=lambda x: len(x)) print(max_num) print(min_num) # 第二種寫法,比較字符串長(zhǎng)度 max_num = max(["a", "abc", "ceda", "aaaaa"], key=lambda x: len(x)) min_num = min(["a", "abc", "ceda", "aaaaa"], key=lambda x: len(x)) print(max_num) print(min_num)
上述代碼的 key
為可選參數(shù),默認(rèn)值為 None。
map 函數(shù)
map
函數(shù)用于將一個(gè)集合映射到另一個(gè)集合,例如可以將一個(gè)由字符串組成的列表中的每一項(xiàng),都轉(zhuǎn)換為整數(shù)。
data = ["1", "2", "3"] print(map(int, data)) print(list(map(int, data)))
代碼 map(int, data)
的含義就是將 int
函數(shù)作用于 data
中的每一項(xiàng)。
map
函數(shù)的第一個(gè)參數(shù)也可以用 lambda
代替。
data = ["1", "2", "3"] print(map(lambda x: int(x), data)) print(list(map(int, data)))
filter 函數(shù)
filter
函數(shù)主要用于將一個(gè)**判定函數(shù)(謂語(yǔ)函數(shù))**用于集合的每一個(gè)元素,最后得到滿足判定函數(shù)的結(jié)果集,測(cè)試代碼如下:
data = [1, 3, 5, 7, 9] print(filter(lambda x: x > 3, data)) print(list(filter(lambda x: x > 3, data)))
sorted 函數(shù)
sorted
函數(shù)也支持高階函數(shù) key
參數(shù)定制規(guī)則。
result = sorted(["afghsss", "abc", "ceda", "aaaaa"], key=lambda x: len(x)) print(result)
同一需求的不同效率問(wèn)題
通過(guò) map
函數(shù),生成器表達(dá)式,存在迭代器的生成器函數(shù)分別多 一億 數(shù)據(jù)量的列表進(jìn)行測(cè)試。
import time def demo(x): return x * 2 def demo1(f, l): for x in l: yield f(x) my_list = list(range(1, 10000000)) start = time.perf_counter() # map(lambda x: x * 2, my_list) # 程序運(yùn)行耗時(shí) 3.904999999998493e-06 # (demo(x) for x in my_list) # 程序運(yùn)行耗時(shí) 6.310000000009364e-06 demo1(demo, my_list) # 程序運(yùn)行耗時(shí) 5.1070000000041915e-06 cost_time = time.perf_counter() - start print("程序運(yùn)行耗時(shí)", cost_time)
得到的結(jié)果是 map
最快,所以用就完事了。
以上就是簡(jiǎn)析Python函數(shù)式編程字符串和元組及函數(shù)分類與高階函數(shù)的詳細(xì)內(nèi)容,更多關(guān)于Python函數(shù)式編程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python?4種實(shí)現(xiàn)定時(shí)任務(wù)的方案
這篇文章主要給大家分享了Python?4種實(shí)現(xiàn)定時(shí)任務(wù)的方案,運(yùn)用 while True: + sleep()、Timeloop 庫(kù)、threading.Timer 、內(nèi)置模塊 sched ,下面就來(lái)看看具體的實(shí)現(xiàn)過(guò)程吧2021-12-12Python中requests模塊的請(qǐng)求參數(shù)詳解
這篇文章主要介紹了Python中requests模塊的請(qǐng)求參數(shù)詳解,requests模塊是一個(gè)網(wǎng)絡(luò)請(qǐng)求模塊,可以幫助我們模擬成客戶端去請(qǐng)求服務(wù)器的數(shù)據(jù),我們今天就是主要針對(duì)這個(gè)模塊進(jìn)行學(xué)習(xí),需要的朋友可以參考下2023-08-08關(guān)于python變量的引用以及在底層存儲(chǔ)原理
Python的變量,簡(jiǎn)單來(lái)說(shuō)有數(shù)值型,布爾型,字符串類型,列表,元組,字典等6大類。那么不同變量類型在底層是如何存儲(chǔ)的,關(guān)系到變量的引用,能否正確的掌握變量的相關(guān)操作?接下來(lái)小編就來(lái)為大家講解python變量的引用以及在底層存儲(chǔ)原理,需要的朋友可以參考一下2021-09-09OpenCV-Python實(shí)現(xiàn)人臉美白算法的實(shí)例
人臉美白原理說(shuō)透了,就是一種圖像的顏色空間處理,所以我們需要通過(guò)顏色空間進(jìn)行設(shè)計(jì)。本文就詳細(xì)的介紹一下,感興趣的可以了解一下2021-06-06python實(shí)現(xiàn)簡(jiǎn)單銀行管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單銀行管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10Python實(shí)現(xiàn)簡(jiǎn)單生成驗(yàn)證碼功能【基于random模塊】
這篇文章主要介紹了Python實(shí)現(xiàn)簡(jiǎn)單生成驗(yàn)證碼功能,結(jié)合實(shí)例形式分析了Python基于random模塊生成隨機(jī)字符串的相關(guān)操作技巧,需要的朋友可以參考下2018-02-02