python戻り関数+匿名関数
1523 ワード
戻り関数
勉強資料をざっと見ていると、戻り関数の意味がわかりやすいような気がしますが、実際に応用するのはちょっと面倒です.
まず考えをしごく.
まず,高次関数はパラメータとして関数を受信できるほか,結果値として関数を返すこともできる.
関数を戻り値として使用
和を求めて簡単な例を作ります.
一般的な求和関数はこう書きます.
>>> def calc_sum(*args):
a = 0
for n in args:
a = a + n
return a
>>> calc_sum(1,2,3,4)
10
直接解き、結果を返します.
しかし、すぐに和を求める必要はありません.後で計算する必要があるかもしれません.このときは戻り関数を使います.
△私がここを見たとき、頭の中でずっと考えていたのは、どうしてすぐに和を求めないのですか.
戻り関数はいったいどんな役割を果たしているのだろうか.
まるで一つのことをしているかのように、やっているうちに、関数を返す役割は、私がどこ/どうしたのか、何ができるのかを教えてあげることです.
しばらく具体的な例はなくて、后で出会うことができることを望んで、理解を深めます!(抽象的すぎる!!)
はい、振り返って求和が戻り関数でどのように書かれているか見てみましょう.
(和を求める結果ではなく、和を求める関数を返す)
>>> def lazy_sum(*args):
def sum():
a = 0
for n in args:
a = a + n
return a
return sum
>>> f = lazy_sum(1,3,5,7,9)
>>> f
真の和を求める結果を計算するには、f.【f()はsum()に相当する】を呼び出す必要があります.
>>> f()
25
内部関数
このようなプログラム構造を「クローズドパッケージ」(Closure)と呼ぶ.(ほー!
ここで注意しなければならないのは、lazy_を呼び出すたびにsumは、新しい関数を返します!
入力パラメータが同じでも、返される関数は異なります!
>>> f1 = lazy_sum(1, 3, 5, 7, 9)
>>> f2 = lazy_sum(1, 3, 5, 7, 9)
>>> f1==f2
False
(f 1()とf 2()の呼び出し結果は互いに影響しない
勉強資料をざっと見ていると、戻り関数の意味がわかりやすいような気がしますが、実際に応用するのはちょっと面倒です.
まず考えをしごく.
まず,高次関数はパラメータとして関数を受信できるほか,結果値として関数を返すこともできる.
関数を戻り値として使用
和を求めて簡単な例を作ります.
一般的な求和関数はこう書きます.
>>> def calc_sum(*args):
a = 0
for n in args:
a = a + n
return a
>>> calc_sum(1,2,3,4)
10
直接解き、結果を返します.
しかし、すぐに和を求める必要はありません.後で計算する必要があるかもしれません.このときは戻り関数を使います.
△私がここを見たとき、頭の中でずっと考えていたのは、どうしてすぐに和を求めないのですか.
戻り関数はいったいどんな役割を果たしているのだろうか.
まるで一つのことをしているかのように、やっているうちに、関数を返す役割は、私がどこ/どうしたのか、何ができるのかを教えてあげることです.
しばらく具体的な例はなくて、后で出会うことができることを望んで、理解を深めます!(抽象的すぎる!!)
はい、振り返って求和が戻り関数でどのように書かれているか見てみましょう.
(和を求める結果ではなく、和を求める関数を返す)
>>> def lazy_sum(*args):
def sum():
a = 0
for n in args:
a = a + n
return a
return sum
>>> f = lazy_sum(1,3,5,7,9)
>>> f
lazy_sum()
を呼び出すと、加算結果ではなく、加算関数が返されることがわかります.真の和を求める結果を計算するには、f.【f()はsum()に相当する】を呼び出す必要があります.
>>> f()
25
内部関数
sum
は、外部関数lazy_sum
のパラメータおよび局所変数を参照することができる.lazy_sum
が関数sum
を返すと、関連パラメータおよび変数は、返される関数に保存される.(わかりやすい言葉ですが、なんだか簡単ではないような気がします!このようなプログラム構造を「クローズドパッケージ」(Closure)と呼ぶ.(ほー!
ここで注意しなければならないのは、lazy_を呼び出すたびにsumは、新しい関数を返します!
入力パラメータが同じでも、返される関数は異なります!
>>> f1 = lazy_sum(1, 3, 5, 7, 9)
>>> f2 = lazy_sum(1, 3, 5, 7, 9)
>>> f1==f2
False
(f 1()とf 2()の呼び出し結果は互いに影響しない