Python シーケンス (Sequence)

シーケンスはオブジェクとをシーケンシャル (順番) に処理するためのデータ構造で, Pythonにはコンテナ・イテレータ・ジェネレータといったものがあり, イテレート処理やインデックスアクセスできるものです.

シーケンスがサポートしているオペレーション
Operation Description
x in s sの要素のにxと同じものがあればTrueを返す. そうでなければFalseを返す
x not in s sの要素のにxと同じものがあればFalseを返す. そうでなければTrueを返す
s + t sとtを連結する
s * n sとn回連結する
s[i] sのi番目の要素を取り出す
s[i:j] sのi番目から (j – 1) 番目の要素を取り出す
s[i:j:k] sのi番目から (j – 1) 番目の要素をk個ごとに取り出す
len(s) sの要素数を取り出す
min(s) sの要素のうち最も小さいものを取り出す
max(s) sの要素のうち最も大きいものを取り出す
s.index(i) sの要素の中にiと同じものが最初にあったインデックスを返す
s.count(i) sの要素の中にiと同じものがいくつあるかを返す

Python 数値型

Python3の数値型は, int (長整数), float (浮動小数点数), complex (複素数) の3つがあります.

数値型のオペレーション
Operation Description
x + y xとyの和
x – y xとyの差
x * y xとyの積
x / y xとyの商
x // y xとyの商 (切り捨て)
x ** y xとy乗
-x xの符号反転
+x xの符号不変
abs(x) xの絶対値
pow(x, y) xとy乗
int(x) xの整数への変換
float(x) xの浮動小数点数への変換
complex(re, im) 実部re, 虚部imの複素数
c.conjugate() 複素数cの共役複素数

int

intは長整数で精度の制限がなく, かなり大きな値をもてます (現実的にはメモリに制限されるでしょうが…)

$ python3
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> num = 12
>>> posnum = +12
>>> negnum = -12
>>> 0x11
17
>>> 0xff
255
>>> 0xffff
65535
>>> 0b01010
10
>>> 0o12
10
>>> bin(10)
'0b1010'
>>> oct(10)
'0o12'
>>> hex(10)
'0xa'
>>> int()
0
>>> int('5')
5
>>> int('a')
Traceback (most recent call last):
  File "", line 1, in 
ValueError: invalid literal for int() with base 10: 'a'
>>> int('a', 16)
10

float

Pythonのfloatは53ビットの精度です. 浮動小数点数にまつわる問題は他の言語と同様につきまといますが, decimalモジュールを利用することである程度解決することができます.

$ python3
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.float_info.max
1.7976931348623157e+308
>>> sys.float_info.min
2.2250738585072014e-308
>>> sys.float_info.dig
15
>>> sys.float_info.mant_dig
53
>>> num = 3.14
>>> 1e2
100.0
>>> 0.1 + 0.1 + 0.1
0.30000000000000004
>>> from decimal import Decimal
>>> Decimal('0.1') + Decimal('0.1') + Decimal('0.1')
Decimal('0.3')
>>> (0.1 + 0.1 + 0.1) == 0.3
False
>>> (Decimal('0.1') + Decimal('0.1') + Decimal('0.1')) == 0.3
False

complex

Pythonは (数学者がつくったということもあり) 複素数をサポートしています.

$ python3
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> c1 = 1 + 5j
>>> c2 = complex(1.3, 0.5)
>>> c1 + c2
(2.3+5.5j)
>>> c1 - c2
(-0.30000000000000004+4.5j)
>>> c1 * 2
(2+10j)
>>> c1 / 2
(0.5+2.5j)

Python 論理型 (bool)

Pythonに (限らずですが…) は, 条件分などに利用する論理型 (bool) があり, TrueとFalseの2つの値が定義されています.

$ python3
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> True and False
False
>>> True and True
True
>>> True or False
True
>>> not True
False
>>> True and not False
True

また, Pythonのboolはint型を継承しているので, intで定義されているプロパティをboolオブジェクトで利用することが可能です

Python 型

Pythonのビルトインオブジェクトの型には以下のようなものがあります.

Type Example
論理型 True, False
数値型 12 (int), 3.14 (float), 1 + 5j (complex)
シーケンス ‘sample’ (文字列), [1, 2, 3] (lists), (1, 2, 3) (tuples), {1, 2, 3} (set), {‘key1’ : ‘value1’, ‘key2’ : ‘value2’, ‘key3’ : ‘value3’} (Dictionaries)
None型 None

Python ドックストリング

Pythonでは, 関数やクラスの説明 (Javadocやphpdocのようなもの) にはドックストリングという方法で記述します.

記述方法は簡単で3重クォートを使い, 関数やクラスの先頭に記述します.

また, 記述された内容は関数やクラスオブジェクトの__doc__プロパティで参照可能です.

sample.py

def main():
    """
    sample code
    """

if __name__ == '__main__':
    print(main.__doc__)
$ python3 sample.py

    sample code
    

また, help関数を利用することでも同様のことが可能です.

def main():
    """
    sample code
    """

if __name__ == '__main__':
    help(main)

Python __name__

Pythonでは, __で始まり, __で終わる変数は特別な変数でありますが (PHPではマジック定数), そのうちの1つに__name__があります.

この変数はPythonのスクリプトがコマンドラインから実行されたのか, モジュールとしてインポートされて実行されたのかを調べるのに利用します (Node.jsのrequire.mainのようなものですね).

コマンドラインから実行された場合, __name__は文字列__main__となるので, __main__となっているかどうかを判定することで上記の判別が可能です. 具体的には以下のような感じで利用します.

def main():
    for i in range(1, 6):
        if i % 2 == 0:
            print('%s is even' % i)
        else:
            print('%s is odd' % i)

if __name__ == '__main__':
    main()

Python コマンドラインからの入力 / コマンドラインへの出力

Pythonでコマンドラインからの入力を変数に代入するには, ビルトイン関数のinputを利用します.

 name = input('name? ')
 age  = input('age? ')

コマンドラインへの出力にはビルトイン関数のprintを利用します. print関数はC言語のprintfのように変換指定子を利用することが可能です.

print('Hello %s. (%s)' % (name, age))

Mac OS XにPython 3.xをインストール

OS Xには標準でPythonがインストールされていますが, 2.xなので (ちなみに, OS Xでは10.9.5), 3.xは手動でインストールする必要があります.

といってもインストールは簡単で, こちらのサイトからPython 3.xのインストーラーをダウンロードして実行するだけです.

インストールが完了すれば, python3のコマンドが使用可能になり, バージョンを調べると以下のように表示されます.

$ python3 --version
Python 3.4.3

参考 : https://oku.edu.mie-u.ac.jp/~okumura/python3/install.html

SVG 動的に要素を追加する

SVGにJavaScriptで動的に要素を追加する場合, HTMLElementのように, document.createElementメソッドで要素を作成し, DOMツリーに追加する方法ではうまくいきません

var text = document.createElement('text');

text.setAttribute('x', 10);
text.setAttribute('y', 10);
text.textContent = 'sample';

var svg = document.querySelector('svg');

svg.appendChild(text);

この問題は, 要素を作成するときに名前空間を指定できるdocument.createElementNSメソッドを利用することで解決できます.

var text = document.createElementNS('http://www.w3.org/2000/svg', 'text');

text.setAttribute('x', 10);
text.setAttribute('y', 10);
text.textContent = 'sample';

var svg = document.querySelector('svg');

svg.appendChild(text);

第1引数にSVGの名前空間を指定し, 第2引数にSVGのタグ名を指定するだけです.

参考 : document.createElementNS