初めてのPython(3章)

Pythonプログラムの実行方法は大きくは2つ

  1. 1行ずつ手入力
    • 対話型プロンプトを使う
  2. プログラムを書いたファイルを使う

インポートの方法は

  • import モジュール名
  • from モジュール名 import 属性名

1行ずつ手で実行

実行したいプログラムを対話型プロンプトのコマンドラインに入力する。
プロンプトの出し方は、ターミナル上で”python”と入力
プロンプトの抜け方は、”quit()” or ”Ctrl+D”

[kobakoba0723@fedora13-intel64 ~]$ python
Python 2.6.4 (r264:75706, Apr  1 2010, 02:55:51) 
[GCC 4.4.3 20100226 (Red Hat 4.4.3-8)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print 'Hello World'
Hello World
>>> 'Hello World'
'Hello World'
>>> 

プロンプトの場合、演算結果が自動的に出力される。
ターミナルからファイルを使う場合、出力は明示的に行わないといけない。

プログラムを書いたファイルで実行

対話型プロンプトは手軽に実行できるが、プログラムが実行されると消えてしまうことが欠点。
記述量が少ないうちは毎回入力すれば済むが、量が増えると大変なので、プログラムをファイルに記録することが有用。
実行したいプログラムを記録したファイルをモジュールファイルと呼ぶ。

モジュールファイルからの実行方法は3つ

  1. コマンドプロンプトからインタプリタに渡す
  2. 対話型プロンプトでインポート
  3. ファイルアイコンをクリック

実行するのは、hello.py

/usr/bin/env python

print 'Hello World'
コマンドプロンプトからインタプリタに渡す

コマンドプロンプトで”python ファイル名”と入力する

[kobakoba0723@fedora13-intel64 ~]$ python hello.py 
Hello World
[kobakoba0723@fedora13-intel64 ~]$
対話型プロンプトでインポート

対話型プロンプトを立ち上げて、”import ファイル名(拡張子を除く)”と入力する
モジュールをインポートする処理が走るので、プロンプトを抜けると.pycファイルが作成されている

[kobakoba0723@fedora13-intel64 ~]$ ls
anaconda  ダウンロード  デスクトップ  ビデオ  画像
hello.py  テンプレート  ドキュメント  音楽    公開
[kobakoba0723@fedora13-intel64 ~]$ python
Python 2.6.4 (r264:75706, Apr  1 2010, 02:55:51) 
[GCC 4.4.3 20100226 (Red Hat 4.4.3-8)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import hello
Hello World
>>> 
[kobakoba0723@fedora13-intel64 ~]$ ls
anaconda  hello.pyc     テンプレート  ドキュメント  音楽  公開
hello.py  ダウンロード  デスクトップ  ビデオ        画像
[kobakoba0723@fedora13-intel64 ~]$ 
ファイルアイコンをクリック

出来るんだろうけど使わないだろう。

モジュールのインポートとリロード

モジュールのインポートは、プログラムを書く上で不可欠な操作。
インポートを実行することで、モジュールの内容にアクセスできるようになる。
モジュール外部からアクセスできる内容を属性と呼ぶ。

モジュールのインポートはモジュール毎に1回のみ。
内容を編集し再インポートする時はリロード[reload(モジュール名)]
以下のhoge.pyを使って実験
(hoge.py)

#!/usr/bin/env python

print 'hogehoge'

print 'module hoge is executed'

まずimport

[kobakoba0723@fedora13-intel64 ~]$ python
Python 2.6.4 (r264:75706, Apr  1 2010, 02:55:51) 
[GCC 4.4.3 20100226 (Red Hat 4.4.3-8)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import hoge
hogehoge
module hoge is executed
>>> import hoge
>>> 

この状態で、hoge.pyを修正
(hoge.py)

#!/usr/bin/env python

print 'hogehoge'
print 'piyopiyo'

print 'module hoge is executed'

修正したものをインポート、リロード。

>>> import hoge
>>> reload(hoge)
hogehoge
piyopiyo
module hoge is executed
<module 'hoge' from 'hoge.py'>

インポートしても何も変わらないけど、リロードすると変更した内容が実行される。

モジュールの属性

「外部から利用できる内容」を属性というが、もう少し細かくいうと「外部から利用できる名前」が属性。
hoge.pyのprint文なんかはインポート時に1回だけ実行されて、それ以降は利用できないので属性ではない。
属性に該当するのは、変数・関数・クラス。
そして、属性の集まりを名前空間と呼び、各モジュール毎に独立して存在している。
インポート処理は、別モジュールの名前空間を現在のモジュールに読み込む処理のこと。
名前空間の内容は、dir()関数で表示できる

インポート処理には

import_sample.pyを使って実験
(import_sample.py)

#!/usr/bin/env python

a = 'spam'
b = 'eggs'
c = 10

print a, b, c
import モジュール名

この方法でインポートすると、モジュールの名前空間全体がインポートされる。
インポートした属性には、(モジュール名).(属性名) でアクセスする。

[kobakoba0723@fedora13-intel64 ~]$ python
Python 2.6.4 (r264:75706, Apr  1 2010, 02:55:51) 
[GCC 4.4.3 20100226 (Red Hat 4.4.3-8)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__']
>>> import import_sample
spam egg 10
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'import_sample']
>>> dir(import_sample)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'a', 'b', 'c']
>>> import_sample.a
'spam'
>>> import_sample.b
'egg'
>>> import_sample.c
10
>>> 
[kobakoba0723@fedora13-intel64 ~]$ 
from モジュール名 import 属性名

この方法でインポートすると、特定の属性のみが直接インポートされる。
インポートした属性は、インポート元の名前空間にそのまま存在するので、(属性名)でアクセス可能。

[kobakoba0723@fedora13-intel64 ~]$ python
Python 2.6.4 (r264:75706, Apr  1 2010, 02:55:51) 
[GCC 4.4.3 20100226 (Red Hat 4.4.3-8)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__']
>>> from import_sample import a, b, c
spam egg 10
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'a', 'b', 'c']
>>> a
'spam'
>>> b
'egg'
>>> c
10
>>> 
[kobakoba0723@fedora13-intel64 ~]$