PyCon JP 2012 Pythonプログラミングハンズオン(初級者向け)

概要

講師:岡野 真也 / @tokibito
言語:日本語
日時:2012/09/15 11:00 - 14:15 (昼食挟む)
場所:Room 358

基礎的なPythonプログラミングについて、実際に手を動かしながら学習します。

  • Pythonについての簡単な説明
  • Pythonプログラミング環境の用意
  • 動かしてみよう
  • Pythonでプログラミングしよう
    • 対話シェル
    • 基本の文法
    • ファイルで実行
    • モジュール化
    • サードパーティモジュールの利用

対象

  • Pythonプログラミング未経験または初心者

用意するもの

  • Windows、MacOSX、Linux(Ubuntuなど)のいずれかのOSがインストールされたノートPC(可能ならPython2.7をインストールしてきてください)

PyCon JPについて

目次

Pythonとは

Pythonはプログラミング言語の一種です。次のような特徴があります。

  • Windows, Linux/Unix, Mac OS Xなどで動作します。
  • オープンソースのライセンスで商用でも無料で使えます。
  • 動的型付けのオブジェクト指向のプログラミング言語です。
  • モジュール化と階層パッケージをサポートしています。
  • C/C++などのプログラミング言語で拡張モジュールを作成できます。

Pythonと似た特徴を持つ言語として、よく RubyPerl などが取り上げられることがあります。

Pythonでできること

Pythonは汎用のプログラミング言語です。次のようなことができます。

  • 数値計算
  • CUIのシェルでのテキスト入出力
  • ファイルの読み書き
  • ネットワーク通信
  • OSの持つ各種APIの利用
  • 拡張モジュールの利用

python.orgのページに、より詳しく書かれています。

About - python.org (英語)

Pythonが使われているソフトウェアやサービス

Pythonでどんなことができるのかを知るには、Pythonが使われているソフトウェアやサービスを見てみるのも良いでしょう。いくつかここで紹介します。

Blender

blender.org

Blenderは3DのCGやアニメーション、ゲームを製作できるソフトウェアです。スクリプトエンジンにPythonが使われています。

Instagram

InstagramはiPhone/Androidで写真を友達と共有できるアプリケーション/サービスです。サーバーでPythonが使われています。

Dropbox

Dropbox

Dropboxはファイル保管、共有のサービスです。デスクトップ用のアプリケーションや通信先のサーバーなどでPythonが使われています。

Sublime Text

Sublime Text

Sublime Textは、マークアップやコード編集に特化したテキストエディタです。Pythonスクリプトで拡張できます。

Battlefield 2 / 2142

バトルフィールド2142 | EA エレクトロニック・アーツ

Battlefield 2、Battlefield 2142は、PC用の一人称視点のシューティングゲームです。ゲームのロジックなどにPythonが使われています。EA社の他のPC用ゲームでも、Pythonは使用されているようです。

他にも

他にもPythonが使われているソフトウェアは沢山あります。Wikipediaにページがあるので参照してみると良いでしょう。

Pythonを使っている製品あるいはソフトウェアの一覧 - Wikipedia

次は

Pythonについて知ることができたら、次はPythonプログラミングのための用意をしましょう。

Pythonプログラミング環境の用意

自分のPCに合ったPythonプログラミング環境を用意します。今回はPython2.7系を使います。

Pythonのインストール

まずはPythonをインストールします。OSによって対応が違うので注意してください。

Windowsの場合

python.orgのダウンロードページから、Windows用のインストーラーをダウンロードしてインストールします。

Download Python

インストーラでインストールした後、 Path という名前の環境変数に、 python.exe の存在するディレクトリと、その階層にあるScriptsディレクトリのパスを追加します。

Mac OS Xの場合

Mac OS X(10.7, 10.8)であれば、Python2.7が最初からインストールされています。

それ以外のバージョンを使っている場合は、python.orgからMac用のインストーラーをダウンロードするか、MacPortsなどでインストールすると良いでしょう。

Download Python

Ubuntuの場合

Ubuntu12.04, 12.10であれば、最初からPython2.7がインストールされているでしょう。もしインストールされていないならば、aptでpython2.7とpython2.7-devパッケージをインストールしておくと良いでしょう。

