Python

出典: フリー教科書『ウィキブックス(Wikibooks)』
移動: 案内検索
Wikipedia
ウィキペディアPythonの記事があります。

Pythonはオブジェクト指向スクリプト言語です。1990年にグイド・ヴァンロッサムによって作られました。Pythonのモットーは清く、正しく、美しくです。誰が書いても同じソースコードになるようプログラマの書き方の自由を制限しています。そのおかげで、常に読みやすいプログラムを書くことができます。教育用プログラミング言語としても秀逸です。

開発環境[編集]

Pythonの処理系はLinuxやMac OS XなどのUNIX系オペレーティングシステムには最初から付属していますが、他のオペレーティングシステムをお使いの場合は公式サイトから適宜ダウンロードし、インストールしてください。

シェルからpythonコマンドを実行すると次のようなコマンドラインインタプリタが起動します。

Python 2.6.4 (r264:75706, Dec  7 2009, 18:45:15) 
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

>>>はプロンプトです。

文法早わかり[編集]

Pythonのブロックはインデントによって表されます(オフサイドルール)。

>>> def f(n):
...     return n if n < 2 else f(n - 2) + f(n - 1)
... 
>>> f(10)
55

見てのとおり関数の定義はdef、文字列の出力はprint()を使います。Python 2ではprint文の括弧は必須ではありませんが、Python 3以降はprint()演算子の括弧は必須です。#から行末まではコメントです。条件演算子はcondition ? ifTrue : ifFalseではなくifTrue if condition else ifFalseという書き方をします。文末に;を付ける必要はありません。よって、PythonによるHello worldは次のようになります。

>>> print("Hello, world!")
Hello, world!

文字列は""で囲んでも''で囲んでも同じ意味であり、エスケープ文字の取り扱いに違いはありません。ところで、無名関数を定義するにはlambda文を使用します。これはラムダ計算に由来するものです。

>>> two = (lambda x, y: x + y)(1, 1)
>>> two
2

特に宣言をしていない変数は自動的にローカル変数になります。文字列は""""""で囲むこともできます。これはdocstringと呼ばれ、ドキュメンテーションに用いられる記法ですが、複数行コメントやヒアドキュメントにも用いることができます。なおPython 2のUnicodeサポートは万全ではないため、非ASCII文字を含むプログラムを書く場合は最初の行に# -*- coding: utf-8 -*-というコメントを挿入してください。また、バージョンに限らずソースコードのテキストファイルはUTF-8で符号化してください。

# -*- coding: utf-8 -*-
# HTTP ヘッダを出力する
print("""\
Status: 302
Location: http://www.example.com/
""")

シェルスクリプトと同様、\で区切られた行は継続します。ところで、最初のフィボナッチ数を求める再帰の例はPythonらしい書き方ではありません。Pythonではyieldがサポートされており、ジェネレータを簡単に書くことができます。

def f():
    a, b = 0, 1
    while True:
        yield a
        a, b = a + b, a
 
g = f()
 
for i in range(10):
    try:
        print( g.next() )
    except:
        print( next(g) )

a, b = 0, 1というのは分割代入で、a = 0; b = 1を表します。a, b = a + b, aも同様ですが、代入は一気に行われるためt = a; a = a + b; b = tと同義です(変更前のaの値がbに代入される)。while True:というのはwhile文ですが、Pythonの制御構文では条件式を括弧で囲む必要がありません。TrueはFalseやNoneと同じ定義済みキーワードの一つで真の値を持ちます。

yield文はreturn文と同様ですが、サブルーチンの戻り値を途中で返すことができます。nextメソッドを呼ぶと処理が継続されます。このような関数fをジェネレータまたはコルーチンなどといいます。プログラムをいじりましょう。あせらずじっくりと考えて、手を動かして体で覚えてください。

rangeは数列を発生させる組み込み関数です。for-in文はイテレータをループします。ジェネレータのnextメソッドを呼ぶのですが、Python 3以降nextメソッドが__next__メソッドに変更されたため、例外処理に用いるtry-except文によって処理を分岐させています。他のプログラミング言語では例外処理は予期せぬ致命的なエラーをキャッチするものと捉えられていますが、Pythonではファイルオープンに失敗したときの処理を書く際など日常的に用いられます。

複素数[編集]

Pythonは複素数を扱う組み込みのcomplex型をサポートしています。整数はint型、浮動小数点数はfloat型です。虚数単位は電流とまぎらわしいためiではなくjを用います。また、jという変数と区別するため1jのように必ず係数を付けるのを忘れないでください。複素数(実数)は近似にすぎないため多少の誤差は発生します。

>>> import cmath
>>> cmath.exp(1j * cmath.pi)
(-1+1.2246063538223773e-16j)

または

>>> from cmath import exp, pi
>>> exp(1j * pi)
(-1+1.2246063538223773e-16j)

または

>>> from cmath import e, pi
>>> e ** (1j * pi)
(-1+1.2246063538223773e-16j)

