基本的な文法¶
基本的な文法を速足で確認します。 丁寧に追いかけたい場合は公式のチュートリアルを参考にしてください。
条件分岐と繰り返し¶
条件分岐には if, elif, else を使います。 行の終わりには : (コロン) を書いて、次の行にインデントを入れます。 インデントはタブ記号か半角空白の連続ですが、 細かいことを気にするとややこしいので、半角空白4文字で統一してください。 Google の場合は半角空白2文字のようです。 しばらく Python を書いてみて慣れてきたら、 Google Python Style Guide も参考にしてみましょう。
Python のインタラクティブシェルを使って、次のように確認できます。 “#” 記号以降はコメントです。入力しないでください。
>>> import time # time モジュールをインポート
>>> now = time.time() # time モジュールの time 関数を実行し、結果を変数 now に保存
>>> print(now) # now の値を表示
1322531056.483
>>> if int(now) % 3 == 0: # now が3で割り切れる場合
... print("A")
... elif int(now) % 3 == 1: # now を3で割ると1余る場合
... print("B")
... else: # 上記以外の場合
... print("C")
... # エンターを押す
B
インタラクティブシェルから抜けるには Ctrl+D (Windows の場合は Ctrl+Z) を入力してエンターを押します。
繰り返し処理には for を使います。 Java の拡張 for 文のように、オブジェクトのイテレーターを使って要素を走査します。
>>> for i in range(5): # range は組み込み関数
... print(i)
... # エンターを押す
0
1
2
3
4
Python のコードを読み書きしていると、 for 文にはたくさんの書き方があるように感じるかもしれません。 気になる場合はイテレーターやジェネレーターという考え方を学習してください。
Python の特徴として、予約語が少なく標準モジュールが充実していることが挙げられます。 上述のサンプルでは、 import や if, elif, else, for などが予約語、 print と range は組み込み関数、それから time が標準モジュールです。
予約語と組み込み関数の一覧はドキュメントで確認してください。
- 2.3.1. Keywords (公式ドキュメント - 予約語)
- 2. Built-in Functions (公式ドキュメント - 組み込み関数)
標準モジュールはたくさんありますので使いながら覚えていきましょう。 網羅的に学習したい場合には PyMOTW を読んでください。
Note
組み込み関数の上書き
組み込み関数と同じ名前の変数や関数を定義してもエラーにはなりませんが、 多くの場合に予期せぬ振る舞いになってしまうでしょう。 上記の一覧に掲載されている文字列を変数名や関数名には使わないでください。
if と for は後置することも可能です。
>>> import time
>>> t = 'A' if time.time() / 2 == 0 else 'B'
>>> t
'B'
>>> l = [i for i in range(10)]
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
例外処理¶
Java の場合は try-catch で例外処理を実現しますが、 Python の場合は try-except という構文を使います。
0で除算した場合に例外が投げられることは、次のようにして確認できます。
>>> a, b = 1, 0
>>> try:
... a / b
... print("Success")
... except ZeroDivisionError:
... print("Error")
...
Error
Note
アンパック代入
“a, b = 1, 0” というコードをアンパック代入と呼びます。 複数の変数にまとめて初期値を登録できます。 多用すると可読性が落ちますが、変数の関連性を明示するときには役立ちます。
ふたつの変数を交換 (スワップ) する場合や、固定長のリストから変数を展開する場合によく使われます。 辞書データのイテレーターとも相性が良いので、パターンとして覚えておきましょう。
例外発生とは関係なく、終了処理を実行したい場合もあります。 データベース接続を閉じる処理などです。 Java の場合と同じように Python でも finally を使えます。
実行環境によって注意すること¶
Python は多くの環境で動作しますし、Linux や MacOSX では初めからインストールされています。 しかし、そのバージョンは少しずつ異なります。 異なるバージョンに対してスクリプトを記述する場合の注意点をいくつか列挙しておきます。
- Python 2.4 だと except と finally を同時に使えない。
- Python 2.4 だと後置IF文を使えない。
- Python 2.x では print 節、Python 3.x からは print() 文になる。
- 標準モジュールが異なる。 (e.g. json は Python 2.6 以降、など)
- 同じモジュールでもプロパティに違いがある。
- バージョンが古いと with を使えない。
- 例外を補足する処理の記述方法が異なる。 (as を使うか否か)
- 文字列に関するデータ型の発展が非常にややこしい。 (str, unicode, byte)
こうした構文の違いをいちいち考慮するのは大変です。 既存の Python 2.x 系のソースコードを Python 3.x 系に変換する場合は 2to3 コマンド (26.6. 2to3 - Automated Python 2 to 3 code translation)、 これから両方のバージョンに対応する場合は six を使いましょう。
構文と規約¶
PEP 8 (PEP 8 日本語) で Style Guide for Python Code が定義されています。 違反しても構文エラーにはなりませんが、読みやすいコードを書くことにつながります。 ソースコードが PEP 8 に従っているかをチェックするツール pep8 もあります。 コードをコミットする前にチェッカーを実行する習慣を身につけてください。 エディタのプラグインとして組込めるものもあります。 例えば、Sublime Text を使っている場合は SublimeLinter があります。 その他のエディタや IDE でも同様のツールがあるはずですので、まずは検索してみてください。
ここでは例示として、以下のようなソースコード (first-sample.py) を用意します。
1 2 3 4 5 6 7 8 9 | print('=' * 40 )
a, b = 1,2
def p(a, b):
print("a=%d, b=%d, a+b=%d" % (a, b, a + b))
p( a, b)
if a < b :
a, b = b, a
p(a, b+ 1)
import os, sys
|
実行すると以下の結果を得られます。
========================================
Hello World.
a=1, b=2, a+b=3
a=2, b=1, a+b=3
なんとなく動きはしますが、このソースコードの表記は不揃いです。 チーム開発の場合はソースコード規約策定に関する活発な議論を始めるのも良いでしょうが、 既存のルールとそれをチェックするツールも開発されています。まずはそれらを使ってみましょう。
pep8 による構文チェック¶
PyPI から pep8 モジュールをインストールします。 pip を使ってインストールします。
> pip install pep8
Windows の場合は Scripts フォルダ、Linux などの場合は bin に pep8 がインストールされます。
pep8 を実行してみます。
$ pep8 first-sample.py
first-sample.py:1:15: E202 whitespace before ')'
first-sample.py:2:9: E231 missing whitespace after ','
first-sample.py:3:1: E302 expected 2 blank lines, found 0
first-sample.py:4:33: E222 multiple spaces after operator
first-sample.py:5:3: E201 whitespace after '('
first-sample.py:6:9: E203 whitespace before ':'
first-sample.py:7:3: E111 indentation is not a multiple of four
first-sample.py:8:7: E225 missing whitespace around operator
first-sample.py:9:10: E401 multiple imports on one line
空白の有無についてエラーを表示してくれます。 エラーメッセージからも分かりますが、 エラーコードの一覧 を見ると、それぞれ以下の意味だと分かります。 100番台はインデントに関すること、200番台は空白に関すること、 300番台は空行に関すること、400番台は import に関することです。
コード | サンプルメッセージ |
---|---|
E111 | indentation is not a multiple of four |
E201 | whitespace after ‘(‘ |
E202 | whitespace before ‘)’ |
E203 | whitespace before ‘:’ |
E222 | multiple spaces after operator |
E225 | missing whitespace around operator |
E231 | missing whitespace after ‘,’ |
E302 | expected 2 blank lines, found 0 |
E401 | multiple imports on one line |
pyflakes による規約チェック¶
論理的な整合性も確認してくれるツールとして pyflakes があります。 pip を使って PyPI からインストールします。
> pip install pyflakes
Windows の場合は Scripts フォルダ、Linux などの場合は bin に pyflakes がインストールされます。
Note
Windows 環境の場合は、 pyflakes スクリプトを直接実行できません。 Scripts フォルダに pyflakes.bat というファイルを作成して、 スクリプトのラッパーを作成してください。 次のようなバッチファイルになります。(パスは要調整)
@echo off
C:\sandbox\python-school\Scripts\python C:\sandbox\python-school\Scripts\pyflakes %*
pyflakes を上記の first-sample.py に対して実行してみます。
> pyflakes first-sample.py
first-sample.py:9: 'os' imported but unused
first-sample.py:9: 'sys' imported but unused
空白にはノータッチですが、使っていない import 文を検知してくれます。
このふたつを組み合わせたものとして flake8 (flake8) があります。 pip で簡単にインストールできますので、既存のコードがある場合も新規にプロジェクトを作成する場合も、 日常的に構文チェッカーが実行されるようにしておきましょう。
次は、もう少し実際的なスクリプトを記述していきます。