開発スタイルについて

Pythonをインストールできましたか?

他に必要なものは、最低限だと使い慣れたテキストエディタだけです。

さて、Pythonのプログラミングを対話モードとテキストエディタのみで行うのも良いですが、開発を補助する様々な機能を詰め込んだ統合開発環境(IDE)というものもあります。他にもリモートで開発するスタイルなどをここでは少し紹介します。

IDEの利用

PythonをサポートするIDEはいくつかあり、そのほとんどがプロジェクト管理機能や高機能エディタ、デバッガ、統合されたインタープリターなどを持っています。ここではPyScripter、PyDev、PyCharmを紹介します。

PyScripter

PyScripterは、Windowsで動作するオープンソースのPython IDEです。複数のPythonバージョンをサポートしている他、プロジェクト管理、ファイルエクスプローラ、統合されたインタープリター、単体テスト、正規表現テスターなどを備えています。比較的軽量なIDEです。

_images/ss_pyscripter.png

PyScripter

PyScripter

PyDev

PyDevはEclipseのためのオープンソースのPython IDEです。EclipseやAptanaStudioにプラグインとして追加できます。

PyDev.org

PyCharm

PyCharmは、JetBrains社が開発している有償のPython IDEです。IntelliJベースで補完機能やリファクタリング、バージョン管理ツールの統合、virtualenvサポートなどを備えたとても強力なIDEです。

仮想マシン上での開発

Webアプリケーションの開発などで、別のOSを使用したい場合におすすめのスタイルです。

VMwareやVirtualBoxでLinuxなどを動かし、SSHでログインしてVimやEmacsなどのCUIのテキストエディタで開発します。

_images/ss_sshvim.png

仮想マシンで動作しているUbuntuにSSH(PuTTY)でログインしてVimで開発

次は

これでPythonのプログラミング環境は用意できました。次はいよいよPythonプログラミングを始めます。

動かしてみよう

ではインストールしたPythonを動かしてみましょう。

対話モードでの起動

Pythonには、対話的にプログラムを入力、実行できる対話モードがあります。まずは、対話モードを使ってみましょう。

Windowsの場合はコマンドプロンプトから、MacOSX、Ubuntuの場合はターミナルから python と入力してEnter(またはReturn)キーを押します。

_images/python_shell.png

Python対話モードの起動

正常に起動した場合は、Pythonのバージョンと >>> という文字(プロンプト)が表示されます。

Note

コマンドプロンプトは、WindowsXPの場合はスタートメニュー(Windowsキーを押せば表示されます)の「ファイル名を指定して実行」から cmd と入力してOKすることで実行されます。 Windows7の場合は、スタートメニューの検索で cmd と入力すれば候補に出てくるため、それを選択して実行できます。

Note

MacOSXのターミナルは、「アプリケーション」>「ユーティリティ」>「ターミナル」で起動できます。

プロンプトが表示されている状態になれば、Pythonのプログラムを入力できます。

対話モードでプログラミングする

まずは「1 + 2」を計算させてみましょう。 >>> の後ろにカーソル位置がある状態で、 1 + 2 と入力し、Enterキーを押します。

_images/python_shell_calc.png

Python対話モードで「1 + 2」の計算

計算結果の「3」が画面に表示され、再度プロンプトが表示されます。

次に「Hello, world!」という文字列を画面に表示してみましょう。プロンプトに print("Hello, world!") と入力してEnterキーを押します。

_images/python_shell_print.png

Python対話モードで「Hello, world!」と表示

画面に「Hello, world!」と表示された後、再度プロンプトが表示されます。

このように対話モードは、Pythonのプログラムを逐次入力して実行し、結果を表示できます。

対話モードを終了するには、 exit() と入力して実行するか、 Ctrl+D キーを押します。

_images/python_shell_exit.png

Python対話モードの終了

次は

これでPython対話モードを使うことができるようになりました。次はこの対話モード上で、Pythonのいろいろな構文を使ってみましょう。

基本の文法

Pythonプログラムの書き方をここでは説明していきます。

