Python3000正式リリースしたので戯れてみる
December 05, 2008 at 08:49 AM | View Commentsさて、先日Python3000の正式版がリリースされました。
僕は基本的に扱っているサーバーの一番古いのバージョンのPythonを使うようにしているので(2.4、そろそろ2.5かな)当分使うことはないと思いますが、興味本位で分かりやすい変更点だけ試してみようかと思います。
お約束のprint
# python2.xの場合
>>> print "hoge"
hoge
# python3000
>>> print("hoge")
hoge
ちなみに
>>> print("hoge", 3)
hoge 3
>>> print("hoge"+3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly
辞書型の内包表記
# python2.x の場合
>>> dic = {}
>>> [dic.setdefault(str(i), i * 3) for i in range(5)] #ミスしてたので訂正しました。CortYumingさんありがとうございます。
[0, 3, 6, 9, 12]
>>> dic
{'0': 0, '1': 3, '2': 6, '3': 9, '4': 12}
# python3000 の場合
>>> {str(i): i*3 for i in range(5)}
{'1': 3, '0': 0, '3': 9, '2': 6, '4': 12}
itemsを使えば
>>> dic = dict(a=1, b=2, c=3)
>>> {k*2: v*3 for k,v in dic.items()}
{'aa': 3, 'cc': 9, 'bb': 6}
ちなみに
#python2.x の場合
>>> dic.items()
[('a', 1), ('c', 3), ('b', 2)]
# python3000 の場合
>>> dic.items()
<dict_items object at 0x00E1F4E0>
メモリの効率を考えているのではないかと思われる。
リスト内包表記のスコープ
# python2.xの場合
>>> i = None
>>> [i for i in range(3)]
[0, 1, 2]
>>> i
2
# Python3000の場合
>>> i = None
>>> [i for i in range(3)]
[0, 1, 2]
>>> i
>>> type(i)
<class 'NoneType'>
これは地味に良いかも
printも式になったので
>>> for i in (print(i) for i in range(4)):
... i
...
0
1
2
3
ちょっと不気味ですね。
superが簡単に
#python2.x の場合
>>> class Hoge(object):
... def __init__(self, name):
... self.name = name
...
>>> class Fuga(Hoge):
... def __init__(self, name, age):
... self.age = age
... super(Fuga, self).__init__(name)
...
>>> f = Fuga("john", 22)
>>> f.name
'john'
>>> f.age
22
# Python3000の場合
>>> class Hoge:
... def __init__(self, name):
... self.name = name
...
>>> class Fuga(Hoge):
... def __init__(self, name, age):
... self.age = age
... super().__init__(name)
...
>>> f = Fuga("Guido", 33)
>>> f.name
'Guido'
>>> f.age
33
Setがビルトイン関数に
# python2.xの場合
>>> from sets import Set
>>> a = [2,2,3,3,4,4]
>>> Set(a)
Set([2, 3, 4])
>>> list(Set(a))
[2, 3, 4]
# Python3000の場合
>>> a = [2,2,3,3,4,4]
>>> set(a)
{2, 3, 4}
>>> list(set(a))
[2, 3, 4]
これもあり
>>> {i for i in a}
{2, 3, 4}
>>> type({i for i in a})
<class 'set'>
辞書とsetの内包表記は同じ扱いなんだ、、、面白い。
ちなみに
>>> dir(set)
['__and__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__',
'__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__ior__', '__isub__', '__iter__',
'__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__',
'__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__',
'__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update',
'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove',
'symmetric_difference', 'symmetric_difference_update', 'union', 'update']
と同じものみたいです。
他に
# python2.xの場合
>>> a = range(5)
>>> a[0], a[1:-1], a[-1]
(0, [1, 2, 3], 4)
# python3000の場合
>>> (a, *rest, b) = range(5)
>>> (a, rest, b)
(0, [1, 2, 3], 4)
これも地味にいいかも。
ということで、簡単にPython3000を触ってみました。 もっと内部のことを調べないと使えないですが、良い感じなので楽しみです。
今回やってませんが、一番興味深いポイントはstrがunicodeになったことです!!
categories:
python, python3000