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

Python 3ではまったこと


このエントリーをはてなブックマークに追加

Python 2.xの知識もたいしてないのにもかかわらずPython 3.xのコードを書いていると、細かい違いでハマることが想像以上に多い。ここではそんなハマりどころをまとめておく。

printが文から式になった

Python 2.xでは

print "aaa"

と書けたのに、Python 3.xでは

print ("aaa")

と、かっこで囲わなくてはいけなくなった。

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()))