Pythonを対話モードで起動し、例に挙げるコードを入力、実行してみてください。

入力する文字

コードを入力する際、日本語の文字列部分以外の文字は、次の点に注意してください。

  • スペースは半角スペースを使う(全角は使えません)
  • コメントや文字列以外の部分の命令の入力には半角の文字を使う(全角は使えません)
  • 変数名、関数名などの大文字と小文字に気をつける(Pythonでは大文字と小文字は区別されます)

コメント

コメント文はプログラムコードを説明したり、プログラム中にメモを書く際に使います。コメント部分はPythonからは実行されず、解釈もされません。

コメントはプログラム中で # の後に書きます。 # の文字から行末までがコメントとして扱われます。

>>> # これはコメントです
>>> print(u"これは実行されます")
これは実行されます
>>> #print(u"これは実行されません")

計算する

対話モードを計算機として使ってみます。

Pythonでは数字の入力は数値として扱われます。小数点などを指定しなければ、整数として扱われます。

>>> 12345
12345

四則演算を行う場合、加算は + 、減算は - 、乗算は * 、除算は / の記号をそれぞれ使います。

>>> 5 + 3  # 5と3を足す
8
>>> 5 - 3  # 5から3を引く
2
>>> 5 * 3  # 5に3を掛ける
15
>>> 5 / 3  # 5を3で割る
1

整数同士の割り算の結果は整数に丸められてしまうことに注意してください。いずれか片方が小数であれば、小数として計算されます。 [1]

>>> 5.0 / 3
1.6666666666666667

計算の優先順位を示すための括弧 () も使えます。入れ子になる場合でも同じ括弧の文字 () を使います。

>>> 2 * (5 * (2 + 3) + 1)
52

また、四則演算の他にもべき乗 ** や、余剰 % の計算もできます。

>>> 2 ** 4  # 2の4乗
16
>>> 10 % 3  # 10を3で割った余り
1
[1]Python3では整数への丸めは行われず、割り算の結果は小数になります。

変数

データを保持しておくために、 変数 を使うことができます。

変数に値を代入するには、等号 = を使います。左辺に変数名、右辺に値を指定します。

>>> width = 20
>>> height = 5 * 9
>>> width * height
900

また、複数の変数に一度に値を代入することもできます。

>>> x = y = z = 0
>>> x
0
>>> y
0
>>> z
0

定義していない変数は使えません。使おうとするとエラーが発生します。

>>> hoge  # hogeは未定義
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'hoge' is not defined
>>> hoge = 100
>>> hoge
100

変数の定義は、値を代入すればできます。事前の宣言文等は必要ありません。

Note

対話モードで定義した変数は、対話モードを終了するまでは保持されたままになります。

論理演算

論理演算には and or not を使います。真は True 、偽は False で表します。

>>> True and True
True
>>> True and False
False
>>> False and True
False
>>> False and False
False
>>> True or True
True
>>> True or False
True
>>> False or True
True
>>> False or False
False
>>> not True
False
>>> not False
True

また、数値の 0 や空の値 None 、空の文字列 "" 、空のリスト [] 、空の辞書 {} は偽の値として扱われます。それ以外は真の値として扱われます。

and演算は結果が真になる場合、「左から順に見て一番最後の値」を値として使います。結果が偽になる場合、「左から順に見て、最初に偽になる値」を値として使います。

>>> True and 123 and "abc"  # 真
'abc'
>>> True and 0 and "abc"  # 偽
0

or演算は結果が真になる場合、「左から順に見て一番最初に真になる値」を値として使います。結果が偽になる場合、「左から順に見て一番最後の値」を値として使います。

>>> False or 123 or "abc"  # 真
123
>>> False or 0 or []  # 偽
[]

値の比較

値の比較には == > >= < <= != などの記号を使います。比較結果はTrueまたはFalseで返されます。

>>> x = 10  # xに10を代入
>>> x == 10  # xと10は等しい
True
>>> x != 5  # xは5ではない
True
>>> 5 > 2  # 5は2より大きい
True
>>> 5 < 2  # 5は2より小さい
False

データ構造

