記事のディレクトリ
図1に示すように、高次機能の基本的な概念
変数は関数を指すことができ
、変数、関数名は、実際の関数へのポインタであります
機能を受信するための引数として機能:高階関数
- 変数は関数を指すことができます
- 関数のパラメータは、変数を受け取ることができます
- 関数は、パラメータとして他の関数を受け取ることができます
- 受け取ることができるパラメータの関数としての機能は、高階関数であります
高階関数の明確なコンセプト、シンプルな高階関数を記述します。
def add(x, y, f):
return f(x) + f(y)
ABS値Fパラメータとして渡された場合:
add(-5, 9, abs)
関数定義、機能コードが実際に実行されます。
abs(-5) + abs(9)
パラメータは、Xので、y及びfは他の関数fに渡される場合は、異なる戻り値とすることができる、任意のパスです。
タスク:
アドインを使用して(X、Y、F)関数が計算される:
CODE:
import math
def add(x, y, f):
return f(x) + f(y)
print add(25, 9, math.sqrt)
図2に示すように、高次関数をマッピング()関数
マップ(F、LIST)
- マップ()関数が定義されています。
地図()新しいリストとリターンを得るために、リストの各要素に作用することによってパイソン、それはリストと関数fを受信し、関数fおよび順次内蔵高次の関数です。
例えば、リスト[1、2、3、4、5、6、7、8、9]
あなたは、リストのすべての要素が正方形であるようにしたい場合は、マップ()関数を使用することができます。
したがって、我々は唯一の関数f(x)を渡す必要がある= X * X、あなたはこの計算を完了するために、マップ()関数を使用することができます。
def f(x):
return x*x
print map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
出力:
[1, 4, 9, 10, 25, 36, 49, 64, 81]
注:マップ()関数は、元のリストを変更するが、新しいリストを返していません。
地図()関数を使用して、リストを別のリストに変換することができる、唯一の伝達関数を渡す必要があります。
要素リストは、任意のタイプとすることができるため、地図()のみ数値処理のリストが含まれていないことができ、実際に、それはリストの任意のタイプを扱うことができる含まれているのであれば、着信データの関数fは、このタイプを扱うことができるように、含まれています。
タスク:
仕様に(非標準英語名の数を含む)のリストにマップ()関数を使用し、最初の大文字に従って、小文字の規則に従わないと、ユーザは、非標準的な英語の名前を入力したとは、英語の名前が含まれていますリスト:
入力:[ 'アダム'、 'LISA '、 'BART']
出力:[ 'アダム'、 'リサ '、 'バート']
コード:
def format_name(s):
return s[0].upper() + s[1:].lower()
print map(format_name, ['adam', 'LISA', 'barT'])
3、()関数の高次関数を減少させます
削減()関数は、ビルトインされたPythonの高次機能を。関数f、リストに類似している)(()関数とパラメータ受信した地図を低減するが、行動およびマップ()が異なる、
減らす()関数fは、着信2つのパラメータを受信しなければならない、(リストのそれぞれに対して)低減要素は、繰り返し関数fを呼び出し、最終的な結果値を返します。
例えば、関数fの調製は、xとy、xとyとリターンを受けます。
def f(x, y):
return x + y
コール機能を低下させる場合、(F、[1、3、5、7、9])を減少させる、次のように計算されます。
最初の計算最初の2つの要素:、結果は4 F(1、3)である。
第三の要素の、結果と計算される:F(4、5)、結果は9であり、
計算、結果および第4要素:F (9、7)は、結果は16である。
次いで、5要素計算の結果:F(16、9)、25であった;
それ以上の要素が存在しないため、計算の終了、結果25を返します。
上記の計算は、実際には、リストのすべての要素を合計されます。Pythonは)関数sum(和構築されますが、しかし、削減()の合計の使用も非常に簡単です。
また、初期値として算出された第3オプションのパラメータを受信することができる)(減らします。100の初期値ならば、計算:
reduce(f, [1, 3, 5, 7, 9], 100)
計算の最初のラウンドがあるので、結果は、125のようになります。
そして最初の要素の初期値計算:F(100、1)、結果は101です。
タスク:
Pythonは()関数和和構築されたが、関数の直交は、直交する)(recudeを使用してくださいません。
入力:[2、4、5、7、12]
出力:結果2 * 4 * 5 * 7 * 12
コード:
def prod(x, y):
return x*y
print reduce(prod, [2, 4, 5, 7, 12])
()関数の4、フィルタ高次関数
()関数は、フィルタを定義:
フィルタ()関数が内蔵されているPythonの別の有用な高いオーダー機能、フィルタ()関数は、関数fとリストを受け入れ、この関数fの役割は、各要素について決定、またはTrueを返すされ決意の結果に基づいて、偽、フィルタ()フィルタは、要素の条件に適合し、有資格の要素の新しいリストを返していません。
たとえば、リストから[1、4、6、7、9、12、17]偶数、奇数の保持を除去するために、まず、決意関数は、奇数書き込みます。
def is_odd(x):
return x % 2 == 1
その後、さえ出てフィルターにフィルター():
filter(is_odd, [1, 4, 6, 7, 9, 12, 17])
結果:1、7、9、17]
使用フィルタ()、あなたは、Noneまたは空の文字列を削除しないなど、多くの便利な機能を実行できます。
def is_not_empty(s):
return s and len(s.strip()) > 0
filter(is_not_empty, ['test', None, '', 'str', ' ', 'END'])
結果:[ 'テスト'、 'STR'、 'END']
注:s.strip(RM)、文字列、末尾の文字列RMの先頭を削除することです。
RMが空である場合、( '\ R'、 '\ T'、 ''、 '\ n' を含む)は、デフォルトの削除ホワイトスペースは、次の通り:
a = ' 123' a.strip()
結果: '123'
a='\t\t123\r\n'
a.strip()
結果: '123'
タスク:
ください用フィルター()1-100濾過平方根が整数である、すなわち、結果は次のようになります。
[1、4、9、16、25、36、49、64、81、100]
CODE:
フィルタ()関数は、整数の平方根か否かを判断受けなければならない、とMath.sqrt()は浮動小数点結果を返します。
import math
def is_sqr(x):
r = int(math.sqrt(x))
return r*r==x
print filter(is_sqr, range(1, 101))
import math
def is_sqr(x):
return math.sqrt(x)%1==0
print filter(is_sqr, range(1, 101))
ソートアルゴリズム - 5、()関数の高次関数をソート
Pythonのカスタム発注機能
Pythonは、リストをソートするソート()関数を構築しました:
>>>sorted([36, 5, 12, 9, 21])
[5, 9, 12, 21, 36]
しかし、それは()をソート高階関数である、それはカスタムの並べ替えを実装するための比較機能を受け取ることができ、
比較関数は、x、yと比較されるべき2つの要素を通過し、定義され、
- xがyの前になければならない場合、-1、
- yはxが戻って、リターンであることをした場合。
- xおよびyは、0等しい場合。
私たちは逆の順序を達成するためにあるのであれば、あなただけが記述する必要がreversed_cmpの機能を:
def reversed_cmp(x, y):
if x > y:
return -1
if x < y:
return 1
return 0
このように、逆の順序を達成することができます(ソート)コールとreversed_cmpを渡します。
>>> sorted([36, 5, 12, 9, 21], reversed_cmp)
[36, 21, 12, 9, 5]
ソート()もソート文字列、ASCII文字列のデフォルトのサイズ比較することができます:
>>> sorted(['bob', 'about', 'Zoo', 'Credit'])
['Credit', 'Zoo', 'about', 'bob']
ASCIIコードのために '小さな「Z」比の前に「約」「動物園」行。
デフォルトでは、ASCII比較の大きさに応じて、文字列を並べ替えます。
今、私たちはソートケースを無視すべきことを提案し、アルファベット順にソート。このアルゴリズムを実装するために、我々は、既存のコードの大きなを変更する必要はありませんプラス、限り、私たちが使用できるようファンクションキーは、文字列のソートにマッピングされている場合を無視することができます。実際には、入れた文字列は、大文字(またはすべて小文字)され、ケースを無視して2つの文字列を比較するには、その後の比較。
このように、私たちはソート済みキー関数に渡す、あなたは大文字と小文字を区別しないソートを実現することができます。
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
['about', 'bob', 'Credit', 'Zoo']
ソート順序を逆にするには、ファンクションキーを変更せずに、3番目のパラメータは逆渡さ= Trueのことができます。
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']
上記の例から分かるように、抽象高次機能する能力は非常に強力であるが、コア・コードは非常にシンプルに保つことができます。
タスク:
習慣に沿って、より多くの注文の場合を無視して、時々、文字列をソートする場合。ソートアルゴリズムはケースを無視し、ソート()高階関数を使用してください。
入力:[ 'ボブ'、 'について 、 '動物園'、 'クレジット'']
出力:[ '約'、 'ボブ '、 'クレジット'、 '動物園']
今、私たちはソートケースを無視すべきことを提案し、アルファベット順にソート。このアルゴリズムを実装するために、我々は、既存のコードの大きなを変更する必要はありませんプラス、限り、私たちが使用できるようファンクションキーは、文字列のソートにマッピングされている場合を無視することができます。実際には、入れた文字列は、大文字(またはすべて小文字)され、ケースを無視して2つの文字列を比較するには、その後の比較。
コード:
def cmp_ignore_case(s1, s2):
u1 = s1.lower()
u2 = s2.lower()
if u1 > u2:
return -1
if u1 < u2:
return 1
return 0
print sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case,reverse=True)