【python】高次関数、map()、reduce()
2501 ワード
>>> f = abs
>>> f(-10)
10
2)関数名は実際には指向関数の変数,すなわちabs()は1つの関数と見なし,absは変数と見なし,絶対値を求める関数を指すことができる.
>>> abs = 10
>>> abs(-10)
3)高次関数:一つの関数でもう一つの関数をパラメータとして受け取ることができる
def add(x, y, f):
return f(x) + f(y)
add(-5, 6, abs)
Iterable
mapは入力された関数をシーケンスの各要素に順次作用させ、結果を新しいIteratorとして返す.>>> def f(x):
... return x * x f(x)=x²
...
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
map()が入力する最初のパラメータはf、すなわち関数オブジェクト自体である.結果rはIteratorであり,Iteratorは不活性シーケンスであるため,list()関数によりシーケンス全体を計算してlistを返す.もちろん、tuple、setなど、他のものに戻ることもできます.strとかintとかじゃダメ
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
要点は、f関数は2つのパラメータを受信しなければならず、reduceは結果を継続し、シーケンスの次の要素と累積計算>>> from functools import reduce
>>> def fn(x, y):
... return x * 10 + y
...
>>> def char2num(s):
... return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
...
>>> reduce(fn, map(char2num, '13579')) map() 1,3,5,7 int
13579
{}[]は、{key:value}[key]というインデックスはvalueを返すべきだが、[key]は['13579']という辞書インデックスは自分で分割するのだろうか.実はそうではありません.ここではmapの役割です.関数をシーケンスの各要素に順次作用させることができます.「13579」はstrで、mapによって単一の要素に分割されて{}[]で単独で使用されます.つまり、コードには[s]1つの要素しかありません.
授業後の問題.
def normalize(name):
def change(s):
return s.title()
L2 = map(change,name)
return list(L2)
normalize(['adam', 'LISA', 'barT'])
# prod() , list reduce()
def prod(L):
def product(x,y):
return x*y
return reduce(product,L)
prod([3,5,7,9])
# map reduce str2float , '123.456' 123.456
def char2num(s):
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
def zhengshu(x,y):
return x*10 +y
def str2float(s):
l = s.split('.') # ‘.’ list
return reduce(zhengshu,map(char2num,l[0]))+reduce(zhengshu,map(char2num,l[1]))/10**len(l[1])
print(str2float('123.4'))