整数, 小数
>>> 1234
1234
>>> 3.14
3.14
真偽値
>>> True
True
>>> False
False
文字列

文字列は '" で囲みます。二つに差はありません。

>>> 'Good morning, Feiz!'
'Good morning, Feiz!'

文字列に改行を含めるには、 改行文字 \n を使うか、三連の(ダブル)クォーテーションで囲みます。

>>> print('Feiz!\nGood Bye!!')
Feiz!
Good Bye!!
>>> print("""Azuma
... Kenta""")
Azuma
Kenta

エスケープシーケンス(\)をそのまま表示するには、 \\ とニ連続で書くか、raw文字列を使います。

raw文字列は、クォーテーションの前に r をつけて表します。

>>> print('Feiz!\nFeeeeeeiz!!')  # 何もしない場合改行して表示される
Feiz!
Feeeeeeiz!!
>>> print('Feiz!\\nFeeeeeiz!!')  # 2連続で書く場合
Feiz!\nFeeeeeiz!!
>>> print(r'Feiz!\nGood Bye!!')  # raw文字列を使う場合
Feiz!\nGood Bye!!

クォーテーションの前にuをつけるとUnicode文字列になります。

>>> u"あずま"
u'\u3042\u305a\u307e'
リスト

リストは順序を持った値の集合です。リスト内に複数のデータ型の値が混在しても問題ありません。

>>> mylist = [1, 'abc', True]
>>> mylist
[1, 'abc', True]

リスト内の各値は、リストの左側に [] の括弧で添字(インデックス)を指定することで参照できます。添字は0から始まる整数です。

>>> mylist = [1, 'abc', True]
>>> mylist[0]
1
>>> mylist[1]
'abc'
>>> mylist[2]
True

添字に負の値を指定すると、リストの終端から値が取り出せます。

>>> mylist = [1, 'abc', True]
>>> mylist[-1]
True

in 演算子を使うと、ある値がリストの中に存在しているか調べられます。

>>> mylist = [1, 'abc', True]
>>> 'abc' in mylist
True
>>> 4 in mylist
False

range 関数を使うと数値のリストを簡単に作れます。

>>> range(5)
[0, 1, 2, 3, 4]
>>> range(3, 10, 2)  # 3から10より小さい値まで,2ずつ増加
[3, 5, 7, 9]
タプル

値を変更できない集合です。値を変更できない以外の特性はリストと同様です。

>>> mytuple = (1, 2)
>>> mytuple
(1, 2)
>>> mytuple = (1, 2)
>>> mytuple[0] = 3  # エラー
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  TypeError: 'tuple' object does not support item assignment

1要素のタプルを作るときは、末尾にカンマを入れるのを忘れないようにしましょう。

>>> (1)  # ただの「1」になってしまう
1
>>> (1,)  # 1要素のタプル
(1,)

リストやタプルや文字列の特定の範囲を切り出すことができます。

>>> [1,2,3,4,5][:3]  # 先頭から添字3の一つ前まで
[1, 2, 3]
>>> 'Azuma Kenta'[3:]  # 添字3から末尾まで
'ma Kenta'
>>> [1,2,3,4,5,6,7,8,9,10][1:-1:2]  # スライスの3つ目を指定するとN個飛びで値を取り出せます。
[2, 4, 6, 8]
辞書

添字に文字列や数値、オブジェクトを使用できる集合です。

>>> {'a': 10, 'b': 20}
{'a': 10, 'b': 20}
>>> {'a': 10, 'b': 20}['a']
10
>>> {'a': 10, 'b': 20}['b']
20
>>> {1: 10, 2: 20}[1]
10
None

None は何もないことを表すのに使います。

>>> None

文字列のフォーマット

Pythonには現在2種類の文字列のフォーマット操作があります。現状ではまだ両方とも使われることが多いため、古いほうから順に説明します。

%を使ったフォーマット

% を使った文字列のフォーマット操作は古い方法です。現在は推奨されていません。

C言語のsprintf()のようなフォーマット文字列に、 % の右側の値を入れ込みます。複数の値を入れる場合は、リストやタプルを指定します。

