(1) まず、スクリプトしても使えるし、importすることもできるモジュールについて
(importは、"持ち込む"、"輸入する"というような意味を持つ英語の動詞です。"持ち込む"とか"輸入"とかの語がプロラムで使うのにぴったりこないので、元の英語 importや、それを片仮名にしたインポートという語が使われています)
'''
フィボナッチ数列のN番目の値を返す関数 fibonacci の定義
'''
# 関数を定義する部分
def fibonacci(num):
if num <= 2:
return 1
return fibonacci(num - 2) + fibonacci(num - 1)
# "python fibo.py 数字” で実行される部分
if __name__ == "__main__":
# import def_fibo
#import fibo #fibonacci関数の定義をインポート
import sys #
print(fibonacci(int(sys.argv[1])))
という内容のfibo.pyというファイルがあったとします。
そして、fibo.pyがあるフォルダーで、
python fibo.py 3
というコマンドを実行すると
2
という結果が表示されます。(フィボナッチ数列は、1,1,2,3,5と続いていく数の並びで、その3番目の 2 が表示されます)
fibo.pyは、fibonacci関数の定義と、fibonacci関数などを使ったコードを含んでいるので、スクリプトとして使える(実行できるコード)である訳です。
if __name__ == "__main__":
#fibo.pyで定義されている全ての関数をインポートする
from fibo import *
import sys #
print("フィボナッチ数列の"+sys.argv[1] +"番目の数字は")
print(fibonacci(int(sys.argv[1])))
また、上記の内容のファイル fibo2.py がfibo.pyと同じフォルダーにあったとして、
python fibo2.py 3
というコマンドを実行すると
フィボナッチ数列の3番目の数字は
2
と表示されます。
fibo2.pyにfibonacci関数の定義が直接書かれている訳ではありませんが、import文を使ってfibo.pyに書かれているfibonacci関数の定義をインポートしているので、fibonacci関数が使えた訳です。
このように、スクリプトしても使えるし、importすることもできるモジュール(.pyファイル)を書くことが出来るという事です。
定義とスクリプトとを1つのファイルに書けるということを説明したかったのでしょうが、判りにくい日本語ですよね。
===
(2)import sys と、sys.argv について
importするモジュールは
- 実行中の.pyファイルと同じフォルダーにあるファイル (「import abc」なら、abc.pyというファイルがimportされる)
- pythonの標準モジュール(組み込みモジュールを含む)に含まれるモジュール
- モジュール検索パス上にあるモジュール
の順序で探され、最初に見つかったものがインポートされます。
sysは(pythonに最初から入っている)組み込みモジュールのひとつです。
"import sys"で、何らかのスクリプトが実行される訳ではありません。
素直にsysというモジュールがインポートされた(sysはimportできるモジュール)と理解したら良いと思います。