pythonプログラムのはじめの「#!」や「if __name__ = "__main__"」について
仕事上、データ分析でpythonを使用してるが、より良いコードがかけるように改めて学び直しています。
Hello, World!を出力するプログラム
#!/usr/bin/env python # -*- coding; utf-8 -*- def main(): print("Hello, World!") if __name__ = "__main__": main()
よくあるプログラミング入門の最初のステップです。 "Hello, World"を出力するだけなのになぜこんなにも長いのでしょうか。
1行目: シバン(Shebang)
#!/usr/bin/env python
シェルがファイルを実行可能ファイルを扱うときに、書かれたプログラムを使って処理するためのものです。
/usr/bin/python のように特定のパスのpythonをしておらず、/usr/bin/env経由でpythonを指定することで、パスに依存せずに呼び出すことができます。
シバンの指定があるソースコードは、ファイルの実行権限を付与することで直接実行できます。
$ cmod +x helloworld.py $ ./helloworld.py Hello, World!
2行目: エンコード宣言
# -*- coding; utf-8 -*-
2行目はエンコード宣言と呼ばれ、ソースコードをどの文字コードを使って解釈すればよいかを指定します。
日本語などマルチバイト文字を含む場合に特に必要です。
main関数
def main(): print("Hello, World!")
main()関数として、"Hello, World"を出力します
特殊属性
if __name__ = "__main__": main()
__name__は特殊属性と呼ばれ、モジュールの名前が文字列で格納されています。
ここでは、__name__という名前の変数の内容が"__main__"という文字列と一致しているかをチェックして、一致する場合はmain()関数を実行しています。
if name = "main" とはなにか?
ここで、モジュールとは、実のところ単なるPythonファイル(*.py)そのものです。例えばhelloworld.pyというファイルであればhelloworldモジュールとなります。モジュールは別のモジュールなどからインポートして使うことができます。
実は、モジュールがスクリプトとして実行されるとき、__name__には__main__という文字列が格納されています。一方で、モジュールとして実行される場合は、"name"という文字列が格納されています。つまり、main()関数をモジュールとしてインポートして使う場合の配慮のため、if __name__ = "__main__":
をつけています。