まず前提としてPython
では関数もオブジェクトして扱われます。
すなわちc = my_func
のようにに関数名にカッコをつけないと、c
には関数がオブジェクトとして代入されます。
そのうえでc(123)
のようにカッコをつけると、c
に格納された関数が呼び出されます。
次にsorted(iterable, *, key=None, reverse=False)によると
key には 1 引数関数を指定します。これは iterable の各要素から比較キーを展開するのに使われます (例えば、 key=str.lower のように指定します)。
とありますが、1 引数関数を指定
とは、一つの引数をとる関数(オブジェクト)を指定するということです。
sorted
では、内部でこの関数を各要素に対して呼び出すことによりソートを行っています。
以上を踏まえると
・my_abs(num)のnumがどうやって入れられてるのか分からないです。abs_listのことだと思うんですけど、なんでそこに入れられるのか疑問です。
sorted
が内部で入れてくれています。
・関数を利用する時は関数の後ろに()を付けることで実行されるってあったんですけど、()が無くても実行されることってあるんですか?
「実行」されることはないです。しかし前述のような仕組みで間接的に実行することができます。
・今回のコードの場合、関数が「my_abs」で、実行するなら「my_abs()」とせずにそのままするのは何故ですか?
sorted
内部で実行する関数を、key=my_abs
と記述することで関数オブジェクトとして指定(渡して)います。
このコードの実行の部分は、print(sorted(abs_list, key = my_abs))のmy_absの部分で合ってますよね?
はい。sorted
内部で実行されます。
以下、以上の説明のまとめとしてsorted
と同じ仕組みのcalced
という関数例を示します。
Python
1
2# リストの各要素に対して何らかの計算をする関数
3# calc_funcには「何らかの計算」を行う関数を指定する
4def calced( lst, calc_func):
5 ret = []
6 for n in lst:
7 # この場合は実際にはmy_calcが呼ばれる
8 c = calc_func(n)
9 ret.append(c)
10 return ret
11
12
13def my_calc(n):
14 return n*n
15
16
17# 通常の関数呼び出し
18print( my_calc(2)) # 4
19
20# 関数もオブジェクトなので変数として代入できる
21c = my_calc
22print(c) # <function my_calc at 0x0000012C60E7F4C8>
23
24# cにカッコをつけると関数を実行することができる
25print(c(3)) # 9
26
27# calced内部で利用する関数としてmy_calcを指定する
28lst = [1,2,3]
29ret = calced( lst, my_calc)
30print(ret) # [1, 4, 9]
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/30 14:53