関数という言葉から、関数はf(x)だと考えていらっしゃるようですが、そうではないからです。
- なぜ for func in myfuncs: は動くのか。
関数は変数に代入できます。
python
1>>> def two_times(x):
2... return x * 2
3...
4>>> print(two_times(5))
510
6>>> double = two_times
7>>> print(double(5))
上の例では、doubleという関数は定義していませんが、double = two_timesを行うことでdoubleを使って二倍することができるようになりました。
次にlambadaは名前のない関数を作るものだというのを理解してください。
python
1>>> print((lambda x: x * 3)(5))
215
少し分かりにくいですが、lambda x: x * 3によって3倍する関数が作り出され、それを引数5で呼び出すと15が返ってきてそれをprintしています。
この関数をtripleという名前の変数に入れたのが以下になります。
python
1>>> triple = lambda x: x * 3
2>>> print(triple(5))
315
4>>>
5>>> def three_times(x):
6... return x * 3
7...
8>>> print(triple(5))
これでわかるようにtripleとthree_timesは同じ事をする関数です。
そうすると、
myfuncs = [lambda x:x,lambda x:x2,lambda x:x3]
は以下のように書いても同じだと言うことになります。
python
1>>> def one_times(x):
2... return x
3...
4>>> def two_times(x):
5... return x * 2
6...
7>>> def three_times(x):
8... return x * 3
9...
10>>> myfuncs = [one_times, two_times, three_times]
11>>> print(myfuncs[0](5))
125
13>>> print(myfuncs[1](5))
1410
15>>> print(myfuncs[2](5))
1615
for func in myfuncs:でひとつづつ取りだしているのは、myfuncsに入っている三個の関数の一つなのでうまく動きます。
- for func(x) in myfuncsはなぜエラーになるのか。
関数の代わりにリストを使ったコードを考えてみましょう。
python
1mylists = [[0,1,2,3,4,5], [0,2,4,6,8,10], [0,3,6,9,12,15]]
2for lst in mylists:
3 print(lst[5])
これは正しく動きます。
しかしこれを
python
1mylists = [[0,1,2,3,4,5], [0,2,4,6,8,10], [0,3,6,9,12,15]]
2for lst[x] in mylists:
3 print(lst[5])
とすると、lstなんてないぞ、というエラーが出ます。
関数の場合も同じことなのです。