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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

5回答

588閲覧

python 関数の記述場所と呼び出しについての疑問を解決したい

alpha95

総合スコア10

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2021/05/09 08:11

pythonの関数の読み込みに関して疑問があります。
下記のtest.pyというファイルががあります。

def run(): print("走る") walk() def walk(): print("歩く") print("Go!") run() print("ただいま")

出力結果

Go! 走る 歩く ただいま

疑問に感じている点としてはrun関数よりwalk関数の方が下に記述されているにもかかわらず、run関数実行時にエラーが発生せずにwalk関数が実行されている点です。

test.py実行時に関数が上から順番に読み込まれていて、下から2行目のrun()で関数を呼び出した時にはすでにwalk関数も読み込みが済んでいるためエラーが発生せずに"歩く"という文字列が表示されるということでしょうか?
かなり初歩的な質問ですが、教えていただきたいです。

よろしくお願いいたします。

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

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

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

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

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

guest

回答5

0

walk関数が呼び出された時点で呼び出し可能ならば問題ないです。

Python

1>>> def func(): 2... say_hello() 3... 4>>> func() 5Traceback (most recent call last): 6 File "<stdin>", line 1, in <module> 7 File "<stdin>", line 2, in func 8NameError: name 'say_hello' is not defined 9>>> 10>>> def say_hello(): 11... print('hello') 12... 13>>> func() 14hello 15>>> 16>>> def say_hello(): 17... print('こんにちは') 18... 19>>> func() 20こんにちは 21>>>

投稿2021/05/09 08:15

LouiS0616

総合スコア35668

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

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

0

test.py実行時に関数が上から順番に読み込まれていて、下から2行目のrun()で関数を呼び出した時にはすでにwalk関数も読み込みが済んでいるためエラーが発生せずに"歩く"という文字列が表示されるということでしょうか?

そうです

なので、下記のようにしたら、run()実行時にはまだwalk()は定義されてないので、エラーになります

python

1def run(): 2 print("走る") 3 walk() 4 5print("Go!") 6run() 7print("ただいま") 8 9def walk(): 10 print("歩く") 11 12# 実行したら「NameError: name 'walk' is not defined」となる

投稿2021/05/10 03:56

jbpb0

総合スコア7653

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

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

0

ベストアンサー

Pythonでは変数名で関数にアクセスしています。runという関数が知っているのは、walkという名前だけです。呼ばれたときのグローバル変数walkを呼び出すのです。

以下を見て考えてみてください。

python

1>>> def run(): 2... print("走る") 3... walk() 4... 5>>> def walk(): 6... print("歩く") 7... 8>>> def sleeping(): 9... print("眠る") 10... 11>>> print("Go!") 12Go! 13>>> run() 14走る 15歩く 16>>> print("休憩") 17休憩 18>>> walk = sleeping 19>>> run() 20走る 21眠る 22>>> print("ただいま") 23ただいま

投稿2021/05/09 08:40

ppaul

総合スコア24670

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

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

0

おそらくインタープリターという性質上このような疑問を持たれたのかもしれませんね。
初期の頃のものはともかく、昨今のものはいったんスクリプトを全部解析したのちに実行するかたちのものが多いと思います。
なので、関数を定義する位置に関してはコンパイルするものと大した違いはないと思ってよいかと。

そのへんも含めて、いまどきのコンピューターはリソースが潤沢になったので、(昔と比べて)富豪的なつくりになってきているという印象です。
とりあえず、それでも動くんだという認識でよいと思います。
いい時代になりましたね~
--- 追記 ---
ご指摘にあるように『Python の場合』ある程度の制約はあるようです。
スクリプトの先頭から順次ながめていって、何某かが実行される際にそれに関するものがそれ以前に定義されていれば問題ないというスタンスのようです。
なので、関数以外の処理を関数の定義前に書いてはいけないというわけではないらしい。

python

1a = 1 2 3def hoge(): 4 print(a) 5 6hoge()

まあフツーはしないと思いますけど。

投稿2021/05/09 08:36

編集2021/05/09 11:18
takasima20

総合スコア7464

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

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

bsdfan

2021/05/09 08:53

この回答だと、たとえば def walk() の前に run() を実行しても問題ないように読めますが、そんなことないです。
guest

0

pythonでは、関数の位置には依存しません。
その関数がどこかに書いてあれば、実行できます

そして、いずれの関数にも属していないコードが、起動時に実行されます

print("Go!")

run()
print("ただいま")

ということで、このコードが実行されますね

投稿2021/05/09 08:17

y_waiwai

総合スコア88042

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問