Python/整理中

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動

複素数[編集]

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型で集合を扱うこともできます。


正規表現[編集]

Pythonの 正規表現(regular expression)は組み込みではなくCライブラリとして実装されています。reモジュールをインポートして使用します。

正規表現とは、検索のような機能です。詳しくは上記リンク『正規表現』のリンク先を読んでください。

検索 search[編集]

pythonで文字列中の検索をしたい場合、search という関数を re.search() という形式で使います。

なお、Perl など他の言語では、似たような演算を match という場合もありますが、しかし python では、matchという関数が別の意味で使われているので(後述)、混同しないように気をつけてください。


コード例
# coding: shift-JIS

import re
moji = 'books'
m = re.search('oo', moji)
if m:
    print("あった")
else:
    print("なかった")


結果
あった
解説

Pythonでは、正規表現を使うには、まずreをインポートする必要があります。

文字列中の文字を検索するには re.serach 関数を使って

re.search("検索したい文字列", 検索対象の文字列または文字列変数)

のように記述します。


検索する文字列を「oo」から、たとえば「goo」に返ると、とうぜん「book」には「goo」という文字の並びは無いので、検索しなくなります。

コード例
# coding: shift-JIS

import re
moji = 'books'
m = re.search('goo', moji)
if m:
    print("あった")
else:
    print("なかった")


結果
なかった


下記のように、 re.search 関数中でひとまとめに検索しても可能です。

コード例
# coding: shift-JIS

import re
# moji = 'books'
m = re.search('oo', 'books')
if m:
    print("あったよ")
else:
    print("なかったよ")


結果
あったよ


先頭 match[編集]

正規表現の関数 re.match は、対象の文字が、文字列の先頭にないと検索にヒットしません。

下記の2種類のコードとその結果を見比べてください。

「book」の文字列中に「oo」があるにもかかわらず、先頭は「oo」からは始まらないので、 re.match の場合には「oo」ではヒットせず、「boo」にしないとヒットしないのです。


コード例1
# coding: shift-JIS

import re
moji = 'books'
m = re.search('boo', moji)
if m:
    print("あった")
else:
    print("なかった")
結果
あった


コード例2
# coding: shift-JIS

import re
moji = 'books'
m = re.search('oo', moji)
if m:
    print("あったぜ")
else:
    print("なかったぜ")
結果
なかったぜ


  • 備考

別のプログラミング言語であるPerl界隈でいう『マッチ』とは、意味が違います。混同しないように。


split関数[編集]

Pythonに限らず、PerlやC#などでもsplit関数というのがあり、1個の文字列を、区切り文字でくぎってリスト(配列)に代入し、リストのいくつもの個数の要素に代入していく機能が、モダンなプログラム言語には、あります。

このうち Python の split関数は、正規表現のreモジュールで扱われますので、python では関数 re.split を使うことになります。(他のプログラム言語では、正規表現とは無関係なのが一般的。)

# coding: shift-JIS

import re
moji = 'きみとぼく'
m = re.split('と', moji)
print ("1個目は" , m[0])
print ("2個目は" , m[1])
結果
1個目は きみ
2個目は ぼく

対話モード[編集]

対話モードでも、正規表現は使えます。

対話例
>>> 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()になりました。


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

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()

その他[編集]

無名関数を定義するにはlambda文を使用します。

>>> (lambda x: x * x)(2)
4

文字列は""" """で囲むこともできます。これはdocstringと呼ばれ、ドキュメンテーションに用いられる記法ですが、複数行コメントやヒアドキュメントにも用いることができます。

なおPython 2のUnicodeサポートは万全ではないため、日本語(非ASCII文字)を含むプログラムを書く場合は最初の行に# -*- coding: utf-8 -*-というコメントを挿入してください。また、バージョンに限らず文字エンコーディングはUTF-8で保存してください。

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

シェルスクリプトと同様、末尾に\が置かれた行は次の行に継続します。

Pythonではジェネレータを簡単に書くことができます。ジェネレータを用いると、最初のフィボナッチ数を求めるプログラムは次のように書くことができます。

def fibgen():
    a, b = 0, 1
    while True:
        yield a
        a, b = a + b, a

fib = fibgen()

for i in range(10):
    try:
        print(fib.next())
    except:
        print(next(fib))

Pythonでは特に指定のない変数は自動的にローカル変数(レキシカルスコープ)になります。

a, b = 0, 1というのは分割代入で、a = 0; b = 1と同じ意味です。

a, b = a + b, aも同様ですが、代入は一気に行われるため、t = a; a = a + b; b = tと同義です(変更前のaの値がbに代入される)。

Pythonではwhile True:のように制御構文の条件式をかっこで囲む必要がありません。定義済みキーワードとして、真を表すTrue、偽を表すFalse、そしてNoneが存在します。

yield文はreturn文と同様ですが、サブルーチンの戻り値を処理の「途中で」返すことができます。nextメソッドを呼ぶと、「途中から」処理が継続されます。このような関数をジェネレータまたはコルーチンといいます。

rangeは範囲演算子と呼ばれる、0以上n - 1以下の整数の配列を返す組み込み関数です。for-in文は配列を走査するのに用いられます。

Python 3以降nextメソッドが演算子に変更されたため、例外処理に用いるtry-except文によって処理を分岐させています。他のプログラミング言語では例外処理は予期せぬ致命的なエラーをキャッチするものと捉えられていますが、Pythonではファイルオープンに失敗したときの処理を書く際など日常的に用いられます。

豆知識: Pythonでは条件演算子はcondition ? ifTrue : ifFalseではなくifTrue if condition else ifFalseという書き方をします。