Python高次関数map()、reduce()、filter()、sorted()、匿名関数lambda

4919 ワード

まず1つの名詞を紹介します:関数式のプログラミング#関数式のプログラミングは1種の抽象的な程度の高いプログラミングの範式で、純粋な関数式のプログラミング言語の編纂する関数は変数がなくて、そのため、任意の1つの関数、入力が確定する限り、出力は確定して、このような純粋な関数は私達は副作用がないと言います.変数を使用できるプログラム設計言語は,関数内部の変数状態が不確定であるため,同じ入力で異なる出力が得られる可能性があるため,この関数には副作用がある.関数式プログラミングの特徴の一つは、関数自体をパラメータとして別の関数に転送したり、関数を返したりすることです.Pythonは関数式プログラミングを一部サポートしています.Pythonでは変数の使用が許可されているため、Pythonは純粋な関数式プログラミング言語ではありません.
x = abs(-100)#       
y = abs#         
print(x,y)#     10 
#             ,  ,              
print(y(-10))#    :10
    :
100 
10
#     y         abs     。     abs()         y()     
#       
#         ?
#              !   abs()     ,
#         abs     ,               !

#伝達関数#変数が関数を指すことができる以上、関数のパラメータは変数を受信することができ、1つの関数は別の関数をパラメータとして受信することができ、この関数を高次関数と呼ぶ.
#  
def add(a,b,y):
    return y(a)+y(b)
print(add(-1,-1,abs))#abs          
#      ,                。
    :
2

#python内蔵関数map()reduce()とfilter()map()関数は、2つのパラメータを受信します.1つは関数で、1つはIterableです.mapは、入力された関数をシーケンスの各要素に順次作用させ、結果を新しいIteratorとして返します.例えば、関数f(x)=x^2があり、この関数をlist=[1,2,3,4,5,6,7,8,9]に作用させるには、map()を使えます
def f(x):
    return x*x
y= map(f,[1,2, 3, 4, 5, 6, 7, 8, 9])
print(y)
print(list(y))
    :

[1, 4, 9, 16, 25, 36, 49, 64, 81]
#map()          f,       。    y   Iterator,Iterator     ,
    list()                    list

#      list      
print(list(map(str,[1,2,3,4,5,6,7,8,9])))
    :
['1', '2', '3', '4', '5', '6', '7', '8', '9']
#map()       ,            

#reduce()#reduce()は、1つの関数を1つのシーケンス[x 1,x 2,x 3,...]に作用させ、この関数は2つのパラメータを受信しなければならない.
from functools import reduce
def add(x,y):
    return x+y
def fn(x,y):
    return x*10+y
def normalize(name):
    return name.capitalize()
def pord(x,y):
    return x*y
print(reduce(add,[1,2,3,4,5,6,7,8,9]))#list
print(reduce(add,(1,2,3,4,5,6,7,8,9)))#tuple
print(reduce(fn,[1,3,5,7,9]))
L1 = ['AdmIn','anny','LUCY','sandY','wILl']
print(list(map(normalize,L1)))
print('3*5*7*9=',reduce(pord,[3,5,7,9]))
    :
45
45
13579
['Admin', 'Anny', 'Lucy', 'Sandy', 'Will']
3*5*7*9= 945

#filter#シーケンスをフィルタリングして関数を受信するシーケンス
def is_odd(n):
    return n%2==1
def is_empty(s):
    return s and s.strip()
print(list(filter(is_odd,[1,2,3,4,5,6,7,8,9])))#        
print(list(filter(is_empty,['A', '', 'B', None, 'C', ' '])))
    :
[1, 3, 5, 7, 9]
['A', 'B', 'C']

#ソートもプログラムでよく使われるアルゴリズムです.バブルソートを使用しても高速ソートを使用しても、ソートのコアは2つの要素のサイズを比較することです.数字なら直接比較できますが、文字列か2つのdictなら?数学の大きさを直接比較するのは意味がないので,比較の過程は関数によって抽象化しなければならない.通常、2つの要素xとyについて、xyであれば1を返し、これにより、ソートアルゴリズムは具体的な比較過程に関心を持たず、比較結果に基づいて直接ソートすることが規定されている.
Python     sorted()        list     
l1 = sorted([36, 5, -12, 9, -21])
l2 = sorted([36, 5, -12, 9, -21], key=abs)#     key            
l3 = sorted(['bob', 'about', 'Zoo', 'Credit'])
#key           list        ,    key            
l4 = sorted(['bob', 'about', 'Zoo', 'Credit'],key=str.lower)
#       ,    key  ,          reverse=True
l5 = sorted(['bob', 'about', 'Zoo', 'Credit'],key=str.lower,reverse=True)
l6 = sorted([36, 5, -12, 9, -21], key=abs,reverse=True)
print(l1)
print(l2)
print(l3)
print(l4)
print(l5)
print(l6)
    :
[-21, -12, 5, 9, 36]
[5, 9, -12, -21, 36]
['Credit', 'Zoo', 'about', 'bob']
['about', 'bob', 'Credit', 'Zoo']
['Zoo', 'Credit', 'bob', 'about']
[36, -21, -12, 9, 5]
#sorted()         。  sorted()                

python高次関数のmap()、reduce()、filter()、sorted()----------------分割線-------------------------------匿名関数:print(list(map(lambda x:x*x,[1,2,3,4,5,6,7,8,9]))#キーワードlambdaは匿名関数を表し、冒号の前のxは関数パラメータを表す.匿名関数には、returnを書かずに式が1つしかないという制限があります.戻り値は式の結果です.#匿名関数を使用すると、関数に名前がないため、関数名の競合を心配する必要はありません.また、#匿名関数も関数オブジェクトです.匿名関数を変数に割り当て、変数を再利用して関数を呼び出すこともできます.
print(list(map(lambda x:x*x,[1,2,3,4,5,6,7,8,9])))
    :
[1, 4, 9, 16, 25, 36, 49, 64, 81]

fg = lambda x:x*x*2
print(fg)
print(fg(55))
    :
 at 0x000001AFBABED598>
6050

#              
def build(x,y):
    return lambda: x*x+y*y

gg = build(11,22)
print(gg)
print(gg())
     :
. at 0x000001AFBABED6A8>
605
#lambda       ,     def     。
#lambda         ,        。     lambda              。
#lambda           ,                        。
#  lambda          ,     C C++     ,                          。