Python 2.xの知識もたいしてないのにもかかわらずPython 3.xのコードを書いていると、細かい違いでハマることが想像以上に多い。ここではそんなハマりどころをまとめておく。
xrangeの廃止
Python 2.xでは、巨大な数列のループを回すときは
for i in xrange(0, 10000)
とxrange()を使うのが定石だったが、Python 3.xではxrangeはrangeに統合されてなくなったので
for i in range(0, 10000)
と書くことになった。
参考:よりPythonicなPythonを目指して(後編):言語としての一貫性を重視したPython 3の進化 (1/2) - @IT
除算
Python 2.xでは、除算演算子'/'を使って整数同士を割り算すると、Cと同じく余りが切り捨てられて整数が返った。
$ 5 / 2 2
Python 3.xでは、'/'を使うと小数が返るようになってしまった。
$ 5 / 2 2.5
Python 3.xでも余りを切り捨てて整数の商を得たい場合は、
$ 5 // 2 2
という風に'//'という演算子を使う。
何気に大きな変更ですね。。。
raw_input()の廃止
ユーザからの入力を読み込むraw_input()が廃止されて、input()を使うように変更された。
map()で返るのがリストではなくなった
以下のコードをPython2で実行すると、map()は[100, 200, 300]というリストを返す。
#!/usr/bin/env python # -*- coding: utf-8 -*- string = "100 200 300" ret = map(int,string.split())
しかしPython3では、map()はリストではなくmapオブジェクトを返すようになった。
Python3でもリストを得たい場合には、map()をlist()でくくる。
ret = list(map(int,string.split()))