>>> print("Hello, %s!" % "World")
Hello, World!
>>> print("%03d, %.3f" % (1, 2.5))
001, 2.500

また、リストやタプルの代わりに辞書を使うことも出来ます。渡した辞書のキーに対応する部分に値が入ります。

>>> print("a = %(a_value)d, b = %(b_value)s" % {'b_value': 'test', 'a_value': 10})
a = 10, b = test
formatメソッドを使ったフォーマット

formatメソッドを使ったフォーマット操作は新しい方法です。

{} の括弧を指定して値を当てはめます。括弧内に数値の桁数や文字列の変換処理などを指定することができます。

>>> print("Hello, {}!".format("World"))
Hello, World!
>>> print("{:03d}, {:.3f}".format(1, 2.5))
001, 2.500

また、キーワード引数を指定することで、キーワードに対応する位置に値を入れられます。

>>> print("a = {a_value:d}, b = {b_value:s}".format(b_value='test', a_value=10))
a = 10, b = test

制御構文

インデント

コードの説明中には、インデント(字下げ)を使用する部分が出てきますが、これの文字に注意して下さい。

Pythonではインデントが構文に含まれて意味を持っているため、インデントはコード例と同様にしないと、動かないことがあります。

例を示します。

>>> for i in range(3):
...     print(i)
...
0
1
2

このコードは0、1、2と数字を順に画面に出力するものですが、繰り返しの構文 for in を使っています。2行目のprintは行頭で半角スペース4文字分をインデント(字下げ)しています。例えばこれをインデントしないで入力すると、エラーになります。

>>> for i in range(3):
... print(i)
  File "<stdin>", line 2
    print(i)
        ^
IndentationError: expected an indented block

対話モードでは、次の行に入力可能な場合 ... と表示されます。入力の必要がない場合はそのままEnterキーをもう一度押せば、コードが実行されます。

Note

インデントの文字数については、議論がありますが、PEP8の文書では半角スペース4個を推奨しています。そのため、サードパーティの各種モジュールでもこれに従っている場合が多いです。タブ文字 \t (ハードタブ)は、使わないことがほとんどです。特にこだわりがないのであれば、半角スペース4個のインデントを使用すると良いでしょう。

条件分岐(if else)

条件によって処理を分岐する場合は、 if 文を使います。

if文の書式:

if 条件式:
    条件式が真の場合
else:
    条件式が偽の場合
>>> x = 20
>>> if x == 20:
...     print('x equals 20!')
... elif x > 20:
...     print('x larger than 20!')
... else:
...     print('x smaller than 20!')
x equals 20!

ifの条件式部分には、カッコはあってもなくても構いません。不要な場合は書かないのがPythonらしい書き方です:)

繰り返し(for)

Pythonの for 文はリストやタプルの要素を順番に反復処理します。

for文の書式:

for 変数 in シーケンス:
    反復処理

シーケンス部分にはリストやタプルなどのイテレータを指定できます。要素は変数に格納され、反復処理の記述で使用できます。

>>> for x in range(3):
...     print('x = %d' % x)
...
x = 0
x = 1
x = 2

反復を途中で終了するには break を使います。

>>> for x in range(3):
...     break
...     print(x)  # ここは実行されない

for 文に else 節を付けると、反復が終了した後に実行される処理を書くことができます。

ただしbreakなどでループを途中で抜けた場合、else節は実行されません。

>>> for x in range(3):
...     print 'x = %d' % x
... else:
...      print 'done'
...
x = 0
x = 1
x = 2
done
繰り返し(while)

Pythonの while 文は条件を満たす間はずっと反復処理を行います。

while文の書式:

while 条件式:
    反復処理
>>> x = 0
>>> while x < 10:  # xの値が10未満の間は繰り返す
...     print(x),
...     x += 1  # xの値を1増加
0 1 2 3 4 5 6 7 8 9

関数

同じ処理を何度も記述するのを避けるために、複数の処理を関数でまとめることができます。

関数では引数(パラメータ)を受け取って処理を行い、結果を返します。

関数の書式:

def 関数名(パラメータ1, パラメータ2, ...):
    関数の処理
    return 処理の結果

