質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.47%
Python

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

Q&A

解決済

1回答

557閲覧

Python : Nested Function

net-sn

総合スコア2

Python

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

0グッド

0クリップ

投稿2022/12/02 14:36

編集2022/12/02 14:53

前提

PythonでNested Functionについての実行順序を教えてください。

以下のコードを実行した場合、どの順序でNested Functionが実行されるのでしょうか。

ーーーーーーーーーーーーーーーーーーープログラム

def outer(x): def inner(word): echo = word * x return echo # Return inner_echo return inner ”””POINT A c2 = outer(2) c3 = outer(3) ”””POINT B print(c2(‘hello'), c3('hello'))

上記のプログラムを実行した場合、
はじめてouter(x)が実行されるのは、
POINT Bでしょうか。

もしその場合、以下の順序でプログラムは実行されるのでしょうか。
複数の引数、Nested構文を利用したばあいのプログラムのトレースの仕方を教えてください。

プログラムの実行順序
*”hello”という引数は、innerで利用され、数値2は、outerで利用される。

  1. print(c2(“hello”), c3(“hello”))が実行される
    1. はじめに、c2(‘hello’)が実行される。
    2. その後C2 = outer(2)が実行される
    3. outer(2)でdef outer(2):が呼び出される。
    4. Return innerでdef inner(“hello”):呼び出される。
    5. Echo = word * x が計算され、 hellohelloとなる
    6. Returnでechoが戻り値となる(hellohello
    7. Returnでinnerが戻り値となる(hellohello)
    8. C2に4が格納される
  2. C3 = outer(3)が実行される
    1. C2と同じのため省略

ーーーーーーーーーーーーーーーーーーーーーーーーー
質問:
1。プログラムのトレースは正しいでしょうか。
2。今回は、outerが数値、innerが文字列を引数としました。
しかしながらprint(c2(‘hello’), c3(‘hello’))では、functionを呼び出ししていません。(c2を呼び出しただけ。)
なのになぜ、outerが数値、innerが文字列として引数が渡されたのでしょうか。

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

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

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

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

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

TakaiY

2022/12/02 14:45

pythonはインデントが重要な言語ですあg、これではコードが読めませんので、質問を編集して、</>ボタンを押して出てくるフォームの**間**にソースを挟んでください。
guest

回答1

0

ベストアンサー

1。プログラムのトレースは正しいでしょうか。

正しくありません。

まず、関数の実行の理解が違います。
pythonでは(他の言語もそういうものが多いですが)、関数名(関数に束縛されている変数名)の後に「()」を付けると、その関数が()内の値を引数にして呼ばれます。

python

1c2 = outer(2)

このとき、outer関数が、引数2で呼ばれ(実行され)ます。

次に、関数を返す関数があるということです。(ご存知かもしれません)
pythonは関数(メソッド)そのものを、数値や文字列などと同様に、変数を束縛したり、関数の引数にしたり、関数の返り値にしたりすることができます。
関数名は変数であり、その変数は関数そのものに束縛せされています。 このことを「変数に関数が代入されている」と言うこともあります。
outer関数は、最後に「return inner」としていますね。 innerはouter関数内部で定義している関数の名前です。ということは、outer関数は、inner関数を返しているということになります。
また、inner関数はouter関数の引数である x を使って定義されていますので、xの値によって動作が変ります。
c2 が束縛されるinner関数は、word * 2 となり、 c3 が束縛されるinner関数は、word * 3 となります。

c2, c3 が実行されるのはどこかというと、 c2() とか c3() のように呼ばれたところですから、「print(c2(“hello”), c3(“hello”))」のところですね。
ここでは、 c2, c3 (両方とも元inner関数) に hello が引数で渡されていますから、 c2 では helloが2つ、 c3ではhelloが3つ、表示されることになります。

ということで、実行順を書くと、

python

1c2 = outer(2) # outer(2)が実行され、返り値の inner関数(xが2で定義)で c2 が束縛される。 2c3 = outer(3) # outer(3)が実行され、返り値の inner関数(xが3で定義)で c3 が束縛される。 3 4print(c2(‘hello'), c3('hello')) 5 # c2('hello') が実行され、 "hellohello" が返され、 6 # c3('hello') が実行され、 "hellohellohello" が返され、 7 # それらがprint()に引数として渡され、 hellohello hellohellohello が表示される。

という感じです。

何かがさかのぼって実行されることはなく、順に実行されるということです。。

投稿2022/12/02 15:06

TakaiY

総合スコア12783

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

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

net-sn

2022/12/02 15:50

ご丁寧に有難うございます!!! 読めました!!!! 「変数に関数が代入されている」という規則を知らずに、return inner時に、innerが実行されていると思い、コードが正しく読めずにいました。 また、C2という関数の中に、inner関数(xが2で定義)されるというのは奥が深いですね。 読めた時、嬉しくなりました! 有難うございました!
TakaiY

2022/12/03 02:35

よかったです。 「C2という関数の中に、inner関数(xが2で定義)される」 気になったので。 outer関数のなかで定義されている関数は、outerが呼ばれるたびに再定義されます。 そして、その定義の中にouterの引数が入っているので、outerの引数が異なれば異なる関数が作られるということです。 作られた関数は returnで返され、 c2 や c3 に入っているということです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問