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

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

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

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

Q&A

解決済

2回答

252閲覧

__name__ == '__main__':の実行方法

midsum0323

総合スコア40

Python 3.x

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

0グッド

0クリップ

投稿2018/05/17 21:35

基本的なことで恐縮ですが、
たとえば

def test(): print('Hello World!') if __name__ == '__main__': test()

のような
実行部分が
name == 'main':
の場合、SpyderやJuypterNotebookで実行できるのでしょうか。
実行できない場合、どのように改変すればSpyderやJuypterNotebookで実行すればよろしいのでしょうか。
不可能な場合どのような方法で実行できるのでしょうか。

入門書とか読んでもよくわからないので教えていただけないでしょうか。

場違いかもしれませんがよろしくお願い申し上げます。

環境
Windows10
Python3.6
Anaconda3を使用

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

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

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

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

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

guest

回答2

0

ベストアンサー

Python

1if __name__ == '__main__':

の意味について。

上記は一言で言ってしまえば、「ライブラリとして読み込んだ時の実行防止」のためにあります。

例示されたような内容のtest.pyというファイルがあったとします。
これを直接実行する場合、すなわち

Shell

1$ python test.py

と実行した場合、上記のif文のある~~名前空間(と言っていいのかな?識者のフォロー求む)~~モジュール名は__main__となります。

一方、このtest.pyを、test関数を提供するライブラリとしてimportする場合。

Python

1import test 2 3test()

上記のようなtest2.pyがあったとします。
この場合、test関数が実行される回数は、さて何回でしょう?

・・・答えは1回、test2.pyの中でのみ実行されます。
なぜならば、importしたtest.pyの中では、モジュール名を示す__name__の値はtestとなるからです。

この仕組みにより、「直接実行した場合にだけ、何か処理を行う」という機能と、「ライブラリとして機能を使いまわしたい場合に余計なことをしない」機能の両立がなされるというわけです。

投稿2018/05/18 00:08

編集2018/05/18 01:53
kazto

総合スコア7196

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

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

dodox86

2018/05/18 01:20

> if文のある名前空間(と言っていいのかな そう言えば正式にはどう区別して呼ぶのかと思って私も確認してしまいましたが、python公式を見ると、“__name__”属性はpython2でも3でも https://docs.python.org/2.7/library/stdtypes.html?highlight=__name__#definition.__name__ https://docs.python.org/3/reference/import.html?highlight=__name__#__name__ 「モジュール名(name of module)が入る」となっていて、そうかと思って “__main__” の説明を見てみると今度は https://docs.python.jp/3/library/__main__.html 「トップレベルのコードが実行されるスコープの名前(name of the scope in which top-lelvel code executes))」 となっていて、pythonの名前空間と言うわけでもなさそうに思うも、意味的には重なりそうでもあって、ちょっと混乱しますね。
kazto

2018/05/18 01:51

フォローありがとうございます! 基本はモジュール階層を一意に識別するためのモジュール名が入っていて、トップレベルのモジュール名が疑似的に"__main__"として定義されている、という雰囲気でしょうかね。 他の言語でいう「namespace」とはちょっと違いますから、説明の中で名前空間と言ってしまうと混乱しそう。直します。
guest

0

Spyderで普通に実行できました。
ただ、処理速度はそんなに早くないですね。

投稿2018/05/17 21:47

midsum0323

総合スコア40

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

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

mkgrei

2018/05/17 22:20

if文の実行速度の話ですか?←処理速度
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問