【python】高次関数、map()、reduce()

2501 ワード

  • 高次関数1)関数自体を変数に割り当てることができます.すなわち、「変数指向関数」
  • >>> 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)
    
  • map()関数は2つのパラメータを受信し、1つは関数であり、1つはIterablemapは入力された関数をシーケンスの各要素に順次作用させ、結果を新しい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とかじゃダメ
  • rudece()関数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'))