dポイントプレゼントキャンペーン実施中!

ってちゃんと書く人がいるんですか??ぱいそん

A 回答 (4件)

> でもなんでspamのなかみそういう例にしたんですか?



元ネタはこれ。

Learn to Program:
https://pine.fm/LearnToProgram/chap_06.html

言語はRubyだけどね。
    • good
    • 0
この回答へのお礼

そなんですね。笑笑
ありがとうございます(๑•̀ㅁ•́๑)✧

お礼日時:2023/12/31 22:01

例えば次のようなプログラムを書くとする。



実装例1:
https://www.ideone.com/uhkrXk

関数を定義して、実行部があるプログラムだ。
こいつを、例えばspam.pyと名付けるとする。
んで、例えば端末で引数を付けて呼び出すとそのまま実行してくれる。

➜ ~ python3 spam.py ゆゆにゃ。
おー、輝かしい未来が見えるぞよ。
➜ ~ python3 spam.py cametan_42
汝の未来は・・・おっと待った、いま何時だ!
私は行かねばならない。失敬する!

まぁ、この通りだよな。プログラムで書いた「実行部」が実行されるわけ。
ところが、こいつを他のPythonプログラムから呼び出すとやっぱり「実行される」わけ。
例えば次のようなプログラムがあるとする。

実装例2:
https://www.ideone.com/96u0ww

最初に書いたspam.pyをimportだけしてる。こいつをspamspam.pyとでも名付けてspam.pyと同じフォルダに突っ込んでおけば、spamspam.pyを起動させただけで

➜ ~ python3 spamspam.py ゆゆにゃ。
おー、輝かしい未来が見えるぞよ。
➜ ~ python3 spamspam.py cametan_42
汝の未来は・・・おっと待った、いま何時だ!
私は行かねばならない。失敬する!

となる・・・嬉しいか?
これ、実は通常は望んだ結果じゃない。「モジュールをimportしただけでモジュールに含まれてる実行部が実行される」ってのは嬉しくないよね。「黙ってろ」とか思うだろう。
「あるモジュールをimport」したい場合って大抵は書いてる関数とかクラスに用があるんであって、「実行部分」は必要ないんだよ。
つまり、単体で端末でスクリプトとして使う場合は実行部は必要なんだけど、モジュールとしてimportしたい場合は実行部は実行されて欲しくない。
そういう、実行部分を「都合が良い処理」として書くためにif __name__ == "__main__"がある。上のspam.pyならこう記述した方がいい。

実装例3:
https://www.ideone.com/2KLDvD

こうすれば端末上でスクリプトとして呼び出せば実行部分は実行されるけど、別のプログラムが関数fooを使いたくてspam.pyをimportした場合は実行部分が実行されない。

➜ ~ python3 spam.py ゆゆにゃ。
おー、輝かしい未来が見えるぞよ。
➜ ~ python3 spam.py cametan_42
汝の未来は・・・おっと待った、いま何時だ!
私は行かねばならない。失敬する!

実行結果自体は変わんないけどね。
なお、プログラムを書いて、いちいち端末上でpythonとかpython3とかインタプリタ名をコマンドとして書くのも嬉しくないんで、通常はif __name__ == "__main__"はシェバングと組み合わせる。具体的には次のように書く。

実装例4:
https://www.ideone.com/l32mLK

シェバングで使用する言語環境を指定出来る・・・ってこれは本当はUNIX流儀なんだけど、最近のWindows版Pythonもこれが使えるようになった・・・Windowsじゃちと意味不明なんだけど、お陰さんでWindows <-> UNIXでのPythonプログラムの「変更」が一つ減ったわけ。
いずれにせよシェバングを使えば端末上で「書いたプログラム(ファイル)名」だけ与えればスクリプトが実行されるようになる。

➜ ~ ./spam.py ゆゆにゃ。
おー、輝かしい未来が見えるぞよ。
➜ ~ ./spam.py cametan_42
汝の未来は・・・おっと待った、いま何時だ!
私は行かねばならない。失敬する!

端末での「コマンド名」が書いた「プログラム名(ファイル名)」だけ、になるんで、これで立派なCLIのプログラムになりました、めでたしめでたし、と言うわけ。
わかりましたか?
「なんで if __name__ == "」の回答画像3
    • good
    • 0
この回答へのお礼

にゃるほど!なんかわかりました(๑•̀ㅂ•́)و✧
すごい丁寧にかいてくれて、ありがとうございます。
でもなんでspamのなかみそういう例にしたんですか?笑 占い??

お礼日時:2023/12/31 10:29

> 意味が結構わかりません。



日本語不得手なのかしらん。
「端末」って分かる?WindowsでのDOS窓とか。UNIXのShellとか。
    • good
    • 0
この回答へのお礼

うーん・・・

えとー、なんとなくわかりましたけど、まだ必要性はわかりません。。

お礼日時:2023/12/30 20:04

端末で起動するスクリプト/プログラム目的。

    • good
    • 0
この回答へのお礼

うーん・・・

意味が結構わかりません。

お礼日時:2023/12/30 12:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A