Python小ネタ

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乗

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'