關于python3中的包operator(支持函數式編程的包)

文章目錄

  • 1.functools
  • 2.operator.itemgetter
  • 3.operator.attrgetter

雖然 Guido 明確表明,Python 的目標不是變成函數式編程語言,但是得益于 operator 和
functools 等包的支持,函數式編程風格也可以信手拈來。接下來的兩節分別介紹這兩
個包。

1.functools

示例1 使用 reduce 函數和一個匿名函數計算階乘

from functools import reduce
def fact(n):
return reduce(lambda a, b: a*b, range(1, n+1))

operator 模塊為多個算術運算符提供了對應的函數,從而避免編寫 lambda a, b: a*b
這種平凡的匿名函數。使用算術運算符函數,可以把示例 5-21 改寫成示例 5-22 那樣。
示例 2使用 reduce 和 operator.mul 函數計算階乘:

from functools import reduce
from operator import mul
def fact(n):
return reduce(mul, range(1, n+1))

2.operator.itemgetter

operator 模塊中還有一類函數,能替代從序列中取出元素或讀取對象屬性的 lambda 表
達式:因此,itemgetter 和 attrgetter 其實會自行構建函數。

示例3 演示使用 itemgetter 排序一個元組列表

from operator import itemgetter
metro_data = [('Tokyo', 'JP', 36.933, (35.689722, 139.691667)),
('Delhi NCR', 'IN', 21.935, (28.613889, 77.208889)),
('Mexico City', 'MX', 20.142, (19.433333, -99.133333)),
('New York-Newark', 'US', 20.104, (40.808611, -74.020386)),
('Sao Paulo', 'BR', 19.649, (-23.547778, -46.635833)),]
for city in sorted(metro_data, key=itemgetter(1)):print(city)

itemgetter(1) 的作用與 lambda fields: fields[1] 一樣:創建一個接受集合
的函數,返回索引位 1 上的元素。

示例4 如果把多個參數傳給 itemgetter,它構建的函數會返回提取的值構成的元組:

from operator import itemgetter
metro_data = [
('Tokyo', 'JP', 36.933, (35.689722, 139.691667)),
('Delhi NCR', 'IN', 21.935, (28.613889, 77.208889)),
('Mexico City', 'MX', 20.142, (19.433333, -99.133333)),
('New York-Newark', 'US', 20.104, (40.808611, -74.020386)),
('Sao Paulo', 'BR', 19.649, (-23.547778, -46.635833)),
]
cc_name = itemgetter(1, 0, 1, 2)
for city in metro_data:print(cc_name(city))'''  ('JP', 'Tokyo', 'JP', 36.933)('IN', 'Delhi NCR', 'IN', 21.935)('MX', 'Mexico City', 'MX', 20.142)('US', 'New York-Newark', 'US', 20.104)('BR', 'Sao Paulo', 'BR', 19.649)'''itemgetter 使用 [] 運算符,因此它不僅支持序列,還支持映射和任何實現__getitem__ 方法的類。

3.operator.attrgetter

attrgetter 與 itemgetter 作用類似,它創建的函數根據名稱提取對象的屬性。
如果把多個屬性名傳給 attrgetter,它也會返回提取的值構成的元組。此外,如果參數名中包
含 .(點號),attrgetter 會深入嵌套對象,獲取指定的屬性。

