귀도 반 로섬은 파이썬이 함수형 프로그래밍 언어를 지향하지 않다고 하지만 operator와 functools와 같은 패키지들의 지원 덕분에 파이썬에서도 함수형 코딩 스타일을 사용할 수 있다.
함수형 프로그래밍을 할 때 산술 연산자를 함수로 사용하는 것이 편리하고, 팩토리얼을 계산하기 위해서 재귀적으로 함수를 호출하는 대신 숫자 시퀀스를 곱하는 경우, 합계를 구할 때는 sum() 함수가 잇지만, 곱셈에 대해서는 해당하는 함수가 없다.
이때, 람다를 활용해서 해결할 수 있다.
from functools import reduce
def fact(n):
return reduce(lambda a, b : a*b , range(1,n+1))
"""
lambda a,b : a*b와 같이 사소한 익명 함수를 작성하는 수고를 덜기 위해서 operator 모듈은 수 십개의 연산자에 대응하는 함수를 제공한다.
"""
#reduce()와 operator.mul로 구현한 팩토리얼
from functools import reduce
from operator import mul
def fact(n):
return reduce(mul, range(1,n+1)
"""
operator 모듈은 시퀀스에서 항목을 가져오는 람다를 대체하는 itemgetter()함수와 객체의 속성을 읽는 람다를 대체하는 attrgetter() 함수를 제공한다.
"""
#튜플의 리스트를 정렬하기 위한 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.645833)),]
from operator import itemgetter
for city in sorted(metro_data, key=itemgetter(1)):
print(city)
cc_name = itemgetter(1,0)
for city in metro_data:
print(cc_name(city))
metro_data라는 명명된 튜플의 리스트를 처리하기 위한 aatrgetter()
from collections import namedtuple
LatLong = namedtuple('LatLong', 'lat long')
Metropolis = namedtuple('Metropolis', 'name cc pop coord')
metro_areas = [Metropolis(name, cc,pop,(lat,long) in metro_data]
metro_areas[0]
metro_areas[0].coord.lat
from operaator import attrgetter
name_lat = attrgetter('name', 'coord.lat')
for city in sorted(metro_areas, key=attrgetter('coord.lat)):
print(name_lat(city))
[name for name in dir(operator) if not name.startswith('_')]
#methodcaller() 두 번째 테스트 hiphenate()에서 여분의 인수가 바인딩되는 것을 주의
from operator import methodcaller
s = 'The time has come'
upcase = methodcaller('upper')
upcase(s)
hiphenate = methodcaller('replace', ; ','-')
hiphenate(s)
str.upper(s)
functools 모듈은 몇 가지 고위 함수를 통합하고, functools에서 제공하는 나머지 함수 중 partial() 및 이의 변형인 partialmethod()함수가 매우 유용하다. 이는 함수를 부분적으로 실행할 수 있게 해주고, 어떤 함수가 있을 때 partial()을 적용하면 원래 함수의 일부 인수를 고정한 콜러블을 생성한다.
#인수를 하나 받는 콜러블이 필요한 곳에 인수 두 개를 받는 함수를 사용하기 위해서 partial()적용하기
from operator import mul
from functools import partial
triple = partial(mul,3)
triple(7)
list(map(triple, range(1,10))
#partial()을 이용해서 편리한 유니코드 정규화 함수
import unicodedata, functools
nfc = functools.partoal(unicodedata, normalize, 'NFC')
s1 = 'cafe'
s2 = 'cafe\u0301'
s1,s2
s1 == s2
nfc(s1) == nfc(s2)
from tagger import tag
tag
from functools import partial picture = partial(taag,'img',cls='pic-frame')
picture(src='wumpus.jpeg'
picture
picture.func
picture.args
picture.keywords