処理の結果を返す必要がない場合は、 return は省略できます。returnを省略すると、Noneが返されます。

>>> def hello():  # hello関数の定義
...     print("Hello, World!")
...
>>> hello()  # hello関数の使用
Hello, World!
>>> def add(x, y):  # add関数の定義
...     return x + y
...
>>> add(1, 2)
3
デフォルト引数

Pythonでは引数のデフォルトの値を決められます。該当の引数が与えられない場合にデフォルトの値が関数に渡されます。

>>> def ian(word='black'):
...      print '%s ian' % word
...
>>> ian()
black ian
>>> ian('white')
white ian
可変長引数

* からはじまる引数で可変長の引数をリストとして取得できます。

>>> def sum(*args):
...     result = 0
...     for x in args:
...         result += x
...     return result
...
>>> sum(1,2,3,4,5,6,7,8,9,10)
55
>>> sum(1, 2, 3)
6
可変長キーワード引数

** からはじまる引数で可変長のキーワード引数を辞書として取得できます。

>>> def f(**kwargs):
...     return kwargs
>>> f(a=1, b=2, c=3)
{'a': 1, 'c': 3, 'b': 2}
>>> def g(**kwargs):
...     for key, value in kwargs.items():
...         print("{} {}".format(key, value))
>>> g(a=1, b=2, c=3)
a 1
c 3
b 2
特殊な引数指定方法

リストや辞書の各要素を引数として渡すこともできます。

引数が複雑な関数を呼び出すときや、条件によって引数が細かく変化するような場合に有用です。

>>> def func_a(x, y, z):
...     print(x + y + z)
...
>>> args = [1, 3, 5]
>>> func_a(*args)  # func_a(1, 3, 5)という呼び出しと等価
9
>>> def func_b(name="bucho", age=36):
...     print("{} {}".format(name, age))
...
>>> kwargs = {'name': "feiz", 'age': 24}
>>> func_b(**kwargs)  # func_b(name="feiz", age=24)という呼び出しと等価
feiz 24

クラス

自分でデータ型を作成したい場合、Pythonではクラスを作ります。

>>> class Person(object):
...     def __init__(self, name, words):
...         self.name = name
...         self.words = words
...     def say(self):
...         print(u'「{}」と{}さん'.format(self.words, self.name))
...
>>> feiz = Person('feiz', u'ふぇ')
>>> feiz.say()
「ふぇ」とfeizさん
>>> tokibito = Person('tokibito', u'ぬるぽ')
>>> tokibito.say()
「ぬるぽ」とtokibitoさん

外部モジュールのインポート

import 文で外部モジュールが読み込めます。

標準ライブラリの os を読み込んでみましょう。

import os とすると os モジュール内のオブジェクトにアクセスする事ができます。

>>> import os  # グローバルネームスペースにosが追加される
>>> os.path.join('/usr/', 'home/bucho/')
'/usr/home/bucho/'

from os import path とすると os.pathpath として使うことができます。

>>> from os import path  # グローバルネームスペースにpathが追加される
>>> path.join('/usr/', 'home/bucho/')
'/usr/home/bucho/'

次は

ここまでは、対話モードでコードを入力していたため、対話モードを終了してしまうと入力したものは消えてしまい、再利用できませんでした。

次は、ファイルにコードを記述して、再利用可能なスクリプトファイル、Pythonモジュールを作成していきます。

スクリプトファイルとモジュール化

Pythonでは作成したプログラムを再利用するために、ファイルにコードを記述して実行することができます。

ここでは、スクリプトファイルの作成とモジュールについて説明していきます。

スクリプトファイルからの実行

Pythonのスクリプトファイルの拡張子は .py です。

hello.py という名前のファイルを以下の内容で作成してみます。

# coding: utf-8
print("Hello, World!")

先頭の # coding: utf-8 という記述は、スクリプトファイルのエンコーディングを指定するものです。スクリプト内で日本語を扱うときは必ず指定してください。

python コマンドにファイルパスを指定することで、スクリプトファイルを実行できます。

> python hello.py
Hello, World!

モジュールを作る

.py の拡張子のファイルはPythonモジュールとして import で読み込んで使用できます。

