読者です 読者をやめる 読者になる 読者になる

唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

python 2.7でPython 3風に書きたい

Python 3以降との違いを調べていたときのメモ

Python 2.7でも試せるもの

以下にPython 2.7でimportをすればPython 3風に書けるものを列挙しておきます

from __future__ import division

Python 2.7では割り算「/」の結果は切り捨てでしたが、Python 3以降ではちゃんと小数点以下まで保持されるようになります
以前のような切り捨ての割り算は「//」演算子でできるようになります

>>> 3 / 2
1
>>> from __future__ import division
>>> 3 / 2
1.5
>>> 3 // 2
1

from __future__ import print_function

Python3では「print」が関数になったので「print(何か)」のように書かないといけなくなります
また改行したくない場合には以下のように書けます

>>> from __future__ import print_function
>>> print('Hello World', end='')

from __future__ import unicode_literals

Python 3では文字列は基本的にユニコードになります
Python 2.7では u'文字列' と書くことでユニコード文字列にしますが、Python 3以降はあるいはこのimportをするとuを書かないでも '文字列' と書くだけでユニコード文字列になります
通常の文字列(バイト文字列)は代わりに b'文字列' と書くようになります

>>> '文字列'
'\x95\xb6\x8e\x9a\x97\xf1'
>>> u'文字列'
u'\u6587\u5b57\u5217'
>>> from __future__ import unicode_literals
>>> '文字列'
u'\u6587\u5b57\u5217'
>>> b'文字列'
'\x95\xb6\x8e\x9a\x97\xf1'

Python 3では文字列関係の動作が他にも色々と変わってるので注意が必要です
これらはimportをしても変わらなかったりします
たとえば以下のような問題があります

Python 2 では、b'py'[1] は 'y' ですが、Python 3では 121 です。この相違については要素一つ分のサイズでスライスすることで避けられます。b'py'[1:2] とすると、Python 2 では 'y' となり、Python 3 では b'y' となります

http://docs.python.jp/3.3/howto/pyporting.html#bytes-literals

他にはopenしたファイルがバイト文字列を返すかユニコード文字列を返すかなどの違いもあります

from future_builtins import *

いくつかのビルトイン関数の動作が変わったり追加されたりします
たとえばmapやzip関数がイテレータを返すようになります

from __future__ import absolute_import

ちょっと詳細は理解していませんがimportが相対的ではなく絶対的(優先?)になります。

まとめ

というわけで色々と調べたんですが、importとかしても完全に互換にはならないみたいなので注意
どのバージョンのPythonが使われてるのが多いんですかね?

-->