from collections import namedtuple
from operator import attrgetter
metro_data = [
('Tokyo', 'JP', 36.933, (35.689722, 139.691667)),
('Delhi NCR', 'IN', 21.935, (28.613889, 77.208889)),
('Mexico City', 'MX', 20.142, (19.433333, -99.133333)),
('New York-Newark', 'US', 20.104, (40.808611, -74.020386)),
('Sao Paulo', 'BR', 19.649, (-23.547778, -46.635833)),
]
LatLong = namedtuple('LatLong', 'lat long')
Metropolis = namedtuple('Metropolis', 'name cc pop coord')
metro_areas = [Metropolis(name, cc, pop, LatLong(lat, long))for name, cc, pop, (lat, long) in metro_data]
print(metro_areas[0])
print(metro_areas[0].coord.lat)
name_lat = attrgetter('name', 'coord.lat')
for city in sorted(metro_areas, key=attrgetter('coord.lat')):print(name_lat(city))# 輸出
Metropolis(name='Tokyo', cc='JP', pop=36.933, coord=LatLong(lat=35.689722, long=139.691667))
35.689722
('Sao Paulo', -23.547778)
('Mexico City', 19.433333)
('Delhi NCR', 28.613889)
('Tokyo', 35.689722)
('New York-Newark', 40.808611)

下面是 operator 模塊中定義的部分函數(省略了以 _ 開頭的名稱,因為它們基本上是實
現細節)

import operator
te = [name for name in dir(operator) if not name.startswith('_')]
print(te)
#['abs', 'add', 'and_', 'attrgetter', 'concat', 'contains', 'countOf', 'delitem', 'eq', 'floordiv', 'ge', 'getitem', 'gt', 'iadd', 'iand', 'iconcat', 'ifloordiv', 'ilshift', 'imatmul', 'imod', 'imul', 'index', 'indexOf', 'inv', 'invert', 'ior', 'ipow', 'irshift', 'is_', 'is_not', 'isub', 'itemgetter', 'itruediv', 'ixor', 'le', 'length_hint', 'lshift', 'lt', 'matmul', 'methodcaller', 'mod', 'mul', 'ne', 'neg', 'not_', 'or_', 'pos', 'pow', 'rshift', 'setitem', 'sub', 'truediv', 'truth', 'xor']

以 i 開頭、后面是另一個運算符的那些名稱(如iadd、iand 等),對應的是增量賦值運算符(如 +=、&= 等)。如果第一個參數是可變的,那么這些運算符函數會就地修改它;否則,作用與不帶 i 的函數一樣,直接返回運算結果。

在 operator 模塊余下的函數中,我們最后介紹一下 methodcaller。它的作用與attrgetter 和 itemgetter 類似,它會自行創建函數。methodcaller 創建的函數會在對象上調用參數指定的方法,如下例子:
示例 5methodcaller 使用示例:第二個測試展示綁定額外參數的方式:

from operator import methodcaller
s = 'The time has come'
upcase = methodcaller('upper')
print(upcase(s))
hiphnate = methodcaller('replace', ' ', '-')
print(hiphnate(s))
#輸出
THE TIME HAS COME
The-time-has-come

functools 模塊提供了一系列高階函數,其中最為人熟知的或許是 reduce,
我們在 5.2.1節已經介紹過。余下的函數中,最有用的是 partial 及其變體,partialmethod。
functools.partial 這個高階函數用于部分應用一個函數。**部分應用是指,基于一個函數創建一個新的可調用對象,把原函數的某些參數固定。**使用這個函數可以把接受一個或多個參數的函數改編成需要回調的 API,這樣參數更少。
示例 5-26 做了簡單的演示。

from operator import mul
from functools import partial
triple = partial(mul, 3)
print(triple(7))
print(list(map(triple, range(1, 10))))
#21
#[3, 6, 9, 12, 15, 18, 21, 24, 27]

示例 5-28 在示例 5-10 中定義的 tag 函數上使用 partial,凍結一個定位參數和一個關鍵
字參數。
示例 5-28 把 partial 應用到示例 5-10 中定義的 tag 函數上:

from functools import partial
def tag(name, *content, cls=None, **attrs):"""生成一個或多個HTML標簽"""if cls is not None:attrs['class'] = clsif attrs:attr_str = ''.join(' %s="%s"' % (attr, value)for attr, value in sorted(attrs.items()))else:attr_str = ''if content:return '\n'.join('<%s%s>%s</%s>' %(name, attr_str, c, name) for c in content)else:return '<%s%s />' % (name, attr_str)print(tag)
picture = partial(tag, 'img', cls='pic-frame')
print(picture(src='wumpus.jpeg'))
print(picture)
print(picture.func)
print(picture.args)
print(picture.keywords)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273812.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273812.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273812.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

