こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Pythonのプログラムの実行の考え方について

pythonの教科書のサンプルの実行についてお尋ねします。

テキストのサンプルには普通、インタープリターで書いてあるものと、プログラムをファイルに書き出してそれをコマンドで一気に処理するもの(こちらの方が他の言語の実行に近いか)の2通りがあります。
インタープリター向きに記述されたものをファイルに書き出してpythonコマンドで、インタープリターと同じように実行するにはどのような書き換えが必要になるのでしょうか。結果を出力するときにインタープリターでは配列名を入力するだけでその内容が出力されたりしますが、ファイルではそれができないのでコマンドを指定するとかになると思いますが、他になにかあるでしょうか。

ファイルに書き出したプログラムの実行ですが、Pythonコマンドを実行しても実行形式の出力がないのでコンパイルではないわけですが、これはバッチとかシェルスクリプトと同じような意味になるのでしょうか。1行1行実行していくということですが。とするとインタープリターと同じになるのかなと思うのですが。

実行形式が単体のファイルとして出力されて単体として実行できるというのは従来のプログラム(C,Fortranなど)ですが、Pythonはそれがないわけですね。Ruby, Perlに近いものなのでしょうか。速度が求められる科学技術計算ではライブラリを導入して高速化できるということですが、どの程度かなと思いますが。その中間的なものがJavaなのかなと思いますが(半分実行ファイルみたな)。

たぶんベタな質問と思いますが、よろしくお願いします。

投稿日時 - 2018-07-25 07:56:52

QNo.9521642

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

”インタプリタ”か”コンパイラ”かの違いと考えて
ややこしくしてしまっているような気がします。

Pythonはインタプリタですが、
そのインタプリタをインタラクティブ(対話モード)で使っているときは、
変数名をキーインするだけで その中身をダンプしてくれるのに
同じインタプリタを ファイルを使って実行すると、変数名だけの行は なにもしてくれないのは 何故かということですよね。

Pythonのインタプリタに インタラクティブモードがあって
そこでは、そのように作ってある、としか言いようがないかと。
(同じインタプリタでも例えばperlはそういう作りになっていないです)

もし、インタラクティブ実行用に記載された教科書の内容を
ファイル化して実行するのなら 変数名だけのとこを print(変数名); に書き換えるか、
python -i < ファイル
のように実行しては どうでしょう。

投稿日時 - 2018-07-26 09:28:36

ANo.2

うーん、ちょっと質問が錯綜してますねぇ。明解じゃないかも。

取り敢えず。

> インタープリター向きに記述されたものをファイルに書き出してpythonコマンドで、インタープリターと同じように実行するにはどのような書き換えが必要になるのでしょうか。

pythonコマンドを用いるなら書き換えは特に必要ないです。

> 結果を出力するときにインタープリターでは配列名を入力するだけでその内容が出力されたりしますが、ファイルではそれができないのでコマンドを指定するとかになると思います

「インタプリターでは配列名を入力するだけでその内容が出力されたり」するのは、それがインタプリターの機能だから、です。
例えば配列(Pythonには配列がないので、リストやタプルの事だと思いますが)「だけ」を記入されたファイル

# 例(test.pyとする)
a = [1, 2, 3, 4, 5]

なんかを端末(ターミナル)で、

python test.c

等と実行しても何も表示されないのは「当たり前」ですね。
どうしてか、と言うと「出力しろ」って言ってないからですよ。

C言語なんかでも(test.cとする)

#include <stdio.h>

int main(void) {
 int a = {1, 2, 3, 4, 5};
 return 0;
}

なんかやってコンパイルして実行しても、何も表示されないですよね。
何故か?簡単です。端末に対して「表示しろ」って命令してないから、です。
要するに、CだろうとPythonだろうと「表示しろ」って命令しないと端末は何も反映しない。
これはコンパイラ型言語だろうとインタプリタ型言語だろうと変わりません。
必要なのは「出力」命令です。

> ファイルに書き出したプログラムの実行ですが、Pythonコマンドを実行しても実行形式の出力がないのでコンパイルではないわけですが、これはバッチとかシェルスクリプトと同じような意味になるのでしょうか。

同じです。

> 1行1行実行していくということですが。とするとインタープリターと同じになるのかなと思うのですが。

と言うより、原理的にはバッチとかシェルスクリプトは「インタプリタ」です。

> Ruby, Perlに近いものなのでしょうか。

近いです。

> 速度が求められる科学技術計算ではライブラリを導入して高速化できるということですが、どの程度かなと思いますが。

これは自分で実験した方が良いでしょう。
有名どころだと

Numpy:
https://www.numpy.org/

SciPy:
https://www.scipy.org/

等の外部ライブラリが広く使われています。
Python自体は決して速い言語ではないですが、このテの外部ライブラリはC言語等で書かれてる模様で、スピードはかなり高速になっています。
(ちなみに、設計は、話によるとMatLabなんかを参考にしてる模様です)

> その中間的なものがJavaなのかなと思いますが(半分実行ファイルみたな)。

この辺りちとややこしいんですが、せっかく質問されてるんで敢えて書きます。
実際はPythonは内部的にはJavaに近いです。

