Python独学ノート---13.高次関数


高次関数
このセクションの内容は廖雪峰先生のブログを参考にしています.
1.変数は関数を指すことができる
C言語でもPythonでも関数には関数演算全体の結果を返す戻り値があります.
f = str(159) #           
print(f)

では、C言語には関数ポインタというものがあります.関数のアドレスを変数に割り当てることです.C言語では、関数を呼び出すときに間接アドレス記号*を使用してアドレスする必要があります.亀おじさんもPythonで遊ぶときはC言語で底辺を実現するものです.だからPythonにも似たようなものがあります.(関数の名前は1つの変数に保存できますが、その後はこの変数で呼び出すことができます)もちろん、Pythonにはポインタという言葉はありませんが、今ではポインタに支配される恐怖を思い出して、手のひらの汗が出てきました.pythonでは、関数自体を変数に割り当てることができます.次の例です.
f = str
print(f)
print(str)
#       :
<class 'str'>
<class 'str'>

私はまだ適切な関数アドレスを印刷する方法を見つけていませんが、上記の方法は私たちの疑問を説明するのに十分です.
d = abs #abs            
print(d(-10))

2.入力関数
関数のパラメータは変数を受信することができて、上でまた変数が関数を指すことができることを話して、それでは私達は先に1つの関数名を1つの変数に値を割り当てることができて、更にこの変数を別の1つの関数に値を伝えることができますか?答えは正確で、このような関数は「高次関数」と呼ばれています.
def add(f, x, y):
    return f(x) + f(y)

x = -5
y = 9
f = abs
ret = add(f, x, y)
print(ret)

2.1 map関数
map(function,iterable,...)function–関数iterable–1つ以上のシーケンス注意:map関数が返すシーケンスは、既存のシーケンスを破壊することなく新しく生成されたシーケンスです.
例:
def f(x):
    return x ** x
list1 = [1, 2, 3, 4, 5, 6, 7]

print(list(map(f, list1)))

ここで説明する点は、map()が入力する最初のパラメータはf、すなわち関数オブジェクト自体である.結果リストt 1はIteratorであり、Iteratorは不活性シーケンスであるため、リスト()関数によりシーケンス全体を計算してリストに戻す.
2.2 reduce関数
reduce(function,iterable[,initializer])function–関数.この関数は2つのパラメータiterable–反復可能オブジェクトinitializer–オプションを受信する必要があります.初期パラメータの概要:関数は1つのデータセット(チェーンテーブル、メタグループなど)のすべてのデータをreduceに伝達する関数function(2つのパラメータがある)でまず集合の1、2番目の要素を操作し、得られた結果を3番目のデータとfunction関数で演算し、最後に得られた結果の効果はreduce(f,[x 1,x 2,x 3,x 4])=f(f(x 1,x 2),x 3),x 4)であった.
例:
from functools import reduce
def add(x, y):
    return x + y

a = reduce(add, [1, 3, 5, 7, 9])
print(a)

2.3 filter関数
filter(function,iterable)function–関数iterable–反復可能なオブジェクトfilter()は、各要素に入力された関数を順次適用し、戻り値がTrueかFalseかに基づいて要素を保持または破棄するかを決定し、最後にTrueに戻る要素を新しいリストに配置します.
def is_odd(n):
    return n % 2 == 1

newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(newlist)

2.4 sorted関数
まずsortedとsortの違いについて
sortはlistに適用される方法であり、sortedは反復可能なすべてのオブジェクトをソート操作することができる.Listのsortメソッドは既存のリストを操作し、戻り値がなく、組み込み関数sortedメソッドは元の操作ではなく新しいlistを返します.
sorted構文:
sorted(iterable[,key[,reverse]]))iterable–反復可能なオブジェクトcmp–比較の関数です.この2つのパラメータがあり、パラメータの値は反復可能なオブジェクトから取り出されます.この関数が守らなければならないルールは、1より大きい場合は-1を返し、0を返します(python 3にはcmp関数がありません)key–主に比較に使用する要素です.パラメータは1つだけです.特定の関数のパラメータは、反復可能オブジェクトから取得され、反復可能オブジェクトの要素を指定してソートreverse–ソートルール、reverse=True降順、reverse=False昇順(デフォルト)
a = [6, 8, 9, 10, 2, 6, 11]
b = sorted(a)  #      

print(a)
print(b)

#      
[6, 8, 9, 10, 2, 6, 11]
[2, 6, 6, 8, 9, 10, 11]

次にsortedのパラメータ応用を見てみましょう
L=[('b',2),('a',1),('c',3),('d',4)]
L = [('b',2),('a',1),('c',3),('d',4)]
L1 = sorted(L, key=lambda x:x[1]) #    key
L2 = sorted(L, key=lambda x:x[1], reverse = True)
print(L1)
print(L2)
#      
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
[('d', 4), ('c', 3), ('b', 2), ('a', 1)]

3.戻り関数
高次関数は、パラメータとして関数を受け入れるほか、結果値として関数を返すこともできます.
def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum

lazyを呼び出すとsum()の場合、返されるのは和を求める結果ではなく、和を求める関数です.
f1 = lazy_sum(1, 3, 5, 7, 9)
f2 = lazy_sum(1, 3, 5, 7, 9)
print(f1)
#     
.sum at 0x0000025CFBD53E18>

#        
print("1",f1())
print("2",f2())
#      
1 25
2 25

この例では関数lazy_sumには関数sumも定義されており、内部関数sumは外部関数lazy_を参照することができる.sumのパラメータと局所変数、lazy_sumが関数sumを返すと,関連パラメータと変数が返される関数に保存され,この「クローズドパッケージ」と呼ばれるプログラム構造は大きな威力を持つ.
lazyを呼び出すとsum()の場合、呼び出すたびに新しい関数が返され、同じパラメータが入力されてもf 1!=f2
まとめ
-この節は、廖雪峰先生の授業を勉強した後の総括です.その一部の例は、私が自分で書いたのではありませんが、確かに手動で叩いたのです.-まず関数の1つの特性を学んで、変数は1つの“ポインタ”と見なすことができて、1つの関数を指して、1つの関数のアドレスを1つの変数に割り当てます.この変数がパラメータとしてどのように別の関数に伝達されるかを後学で述べた.-次に、いくつかの一般的な高次関数について簡単な理解学習を行いました.最後の部分では、ある関数を別の関数の戻り値として学習し、戻り時にこの関数を返すだけで、この関数の演算結果ではありません.関連パラメータと変数は、「クローズ」と呼ばれる戻り関数に保存されます.