collections 中的namedtuple

文章目錄namedtuple 基本用法namedtuple特性_make(iterable)_asdict()_replace(**kwargs)_fields_fields_defaults參考&#xff1a;namedtuple 基本用法 Tuple還有一個兄弟&#xff0c;叫namedtuple。雖然都是tuple&#xff0c;但是功能更為強大。對于namedtuple&#xff0c;你…

abap 中modify 的使用

1、modify table itab from wa Transporting f1 f2 ... 表示表itab中符合工作區wa 中關鍵字的一條數據的 f1 f2字段會被wa中對應的字段值更新。 modify用于更新和新增數據&#xff0c;當表中沒有數據時就新增&#xff0c;有就修改。 2、在使用binary search 時一定要先排序&am…

python[進階] 6.使用一等函數實現設計模式

文章目錄6.1.1 經典的“策略”模式6.1.2 使用函數實現“策略”模式6.1.3 選擇最佳策略&#xff1a;簡單的6.1.4 找出模塊中的全部6.2 “命令”模式6.1.1 經典的“策略”模式 為抽象基類&#xff08;Abstract Base Class&#xff0c;ABC&#xff09;&#xff0c;這么做是為了使…

2014阿里巴巴校園招聘筆試題 - 中南站

轉載于:https://www.cnblogs.com/gotodsp/articles/3530329.html

python中一些特殊方法的作用

我們先暫且稱呼為特殊方法。 單下劃線開頭&#xff08;_foo&#xff09;雙下劃線開頭的&#xff08;__foo&#xff09;雙下劃線開頭和結尾的&#xff08; __foo__&#xff09;代表不能直接訪問的類屬性&#xff0c;需通過類提供的接口進行訪問&#xff0c;不能用“from xxx im…

Spring的IOC原理[通俗解釋一下]

1. IoC理論的背景 我們都知道&#xff0c;在采用面向對象方法設計的軟件系統中&#xff0c;它的底層實現都是由N個對象組成的&#xff0c;所有的對象通過彼此的合作&#xff0c;最終實現系統的業務邏輯。 圖1&#xff1a;軟件系統中耦合的對象 如果我們打開機械式手表的后蓋&am…

python爬蟲面試遇到的問題

文章目錄&#xff11;python基礎1.1 列表生成式和生成器的區別 &#xff1f;1.2 如何不用任何循環快速篩掉列表中的奇數元素 &#xff1f;1.3 map和reduce的用法1.4 裝飾器的作用1.5 Python中__new__與__init方法的區別1.6 python中的設計模式1.7 lambda函數&#xff0c;以及它…

ubuntu18 常用命令

文章目錄卸載和安裝卸載和安裝 1.打開一個終端&#xff0c;輸入dpkg --list ,按下Enter鍵&#xff0c;終端輸出以下內容&#xff0c;顯示的是你電腦上安裝的所有軟件。 2.安裝 dpkg –i name.deb 安裝一個 deb 包&#xff1b;在終端上輸入命令sudo apt-get --purge remove 包…

以嵌入式系統設計師考試成績,開始嵌入式博客之旅

http://www.rkb.gov.cn/jsj/cms/s_contents/download/s_dt201003110106.html 轉載于:https://www.cnblogs.com/yueqian-scut/p/3952268.html

SSH框架配置及Maven使用

1.SSH框架配置 1.1. SSH框架介紹 1.2. SSH框架配置 所需資源下載&#xff1a; l jdk; 從Oracle官方網站&#xff1a;http://www.oracle.com/technetwork/cn/java/javase/downloads/index.html下載jdk&#xff0c;win7是默認安裝在C:\Program Files (x86)\Java\jdk1.6.0_25路徑下…

