情報学部 菅沼ホーム 目次 索引

Python の実行と基本構造

      Python で記述された命令(スクリプト)を実行させる方法として,二つの方法が存在します.一つは,Python のインタプリータを実行し,表示されたコマンドプロンプトの後に,コマンドを会話的に入力し実行させる方法です.他の一つは,スクリプト(コマンドや関数定義等の集まり,プログラム)をファイルに記述しておき,そのファイルを実行させる方法です.
  1. Python の実行

    1. 対話モード

        最初に,対話モードで実行する方法について説明します.Window のコマンドプロンプトを起動し,
      > Python				
      と入力すると,Python のインタプリータが起動し,「 >>> 」というコマンドプロンプトが表示されるはずです(もちろん,この前に,Python をインストールし,適切な箇所に PATH を設定しておく必要があります).ただし,Python 3.3 とそれ以降のシステムワイドなインストールでは,ランチャが PATH に追加され,2 種類の Pythonがインストールされていても,
      > py -2  # Python 2.* の実行
      > py -3  # Python 3.* の実行				
      のいずれかを入力すれば,希望する Python インタプリータを起動することができます.以後の例においても同様ですが,上の例における # から行末まではコメントです.なお,インタプリータを終了させるには,ctrl-Z,または,quit() を入力します.

        以下の例に示すように,プロンプト「 >>> 」が表示されている状態で,式や関数を入力すれば,その結果が出力されます.なお,以後の例においても同様ですが,行番号は,説明のために付加してあります.

      01	>>> print(2 + 3)
      02	5
      03	>>> 3 + 4
      04	7
      05	>>> 10 + _
      06	17
      07	>>> a = 10
      08	>>> if a == 10:
      09	...     print(a)
      10	...
      11	10
      12	>>> 'abc'
      13	'abc'
      				
      01 行目

        print() はオブジェクトを表示するための組み込み関数です.表示されるオブジェクトは,組み込み関数 str() が行うように文字列に変換されます.Python においては,数値,数値の集まり,など,ほとんどのものをオブジェクトと呼びます.ここでは,演算した結果を表します.

      05 行目

        直前の計算結果が変数「 _ 」に入っています.もし,このような変数が存在しなければ,
        >>> c = 3 + 4
        >>> 10 + c					
      のように,「 3 + 4 」の結果を,c に記憶しておく必要があります.変数「 _ 」の存在は,その手間を省き,より簡単にプログラムを書くことができるようになります.しかし,変数「 _ 」の意味も覚えなければならない,Python を知らない人には 5 行目を理解できない,などの点を考えると,どちらが好ましいのでしょうか.プログラムにとって最も重要なことは,「読みやすく,理解しやすい」ことです.「記述しやすい」などと言ったことは二の次です.以下の章においても,見ただけでは何を行おうとしているのか理解できないような記号や表現がよく現れます.できる限り,そのような記号や表現の使用は避けた方が良いと思います.以後,多くのプログラム例を示しますが,変数や関数の説明箇所を除き,できる限り Python に対する知識はないが,他の言語に対する知識があるような人にも理解しやすいことを念頭に置いて,プログラムを書いていきたいと思います.

      08 行目~ 10 行目

        一つの命令が複数行にわたる場合,2 行目以降に対してはプロンプト「 ... 」が表示されます.複数行にわたる命令を終了させるためには,プロンプト「 ... 」に対して改行だけを入力します( 10 行目).

        if 文については,後ほど説明しますが,08,09 行目は,C++ によって記述すれば,
        if (a == 10)
         	cout << a;					
      となります.C++ においては,09 行目の出力文に対する字下げを行わなくても実行可能ですが,Python においては,字下げ自体が構造を決定する要素であるため,必ず字下げする必要があります.字下げも正しく行わない C/C++ のプログラマがいることを考えると,C/C++ においても,字下げを強制するような仕様が好ましいかもしれません.

        また,以下に示すように,対話モードに入ること無しに,Python のコマンドを実行することも可能です.結果は,Window のコマンドプロンプト上に出力されます.
      py -3 -c print(2+3)   # 一般形: python -c command [arg] ... 				

    2. ファイルの利用

        複雑な処理を行いたい場合,対話モードを利用して一連のコマンドを順に入力していくことは大変な作業になります.そこで,一連のコマンド(スクリプト)をファイル,例えば cal1.py (一般的に,ファイル名は「~.py」)に,
      # -*- coding: UTF-8 -*-
      a = 10
      b = 20
      print(a + b)				
      のような形で保存し,Window のコマンドプロンプト上において,
      py -3 cal1.py   # 一般形: python ファイル名 [arg] ... 				
      と入力することによって,結果を得ることができます.なお,ファイル内容の 1 行目は,文字コードを表しています.

        モジュールも,上に示したファイルと同様,Python の定義や文が入ったファイルです.大きなプログラムの一部や,他のプログラムにおいても使用可能な汎用的な処理部分を記述するために使用されます.例えば,以下に示すモジュール cal2.py は,加算または減算を実行し出力するためのものです.なお,def で始まる部分は,関数を表しています.
      # -*- coding: UTF-8 -*-
      
      def add(a, b):
      	c = a + b
      	print(c)
      
      def sub(a, b):
      	c = a - b
      	print(c)				
      このモジュールを使用することによって,例えば,以下に示すような処理を実行できます.
      >>> import cal2
      >>> cal2.add(2,3)
      5
      >>> cal2.sub(2,3)
      -1				
        「cal2.add(2,3)」の「cal2.」の部分を記述したくない場合は,上の 1 行目の代わりに,
      >>> from cal2 import add				
      を入力してやれば,「add(2,3)」の記述で正しく動作します.また,
      >>> from cal2 import *				
      という記述を利用すれば,モジュールで定義されている全ての名前(関数内で定義されているローカルな変数名は除く)を import できます.この例の場合は,関数 sub に対しても,「sub(2,3)」の記述で正しく動作するようになります.

        場合によっては,モジュールまたはその一部を,Window のコマンドプロンプト上から実行したい場合があります.例えば,上の例において,関数 add を実行したい場合について考えてみます.Window のコマンドプロンプト上から
      py -3 cal2.py 2 3				
      と入力しても何も出力されません.しかし,cal2.py の最後に,
      if __name__ == "__main__":
      	import sys
      	add(int(sys.argv[1]), int(sys.argv[2]))				
      の 3 行を追加すると,
      py -3 cal2.py 2 3
      py -3 -m cal2 2 3				
      のいずれの方法によっても,結果が正しく表示されるようになります.なお,__name__ は,モジュール名が記憶されているグローバル変数です.
  2. プログラム構造

    1. 行構造

        C/C++ のプログラムは,自然言語と同様,一つの文の開始や終了位置に特別な制限がなく,フリーフォーマットで記述できますが,Python のプログラムは行単位(行頭から改行まで)で処理されます.ただし,一つの文を 1 行で記述できない場合は,以下に示すように,バックスラッシュ文字「 \ 」を使って継続させることが可能です.また,\ で継続する行(下に示す文の 1,2 行目)の後ろには「 # 」記号を使用してコメントを記述することができません.
      a = abc + efg * xxx \
          + aaa - bbb / ccc \
          + yyy / 30 + hhh   # ~ に関する計算				
        なお,以下に示すように,丸括弧 ( ),角括弧 [ ],および,波括弧 { } 内の式は,バックスラッシュを使わずに複数行を使用して記述することが可能です.このときは,各行ごとにコメントを記述することができます.
      aaa = [1, 2, 3,   # ~
             4, 5, 6,   # ~
             7, 8, 9]   # ~ 				
        C/C++ と同様,if 文while 文など,実行順序を制御するための文が Python にも存在します.しかし,その記述方法は C/C++ とはかなり異なっています.詳細については後ほど述べますが,ここでは,行単位の入力方法について説明します.例えば,if 文の場合,C/C++ では以下に示すように記述されます.
      01	if (条件) {
      02		a = 10;
      03		b = 20;
      04	}
      05	else {
      06		c = 30;
      07		d = 40;
      08	}				
        この文は,条件が真であれば 02,03 行目を実行し,偽であれば 06,07 行目を実行することを意味しています.プログラムの読みやすさのため,上の例に示すように,02,03,06,07 行目は,01,04,05,08 行目に対して,半角スペースまたは Tab を使用して字下げを行うべきですが,波括弧 { や } が正しく設定されていれば,字下げを行わなくても正しく動作します.また,条件が真または偽に対する処理が 1 文だけで記述できる場合,例えば,条件が真である場合は 02 行目だけとなる場合は,01 行目や 04 行目の波括弧も必要ありません.さらに,読みやすさの点を無視すれば,各行を複数行にわたって記述したり,すべてを同じ行に記述することも可能です.

        しかし,Python の場合は,条件が真や偽になる場合の処理が複数行となる場合であっても,波括弧を使用しません.以下に示すように,半角スペースまたは Tab を使用して字下げを行うことによって,その制御範囲を記述することになります.この点は,while 文等に対しても同様です.つまり,Python においては,制御構造を正しく理解し,適切な字下げを行わないと,目的とする結果が得られません.場合によっては,コンパイルさえ行ってくれません.適切な字下げが行われていない C/C++ などで記述された汚いプログラムを見ると,他の言語に対しても,Python の考え方を導入して欲しいと思います.ただし,プログラムが長くなると,波括弧があった方が見やすく感じます.インデントの強制的な使用は重要ですが,見やすさの点からいって,波括弧を付けさせた方が良いのではないでしょうか.
      01	if 条件 :
      02		a = 10
      03		b = 20
      04	else :
      05		c = 30
      06		d = 40				

    2. コメント

        以下に示すように, # から改行まではコメントとみなされます.
      a = 10   # 変数 a に 10 を代入 				
        また,以下に示すように,Python スクリプト中の 1 行目か 2 行目にあるコメントが正規表現 coding[=:]\s*([-\w.]+) にマッチする場合,コメントはエンコード宣言(プログラムを記述する文字コードの宣言)として処理されます.
      # -*- coding: UTF-8 -*-				
        Python には,C/C++ における /* と */ のように,複数行にわたるコメントを記述する記号は存在しません.しかし,Python では,代入などの演算を行わず,単に文字列だけを記述した場合,その文字列に対する処理は行われません.そこで,3 連引用符(引用符を 3 つ続ける) ''',または, """ を使用した複数行に亘る文字列を利用することにより,以下に示すように,複数行にわたるコメント(的な文字列)を記述することが可能です.
      """
         コメント・・・
         コメント・・・
      """				
        なぜ,C/C++ や Java などのように,// や /* */ でコメントを表すような方法が採れないのでしょうか(除算記号 // のため?).今まで多くの言語で使用されてきた方法に問題がなく,かつ,新しく作成する言語の設計に支障がないようであれば,同じ方法を使用すべきだと思います.言語設計者の趣味や差別化のために変更するようであれば,言語使用者にとって非常に迷惑です.

情報学部 菅沼ホーム 目次 索引