python 函数式编程包_python 函数支持函数式编程的包operator partial
itemgetter和attrgetter能替代從序列中取出元素或讀取對象屬性的lambda表達式,會自動構建函數
itemgetter
1,根據元組某個字段給元組列表排序,下例中
itemgetter(1) == lambda field : field[1]
2,如果把多個參數傳給itemgetter ,它構建的函數會返回提取的值構成元組
metro_data = [
("tykyo",'jp',36.944,(35.68944,139.69166)),
("delhi ncr",'in',21.935,(36.64944,138.79166)),
("mexico city",'mx',46.944,(33.68944,129.69166)),
("new york-newark",'us',20.944,(35.68944,139.69166)),
("sao paulo",'br',16.944,(25.68944,149.69166))
]
#1
from operator import itemgetter
for city in sorted(metro_data,key=itemgetter(1)):
print(city)
#2
cc_name=itemgetter(1,0)
for city in metro_data:
print(cc_name(city))
返回:
('sao paulo', 'br', 16.944, (25.68944, 149.69166))
('delhi ncr', 'in', 21.935, (36.64944, 138.79166))
('tykyo', 'jp', 36.944, (35.68944, 139.69166))
('mexico city', 'mx', 46.944, (33.68944, 129.69166))
('new york-newark', 'us', 20.944, (35.68944, 139.69166))
-------------------------------------------------------------------------------------
('jp', 'tykyo')
('in', 'delhi ncr')
('mx', 'mexico city')
('us', 'new york-newark')
('br', 'sao paulo')
attrgetter它創建的函數根據名稱提取對象的屬性
metro_data = [
("tykyo",'jp',36.944,(35.68944,139.69166)),
("delhi ncr",'in',21.935,(36.64944,138.79166)),
("mexico city",'mx',46.944,(33.68944,129.69166)),
("new york-newark",'us',20.944,(35.68944,139.69166)),
("sao paulo",'br',16.944,(25.68944,149.69166))
]
from operator import itemgetter
from collections import namedtuple
LatLong = namedtuple('LatLong','lat long')#定義LatLong
Metropolis = namedtuple('Metropolis','name cc pop coord')#定義Metropolis
#使用嵌套的元祖拆包提取(Lat,Long)
Metro_areas = [Metropolis(name,cc,pop,LatLong(Lat,Long)) for name,cc,pop,(Lat,Long) in metro_data]
print(Metro_areas)
print(Metro_areas[0])
print(Metro_areas[0].coord)
print(Metro_areas[0].coord.lat)
from operator import attrgetter
name_lat = attrgetter('name','coord.lat')
for city in sorted(Metro_areas,key=attrgetter('coord.lat')):
print(name_lat(city))
返回:
[Metropolis(name='tykyo', cc='jp', pop=36.944, coord=LatLong(lat=35.68944, long=139.69166)), Metropolis(name='delhi ncr', cc='in', pop=21.935, coord=LatLong(lat=36.64944, long=138.79166)), Metropolis(name='mexico city', cc='mx', pop=46.944, coord=LatLong(lat=33.68944, long=129.69166)), Metropolis(name='new york-newark', cc='us', pop=20.944, coord=LatLong(lat=35.68944, long=139.69166)), Metropolis(name='sao paulo', cc='br', pop=16.944, coord=LatLong(lat=25.68944, long=149.69166))]
Metropolis(name='tykyo', cc='jp', pop=36.944, coord=LatLong(lat=35.68944, long=139.69166))
LatLong(lat=35.68944, long=139.69166)
35.68944
('sao paulo', 25.68944)
('mexico city', 33.68944)
('tykyo', 35.68944)
('new york-newark', 35.68944)
('delhi ncr', 36.64944)
functools.partial
:凍結參數
:基于一個函數創建一個新的可調用對象,把原函數的某些參數固定,使用這個函數可以吧接受一個或多個參數的函數改編成需要回調的API,這樣參數更少
from operator import mul
from functools import partial
triple = partial(mul,3)
print(triple(7))
l = list(map(triple,range(1,10)))
print(l)
返回:
21
[3, 6, 9, 12, 15, 18, 21, 24, 27]
def tag(name,*content,cls=None,**attrs):
if cls is not None:
attrs['class'] = cls
if attrs:
attrs_str = ''.join(' %s="%s" ' % (attr,value) for attr,value in sorted(attrs.items()))
else:
attrs_str=''
if content:
return '\n'.join('<%s %s >%s%s>' % (name,attrs_str,c,name) for c in content)
else:
return '<%s%s />' % (name,attrs_str)
from functools import partial
picture = partial(tag,'img',cls='pic-frame')
print(picture)
p = picture(src='sunlong.jpeg')
print(p)
print(picture.args)
print(picture.keywords)
返回:
functools.partial(, 'img', cls='pic-frame')
('img',)
{'cls': 'pic-frame'}
總結
以上是生活随笔為你收集整理的python 函数式编程包_python 函数支持函数式编程的包operator partial的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件架构设计案例_透过现象看本质:常见的
- 下一篇: python制作文本编辑器_Python