functools の reduce は「2 つの値から別の値を求める関数」をリストに適用します。複数個の整数から最大公約数を求めるコードはこうなります。
from functools import reduce from math import gcd numbers = [24, 60, 90] divisor = reduce(gcd, numbers) print(divisor) # 6
reduce(gcd, numbers)
は
- numbers から最初の 2 つ(24、60)をとる
- それを gcd する
- その値と numbers の次の要素(90)を gcd する
- 以下くりかえし…
を意味します。
応用:総和
from functools import reduce def add(x, y): return x + y numbers = [1, 2, 3, 4, 5] total = reduce(add, numbers) print(total)
注意:型
reduce を使うときは「適用する関数の返り値」と「リストの要素」の型は同じである必要があります。
from functools import reduce def say(x, y): return 'Hello' numbers = [1, 2, 3, 4, 5] total = reduce(say, numbers) print(total) # Hello
Hello が出力されているものの、reduce は誤って使われています。