mymodule.py という名前のPythonモジュールを作成し、読み込んで使用する例を以下に示します。

mymodule.py:

# coding: utf-8
def hello():
    print("Hello, World")

def add(a, b):
    return a + b

モジュールをインポートする場合、該当するモジュールのパスがPythonパス(PythonPath, PYTHONPATH)に含まれている必要があります。Pythonパスは sys.path で確認できます。

>>> import mymodule
>>> mymodule.hello()
Hello, World!
>>> mymodule.add(1, 2)
3

スクリプトファイルもモジュールとして読み込むことができます。先ほど作成した hello.py をインポートしてみます。

>>> import hello
Hello, World!

このようにグローバルスコープに書いたコードはインポートをした時点で実行されてしまいます。

これを避けるためには、コードを関数にまとめた上で、スクリプトファイルとして実行された場合にのみ呼び出すようにします。

スクリプトファイルとして実行されたかどうかを判定するには、モジュール内で __name__ 変数の値が __main__ という文字列であるかを調べます。

# coding: utf-8
def main():
    print("Hello, World!")

if __name__ == '__main__':
   main()
> python hello.py
Hello, World!
> python
>>> import hello

標準ライブラリ

Pythonの標準の配布物には、多くのライブラリ(標準ライブラリ)が含まれています。これらのモジュールを使うことにより、迅速に目的のアプリケーションを作成できます。

標準ライブラリについては、ここでは説明しきれません。Pythonのドキュメントの標準ライブラリのページを参照して下さい。

http://www.python.jp/doc/2.7/library/index.html

次は

これでモジュールについて学ぶことができました。

次はサードパーティのライブラリについて少し説明します。

サードパーティのライブラリ

標準ライブラリ意外にも、サードパーティ製のライブラリがたくさんあります。

サードパーティ製のライブラリを探す

サードパーティ製ライブラリの探し方ですが、おおむね次のような方法になります。

distributeのインストール

サードパーティ製のライブラリのインストール方法は、ライブラリによって異なる場合もありますが、ほとんどの場合 easy_install コマンドでインストールできます。

distribute をインストールすることで、easy_installコマンドが使えるようになります。

distributeのインストールはWebインストール用のスクリプトを使うと簡単です。

http://python-distribute.org/distribute_setup.py

PythonでWebインストール用のスクリプトを実行すると、インストールされます。MacOSXやUbuntuの場合はsudoでPythonを実行する必要があります。

> python distribute_setup.py

distributeをインストールしたら、easy_installコマンドが使えるか試してみましょう。

> easy_install

easy_installコマンドはパッケージ名を指定した場合、PyPIから該当パッケージのダウンロードとインストールを行ってくれます。

例えば、 tweepy という名前のパッケージをインストールする場合はこうなります。

> easy_install tweepy

また、C言語で書かれたモジュールを含むライブラリのインストールには、gccなどのコンパイラとPythonのヘッダファイルが必要な場合があります。

Ubuntuの場合は、python-devパッケージを、MacOSXの場合はXCodeをインストールしておくと良いでしょう。

参考資料など

Pythonを勉強するために役に立つ参考資料などを紹介します。

オンラインドキュメント

Appendix: Pythonのコーディングスタイル

PEP8

Pythonでは、推奨されるコーディングスタイルがPEP8に定義されています。

もちろん、あくまで推奨なので、必ず守らなくてはいけないものではありませんが、読みやすいPythonコードを書くために是非とも覚えておいてください。

pep8パッケージを使うと、コードがpep8に準拠しているかどうかチェックすることができます。

PEP257

Pythonには”docstring(ドキュメンテーション文字列)”という仕組みがあります。

PEP257は、docstringの推奨される書き方についてのPEPです。

課題

課題は順番にこなす必要はありません。面白そうだと思った課題にチャレンジしてみてください。

もちろんこれ以外に自分で課題を持っているならば、それをやってみるのも良いでしょう。

socketモジュールを使ってネットワーク通信

  1. socketモジュールを使って足し算を行うサーバを作成してください

    telnetコマンドで次のように 整数+整数 のように送信すると足し算の結果を返すサーバを作成してください。

    > telnet localhost 5000
    Trying 127.0.0.1...
    Connected to debian02.
    Escape character is '^]'.
    10+20
    30
    123+456
    579
    