Javaがコンパイラなのかインタプリタなのか、と言うのは視点によって違いますが、「最下位」レベルだと実はインタプリタです。
Java仮想マシン、と言うのは実態はインタプリタで、もっと言っちゃうと、Javaより下のレベルであるCPUの動作原理ってのもインタプリタですね。嘘、って思うかもしれませんが本当です。
CPUと言う「高速なインタプリタ」に対して最適なマシン語(と言うかアセンブリですが)を出力するのがC言語やFortran等の「コンパイラ型言語」、Javaの場合は対象がCPUではなく「Java仮想マシン」と言うインタプリタに対して適切なマシン語(CPU相手ではないので、中間コードとかバイトコードとか呼びますが)をコンパイルします。それがJavaの仕組みです。

で、PythonがJavaに近い、と言うのはPythonも実は仮想マシンを持ってて、Pythonはそれに向けての中間コード/バイトコードへのコンパイル機能を持ってるから、です。
従って、Pythonが旧来の意味で「インタプリタ」なのか、ってのはそれは違ってて、曲りなりにもコンパイラを持ってますが、C/Fortran/Javaとの違いは「明示的にコンパイルするコマンドが無い」と言う事です。つまり、「自動で」「必要と思われる時」コンパイルをします(主にモジュール作成時ですかね)。
これがPythonの特徴と言えば特徴なんですが、昨今、こういう形の「仮想マシン込み」でのコンパイル機能付きのインタプリタは「結構存在してて」、ぶっちゃけた話、コンパイラ型言語とかインタプリタ型言語と言う「区分け」は意味が無くなってきています。要するに、「見かけインタプリタ」なんだけど、内部で仮想マシン対象に「自動コンパイル」するプログラミング言語は、結構良くあるんですよね。
Pythonの場合、作成したファイルのタイムスタンプとバイトコードのタイムスタンプを比較して、「日時が食い違ってる時」、つまり、ファイルが「新しく書き換えられた時」自動でバイトコンパイルしたりします。そういう「余計な作業」もやってるんで、速度が落ちてる、って面もあるのです。

> 実行形式が単体のファイルとして出力されて単体として実行できるというのは従来のプログラム(C,Fortranなど)ですが、Pythonはそれがないわけですね。

単体として実行出来るか出来ないか、と言うのもインタプリタであるか、とかコンパイラであるか、ってのは関係ないです。
Pythonでは、PerlやRubyなんかでお馴染みの(UNIX上では)、シェバングと言う機能があり、冒頭にまずは

#! /usr/bin/python

なり

#! /usr/bin/env python

を記述します。
ただし、これはUNIX系のOS(MacやLinuxやFreeBSD等の)での「お約束」ですが、Windowsだと

@python -x "%~f0" %* & exit /b

辺りかな?をやっぱりプログラムファイルの冒頭に記述します。

そしてファイルの最後に

if __name__ == '__main__':

と記述して、ここに色々書いていけば、Pythonコマンド無しで「単体の」プログラムとして走ります。

# 例(test1.py)

#! /usr/bin/env python
## これはUNIX系OSの場合

a = [1, 2, 3, 4, 5]

if __name__ == '__main__':
  print(a)

# 実行例

➜ ~ ./test1.py
[1, 2, 3, 4, 5]
➜ ~

投稿日時 - 2018-07-25 23:31:40

ANo.1

インタープリタ自体の認識が間違っていると思うのですが…。

Pythonはスクリプト言語だから、インタープリタ言語であると言えて、誰かがインタープリタにしたりしなかったりするものではないですよね。

そんな感じで質問で言いたいことが理解できないので、Hello Worldで構わないので、実例で説明してくれたら正しく伝わるのではないかと思います。

あと、説明内に、教科書のサンプルとかテキストのサンプルという記述がありますが、同じものですか?

同じことは同じ単語で書いていただけると理解しやすいですね。

投稿日時 - 2018-07-25 08:15:31

お礼

回答ありがとうございます。私の質問の文章が急ぎすぎて不正確になっているようです。すみません。サンプルという言葉がさすものはすべて同じです。
例えば、本には以下のような事例が載っています。
IN: import numpy as np
IN: list_a = [1,2,3,4,5,6,7,8,9]
IN: array_a = np.array(list_a)
IN: array_b = np.reshape(array_a,(3,3))
IN: array_b
Out: array([1,2,3],
[4,5,6],
[7,8,9])


これを
import numpy as np
list_a = [1,2,3,4,5,6,7,8,9]
array_a = np.array(list_a)
array_b = np.reshape(array_a,(3,3))
array_b
1つのファイルabc.pyに書き込み、python abc.pyとしても何も起こらないということになります。最後のarray_bというのはインタープリター(でいいでしょうか?)ではその内容を表示せよという意味になるはずですが、通常のコマンドプロンプトでの実行ではそれを受け付けているが、端末には出さないということですね。端末に出そうと思ったら例えばprint(array_b)とすれば出るでしょうか。

このように実行の仕方が2つあってそれによって操作とか編集の仕方が違うということになるのかどうか?という質問です。インタープリターと書きましたが、一種のコマンドの入力のように思うのですが、このような操作の場合、入力した操作を記録することは可能なのでしょうか。せっかく長々と入力したのに記録が残らず、再確認するときはまた最初から打ち直しなのかということもあるので。
よろしくお願いします。

投稿日時 - 2018-07-25 16:06:45

あなたにオススメの質問