Python3000正式リリースしたので戯れてみる

  • December 05, 2008 08:49

さて、先日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になったことです!!

Comments

December 07, 2008 21:38 by CortYuming

いつも参考にさせていただいてます。
辞書型の内包表記のところなんですけど
[dic.setdefault(str(i), i * 3) for i in range(5)]
なんじゃないかなーと。間違ってたらごめんなさい。

December 08, 2008 13:50 by uemura

僕の間違いです。
訂正しました。

ありがとうございます。