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

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

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

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

Q&A

2回答

485閲覧

pythonのチュートリアル6章(6.1.1.)のサンプルコードについてわからない

GuMasi

総合スコア73

Python 3.x

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

0グッド

0クリップ

投稿2020/02/22 05:40

6章の一覧にあります「モジュールをスクリプトとして実行する」のサンプルコード(下記)についてなのですが、そちらに「つまりモジュールの末尾に:このコードを追加することで、このファイルが import できるモジュールであると同時にスクリプトとしても使えるようになります。なぜならモジュールが "main" ファイルとして起動されたときだけ、コマンドラインを解釈するコードが実行されるからです:」とあるのですが、

import sysのsysやfib(int(sys.argv[1]))の sys.argvはどちらのことを指しているのでしょうか?

python

1 2if __name__ == "__main__": 3 import sys 4 fib(int(sys.argv[1])) 5 6

チュートリアル6章

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

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

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

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

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

yukkeorg

2020/02/22 05:46 編集

「どちらのことを差す」とありますが、これはモジュールか、スクリプトかのとちらかという 意味でしょうか?
GuMasi

2020/02/22 05:53

コメントいただきましてありがとうございます >「どちらのことを差す」とありますが、これはモジュールか、スクリプトかのとちらかという 意味でしょうか? それもありますが、import sysのsysは標準ライブラリのことなのかや、 fib(int(sys.argv[1])についても同様です。
guest

回答2

0

sysは標準ライブラリです。
sys - Python 3.8.2rc2 Documentで説明されていますが、$ python fibo.py 50を実行した場合、fibo.pyargv[0]相当, 50argv[1]に相当します。
スクリプトとして実行した際に得た引数の数はlen(sys.argv)で確認できます。


"main" ファイルとして起動されたとき

というのはfibo.pyをスクリプトとして実行したり、関数定義以外の要素を入れてfibo.pyそのものを実行したときを指します。
下記例のようにfibo_test.pyのような別のモジュールにimport fiboした場合は、"main"ファイルはfibo_test.pyであり、fibo.pyではありません。

Python

1# fibo_test.py 2import fibo 3 4fibo.fib(10) 5fibo.fib2(10)

投稿2020/02/22 06:06

編集2020/02/22 06:18
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

GuMasi

2020/02/23 09:07

回答くださりましてありがとうございます。 そうなのですね。 ご丁寧に教えてくださりありがとうございます。
guest

0

(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するモジュールは

  1. 実行中の.pyファイルと同じフォルダーにあるファイル (「import abc」なら、abc.pyというファイルがimportされる)
  2. pythonの標準モジュール(組み込みモジュールを含む)に含まれるモジュール
  3. モジュール検索パス上にあるモジュール

の順序で探され、最初に見つかったものがインポートされます。

sysは(pythonに最初から入っている)組み込みモジュールのひとつです。
"import sys"で、何らかのスクリプトが実行される訳ではありません。
素直にsysというモジュールがインポートされた(sysはimportできるモジュール)と理解したら良いと思います。

投稿2020/02/22 08:48

coco_bauer

総合スコア6915

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

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

GuMasi

2020/02/23 09:11

回答していただきましてありがとうございます。 わかりやすく教えてくださりまして助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問