Python小ネタ

目次
Pythonの意外と知られていない小ネタを紹介します。
比較演算子の連続使用
比較演算子はx < y < z
のように続けて使用できます。
>>> x = 5
>>> 1 < x < 10
True
>>> 5 < x < 10
False
>>> 1 < x < 5
False
>>> 1 < x <= 5
True
複素数
Pythonは複素数をサポートしています。虚数単位はj
もしくはJ
を使います。
>>> (1+1j) * (1-1j)
(2+0j)
math
モジュールに複素数を渡したり解が複素数になるような演算はエラーが出ますが、複素領域での処理をするにはcmath
モジュールを使います。
>>> import math
>>> math.sqrt(-1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: math domain error
>>> import cmath
>>> cmath.sqrt(-1)
1j
べき乗演算子で平方根
べき乗演算子でmath.sqrt
を使わず平方根を取得できます。
>>> 2 ** 0.5
1.4142135623730951
0の0乗
は数学的には不定ですが便宜上特定の値を割り当てることがあり、Pythonは1を返します。
>>> 0 ** 0
1
文字列の繰り返し
文字列に対して乗算演算子を使うと、指定回数繰り返した文字列を生成します。
>>> 'abc' * 5
'abcabcabcabcabc'
文字列のカウント
count関数を使って文字列中に指定文字列が何回出現するか取得できます。
>>> 'abcabc'.count('ab')
2
>>> 'abcabc'.count('ca')
1
様々なエンコード・デコード
文字列をエンコード・デコードする際に、UTF-8やSift_JISなどの文字コード以外の様々なコーデックが用意されています。デフォルトで使えるコーデックは標準エンコーディング、コーデックの追加などはcodecs
モジュールで行えます。
>>> 'abc'.encode('base64') # Base64エンコード
'YWJj\n'
>>> _.decode('base64') # Base64デコード
'abc'
>>> 'abc'.encode('zlib') # gzip圧縮
"x\x9cKLJ\x06\x00\x02M\x01'"
>>> 'abc'.encode('bz2') # bz2圧縮
'BZh91AY&SYd\x8c\xbbs\x00\x00\x00\x01\x008\x00 \x00!\x98\x19\x84aw$S\x85\t\x06H\xcb\xb70'
>>> 'abc'.encode('rot13') # シーザー暗号
'nop'
>>> 'abc'.encode('hex') # 16進数表現
'616263'
組み合わせれば、Base64+gzipでエンコードされたデータも1行でデコードできます。
>>> 'eJxLVChLLapUyMnPS1dIzkgsSkwuSS1SKC4pysxLBwCVPgqc'.decode('base64').decode('zlib')
'a very long character string'