**は冪乗演算子です。importはモジュールをインポートします。from module import object0, object1, ..., objectNでモジュールmoduleからオブジェクトobject0, object1, ..., objectNを現在の名前空間にインポートすることができます。基本的な数学関数および定数はmathモジュール、複素変数を扱える関数および定数はcmathモジュールで定義されています。このほかにもさまざまなモジュールが存在し、モジュールを作成することもできます。Pythonでは組み込みのset型およびfrozenset型で集合を扱うこともできます。

配列[編集]

配列はarray = ['A', 'B', 'C']のように表しarray[0]array[1]array[2]のようにアクセスしますが、PythonではJavaScriptにも輸出された配列の内包表記をサポートしています。これは配列の中にfor-in文とイテレータを書くことができ、mapの役割を果たすものです。

>>> [ i for i in range(10) ]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

配列の内包表記は非常に強力です。これを使ってAからZまでの文字を要素に含む配列を作るには次のようにします。chr()は文字コードを文字に、ord()は文字を文字コードに変換します。なお、十六進法の整数リテラルは0xdeadbeefのように "0x" から始まります。3735928559Lのように末尾にLの付く整数リテラルはlong型です。

>>> [ chr(i) for i in range( ord('A'), ord('Z') + 1 ) ]
['A', 'B', 'C', 'D', 'E', 'F', 'G',
 'H', 'I', 'J', 'K', 'L', 'M', 'N',
 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
 'V', 'W', 'X', 'Y', 'Z']

内包表記はジェネレータと同じくPythonの個性的な言語機能の一つです。これらの習得には感覚的な部分、すなわち慣れもあるので、たくさんのコードを書いては動かし、動かしては書いて覚えてください。

辞書[編集]

辞書は連想配列でありオブジェクトです。

>>> { 'zero': 0, 'one': 1, 'two': 2 }
{'zero': 0, 'two': 2, 'one': 1}

タプルは対でありリストです。

>>> ( 'zero', 0, 'one', 1, 'two', 2 )
('zero', 0, 'one', 1, 'two', 2)

ところで、文字列は配列と同じようにアクセスすることができます。配列のスライスはブラケットの中で:演算子を使用します。

>>> "Hello, world"[7:]
'world'

正規表現[編集]

正規表現はPerl Compatible Regular Expressionsですが組み込みではなくCライブラリとして実装されています。reモジュールをインポートして使用します。

>>> import re
>>> m = re.match(r'<title>(.*?)</title>', '<TITLE>Example Web Page</TITLE>', re.I)
>>> m.group(0)
'<title>Example Web Page</title>'
>>> m.group(1)
'Example Web Page'

r''r""のようなraw文字列はエスケープ文字を解釈しないので、\d\sなどのメタ文字を書くのに重宝します。matchメソッドは第一引数に正規表現パターン、第二引数にマッチ対象文字列、第三引数にre.Ire.IGNORECASEre.Mre.MULTILINEre.Sre.DOTALLなどのフラグを指定します。Pythonに正規表現リテラルというものは存在しません。

matchメソッドはマッチオブジェクトを返します。マッチオブジェクトのgroupメソッドを使用して一致部分を抽出します。group(0)はマッチ全体、group(1), group(2), ..., group(N)は後方参照です。matchメソッドで対象文字列にマッチしなかった場合はマッチオブジェクトではなくNoneを返します。マッチに失敗する可能性がある場合は必ずif m == None:あるいはif not m:NoneFalse)で確認してください。

HTTPクライアント[編集]

Python 2ではurllibまたはurllib2、Python 3以降はurllib.requestのurlopenメソッドを使用してHTTPクライアントを作成することができます。

# -*- coding: utf-8 -*-
 
try:
    from urllib.request import urlopen
except:
    from urllib2        import urlopen
 
print( urlopen('http://www.example.com/').read().decode() )

レスポンスはbytesで返ってくるので、decodeメソッドを使用してstrに変換しています。

JSON[編集]

JSONを扱うにはimport jsonします。

>>> import json
>>> json.dumps( {'key': 'value'} )
'{"key": "value"}'
>>> json.loads( json.dumps( {'key': 'value'} ) )
{u'key': u'value'}

u''u""はunicode型です。Python 2ではunicode型でなければUnicode文字列を正しく扱うことができませんでしたが、Python 3以降は従来のunicode型がデフォルトになり、unicode型は削除されました。またrange()の強化版であったxrange()も削除され、新しいrange()になりました。

printf()[編集]

printf()print(format % (arg0, arg1, ..., argN))という書式です。

>>> print("%d.%d.%d" % (2, 6, 4))
2.6.4

なお、Python2.x系のバージョンならばprint content という書式も使用可能です。

>>> print "python"
python
>>> a=50
>>> print a
50

インクリメントとデインクリメント[編集]

PythonにはC/C++Javaにあるインクリメント演算子とデインクリメント演算子は存在しません。

>>> a=50
>>> a=a-1
>>> print("%d"%a) 
49
>>> a=50
>>> a=a+1
>>> print("%d"%a)
51

pass[編集]

passは「文法上必ず処理を書かなくてはならないが何も処理を書きたくない」というときに使います。

>>> def p():
...     pass
... 
>>> p()


このページ「Python」は、書きかけです。加筆・訂正など、協力いただける皆様の編集を心からお待ちしております。また、ご意見などがありましたら、お気軽にノートへどうぞ。