🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

738閲覧

for構文の変数に引数を入れる必要がない理由

yama0309

総合スコア15

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/03/17 15:33

編集2021/03/17 15:35

下記のfor構文がなぜ機能するのかわかりません。
print(func(5))としていますが、直前のfor構文ではfuncの引数をxとしていないので、正しく出力されないはずではないかと思っています。
つまり私の考えでは、for func(x) in myfuncsとするのが正しいのではないかと言うことです。(結果はエラーになります)

python

1myfuncs = [lambda x:x,lambda x:x*2,lambda x:x*3] 2for func in myfuncs: 3 print(func(5))

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2021/03/17 16:06

> つまり私の考えでは、 なぜそう思ったのかを書いてくれないと説明がしづらいです。
miyabi_takatsuk

2021/03/17 16:19 編集

エラー文を翻訳したりしてみましたか? 翻訳すれば、なぜエラーになったかは自ずとわかっていくかと。
guest

回答2

0

ベストアンサー

逆です。
for func(x) in myfuncsの方が、大きな間違いになります。
(というかエラーになる)

for func in myfuncsが何を行っているか、
をまず整理しましょう。
これは、myfuncsの中身を一個一個取り出し、その都度func変数に格納するという挙動になります。

myfuncsは、ラムダ式関数が複数入ったリストとなるため、
for文の中において、funcを関数として実行できることになります。
(リストの頭から順番に関数が格納される)

対して、for func(x) in myfuncsだと、何が間違いなのか。
()関数の実行を行う演算子のため、
リストの要素を格納するという挙動になりません。
その場でfunc関数を実行しようとしてしまうため、
おかしなことになります。
myfuncsの中身の関数を、funcに格納することによって、
for文の中で、関数として実行できるのに、
格納しようとしている段で実行しようとすると、funcがまだ定義されていないのに、関数として実行しようとするので、当然エラーとなります。

投稿2021/03/17 16:12

miyabi_takatsuk

総合スコア9555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yama0309

2021/03/20 02:32

理解できました。ありがとうございました。
guest

0

関数という言葉から、関数は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なんてないぞ、というエラーが出ます。
関数の場合も同じことなのです。

投稿2021/03/18 02:53

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問