Hint

socketモジュールを使って接続を待ち受け、接続されたら Hello, World! という文字列を返すコードは次のようになります。

server.py:

# coding: utf-8
import sys
import socket

def main():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('127.0.0.1', 5000))
    s.listen(5)
    try:
        while True:
            conn, addr = s.accept()
            conn.send("Hello, World!\n")
            conn.close()
    except KeyboardInterrupt:
        sys.exit(0)

if __name__ == '__main__':
    main()

このスクリプトを実行するとlocalhostのTCP5000番ポートで接続を待ち受けます。

> python server.py

telnetで接続するとHello, World!という文字列が表示されて、切断されます。

> telnet localhost 5000
Hello, World!

Hint

  1. socketモジュールのドキュメントの例を参考に、サーバ側で受け取ったテキストを改行位置で分割します(“10+20”というデータになります)
  2. 分割したテキストの一つ目の要素を + でさらに分割します(“10”と”20”のデータになります)
  3. 分割したテキストを数値に変換し、足しあわせて、結果を送信します

http://www.python.jp/doc/release/library/socket.html

  1. socketモジュールを使って、1.で作成したサーバにデータを送信して、結果を取得して画面に表示するプログラムを作成してください

    引数を渡して実行すると結果を返してくれるようにしてみてください

    > python add.py 10+20
    30
    

Hint

sysモジュールのargvでコマンドライン引数を取得することができます。

http://www.python.jp/doc/release/library/sys.html

sqlite3モジュールを使ってデータベース作成

  1. sqlite3モジュールを使って、引数で与えられた品名と金額をデータベースに保存するプログラムを作成してください

    > python inputdb.py みかん 50
    > python inputdb.py りんご 100
    > python inputdb.py バナナ 200
    

Hint

sysモジュールのargvでコマンドライン引数を取得することができます。

http://www.python.jp/doc/release/library/sys.html

sqlite3モジュールでsqlite3のデータベースを操作することができます。

http://www.python.jp/doc/release/library/sqlite3.html

テーブルを作成するSQL:CREATE TABLE items (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, cost INTEGER);
データを挿入するSQL:INSERT INTO items(name, cost) VALUES("みかん", 50);
  1. 1で作成したデータベースの内容を一覧表示するプログラムを作成してください

    $ python listdb.py
    みかん 50円
    りんご 100円
    バナナ 200円
    

Hint

データを取得するSQL:SELECT name, cost FROM items;
  1. 引数から入力された金額以上の品物名とその品物の金額を表示してください

    > python filter.py 100
    100円以上の品物は、
    りんご 100円
    バナナ 200円
    

Hint

データを取得するSQL:SELECT name, cost FROM items WHERE cost >= 100;

csvモジュールを使ってCSVファイルの読み込みとデータ集計

次に示すCSVファイルは、果物屋の品物の売上レポートのデータです。

items.csv:

2012/06/01,りんご,2,100
2012/06/01,みかん,10,40
2012/06/02,りんご,3,100
2012/06/02,バナナ,3,200
2012/06/03,りんご,4,120
2012/06/03,みかん,5,50
2012/06/04,みかん,5,60
2012/06/04,バナナ,4,150
2012/06/05,りんご,1,100
2012/06/05,みかん,10,50

1列目は日付、2列目は品物名、3列目は販売した個数、4列目はその日の品物の1個あたりの価格です。ファイルの文字コードはShiftJIS(CP932)です。

  1. csvモジュールを使ってCSVファイルを読み込み、各品物ごとに合計の数を計算し、画面に表示するプログラムを作成してください

    $ python item_report.py
    りんご 10個
    みかん 30個
    バナナ 7個
    
  1. csvモジュールを使ってCSVファイルを読み込み、日付ごとの売上金額を計算し、画面に表示するプログラムを作成してください

    > python report.py
    2012/06/01 600円
    2012/06/02 900円
    2012/06/03 730円
    2012/06/04 900円
    2012/06/05 600円