cookie,session的區別和聯系(補充token)

文章目錄1 http為什么是無狀態的2 cookie 和session 的區別詳解3 token參考&#xff1a;備注: 博客文章僅限于學習&#xff0c;禁止商用1 http為什么是無狀態的 2 cookie 和session 的區別詳解 這些都是基礎知識&#xff0c;不過有必要做深入了解。先簡單介紹一下。 二者的定…

庫函數和系統調用的區別

前言 這是一對非常容易混淆的概念。對于用戶( 應用程序開發者 )來說&#xff0c;并不一定要嚴格區分其意義。因為在用戶看來&#xff0c;它們都是以C函數的形式出現的。但了解二者的區別對我們掌握整個計算機系統有很大幫助。 區別 1. 一部分庫函數實現需要使用系統調用( 如 pr…

Flask 從入門到熟悉(不敢稱為精通)

文章目錄2.1 Flask介紹及其安裝2.2 Virtualenv3.1 一個最小的應用3.2 外部課件服務器3.3 調試模式4.1 路由介紹4.2 變量規則4.3 構建URL4.4 HTTP 方法4 總結5.1 靜態文件5.2 渲染模板5.3 練習66.1 接收請求數據6.2 請求對象6.3 文件上傳6.4 Cookies6 總結77.1 重定向和錯誤7.2 …

Ext JS 5 beta版發布

原文&#xff1a;Announcing Public Beta of Ext JS 5我們非常高興的宣布&#xff0c;Sencha Ext JS 5 beta版本開始進行公測了。這個beta版本可以讓你、我們Sencha社區來對我們的Ext JS 5的工作進度進行評測。對于所以Ext JS開發人員&#xff0c;這事一個很好的機會來協助完成…

算法【二分查找】(數組)

1 .山脈數組的巔峰索引 信息 我們把符合下列屬性的數組 A 稱作山脈&#xff1a; A.length > 3 存在 0 < i < A.length - 1 使得A[0] < A[1] < … A[i-1] < A[i] > A[i1] > … > A[A.length - 1] 給定一個確定為山脈的數組&#xff0c;返回任何滿…

關于癌癥的十大謠言

最近&#xff0c;國外網站總結了西方社會中流行的十個關于癌癥的謠言&#xff0c;其中很多謠言在我們周圍也有廣泛的傳播。 謠言1&#xff1a;癌癥是人為導致的現代疾病 或許在公眾的認知里&#xff0c;癌癥在今天要比歷史上任何時期都重要。不過實際上&#xff0c;癌癥可不是一…

[python 進階] 第7章 函數裝飾器和閉包

文章目錄7.1 裝飾器基礎知識7.2 Python何時執行裝飾器7.3 使用裝飾器改進“策略”7.4 變量作用域(global)備注 -比較字節碼&#xff08;暫略&#xff09;7.5 閉包7.6 nonlocal聲明global和nonlocal的區別7.7 實現一個簡單的裝飾器7.8 標準庫中的裝飾器7.8.1 使用functools.lru_…

自制“低奢內”CSS3登入表單,包含JS驗證,請別嫌棄哦。

要求 必備知識 基本了解CSS語法,初步了解CSS3語法知識。和JS/JQuery基本語法。 開發環境 Adobe Dreamweaver CS6 演示地址 演示地址 預覽截圖(抬抬你的鼠標就可以看到演示地址哦): 制作步驟: 一, html結構 <div id"home"><form id"login" class…

class里面只能寫以下5種

轉載于:https://www.cnblogs.com/phplearnings/p/3650849.html

【排序】算法(python實現)

文章目錄python 排序算法1 插入排序1.1 直接插入排序算法思想1.2 希爾排序算法思想2. 選擇排序2.1 簡單選擇排序2.2 堆排序參考python 排序算法 1 插入排序 1.1 直接插入排序 算法思想 直接插入排序的核心思想就是&#xff1a;將數組中的所有元素依次跟前面已經排好的元素相…