Commits

INADA Naoki committed c076af9

container: Python 3 対応

Comments (0)

Files changed (1)

 セットで扱いたい場合は、 ``enumerate`` 関数を使います。
 
    >>> for i in L:
-   ...     print i
+   ...     print(i)
    ... 
    4
    2
    0
    >>> for i,a in enumerate(L):
-   ...     print i,a
+   ...     print(i, a)
    ... 
    0 4
    1 2
 range
 ^^^^^^
 
-``for`` ループの所で出てきた ``range`` 関数は、 start, end, step を
-指定して list を生成するものです。
-生成される数値 val の範囲は start <= val < end になります。
-(step が負なら start >= val > end です。)
+``for`` ループの所で出てきた ``range`` 関数は range オブジェクトを作成します。
 
-   >>> range(1,4)    # 引数2つなら step が省略されて 1 になる
+    >>> range(3)
+    range(0, 3)
+    >>> for i in _:
+    ...     print(i)
+    0
+    1
+    2
+
+range オブジェクトのようにループできるものを、 iterable (列挙可能) と呼びます。
+iterable は、 ``list`` 関数で list にできます。
+
+    >>> list(range(3))
+    [0, 1, 2]
+
+range 関数は start, end, step を指定することができます。
+生成される値は、 step 間隔で、範囲は start 以上 end 未満になります。
+(step が負なら start 以下で end より大きいです。)
+
+   >>> list(range(1,4))    # 引数2つなら step が省略されて 1 になる
    [1, 2, 3]
-   >>> range(4)      # 引数1つなら start も省略されて 0 になる
+   >>> list(range(4))      # 引数1つなら start も省略されて 0 になる
    [0, 1, 2, 3]
-   >>> range(1, 10, 3)
+   >>> list(range(1, 10, 3))
    [1, 4, 7]
    >>> range(10, 1, -3)
    [10, 7, 4]
 
 
-``for`` ループのために一気にリスト全体を作るのはメモリの無駄ですし
-速度も遅くなるので、値を1つずつ生成する ``xrange`` という関数もあります。
-
-   >>> for i in xrange(3):
-   ...     print i
-   ... 
-   0
-   1
-   2
-
-.. note::
-
-   Python 3 では、 range が xrange をさらに強化したものになるので、
-   xrange はなくなります。
-
-
 tuple
 ------
 ``tuple`` は list とよく似ていますが、より軽量で、 immutable です。
    >>> 'bar' in d
    False
    >>> for k in d:
-   ...     print k
+   ...     print(k)
    ... 
    (1, 2)
    foo
    fizz
 
-``keys()`` というメソッドで key の list を、 ``values()`` というメソッドで
-value の list を、 ``items()`` というメソッドで ``(key, value)`` の形の
-tuple の list を得ることができます。
+``keys()`` というメソッドでキーの、 **view** を取得することができます。
+view は、後述する set 型のような振る舞いをしますが、元の dict の内容を反映します。
+``values()`` で値の、 ``items()`` が ``(key, value)`` の形の view を返します。
 
    >>> d.keys()
-   [(1, 2), 'foo', 'fizz']
+   dict_keys([(1, 2), 'foo', 'fizz'])
    >>> d.values()
-   [3, 'bar', 'buzz']
+   dict_values([3, 'bar', 'buzz'])
    >>> d.items()
-   [((1, 2), 3), ('foo', 'bar'), ('fizz', 'buzz')]
+   dict_items([((1, 2), 3), ('foo', 'bar'), ('fizz', 'buzz')])
    >>> 'bar' in d.values()
    True
-   >>> for k,v in d.items():
-   ...     print k,v
+   >>> for k, v in d.items():
+   ...     print(k, v)
    ... 
    (1, 2) 3
    foo bar
    fizz buzz
+   >>> d['X'] = 'Y'
+   >>> d.keys()
+   dict_keys([(1, 2), 'foo', 'fizz', 'X'])
 
-``values()`` や ``items()`` も、一気にリスト全体を構築するとメモリの無駄なので、
-Python 2.6 からは値を1つずつ取り出す ``itervalues()``, ``iteritems()`` が追加され、
-Python 2.7 ではさらに強力な ``viewvalues()``, ``viewitems()`` が追加されました。
-(どう強力なのかは http://www.python.jp/doc/release/library/stdtypes.html#dict-views
-を参照してください)
+http://www.python.jp/doc/release/library/stdtypes.html#dict-views も参照してください。
 
-Python 3 では、 ``keys()``, ``values()``, ``items()`` はそれぞれ ``viewkeys()``,
-``viewvalues()``, ``viewitems()`` 相当のメソッドに置き換わり、 ``iter*`` メソッドや
-``view*`` メソッドはなくなります。
+.. note::
+
+    Python 2 では、 ``keys()``, ``values()``, ``items()`` は view ではなく
+    list を返していました。
+
+    一気にリスト全体を構築するとメモリの無駄なので、
+    Python 2.6 からは値を1つずつ取り出す ``itervalues()``, ``iteritems()`` が追加され、
+    Python 2.7 では Python 3 と同じく **view** を返す
+    ``viewvalues()``, ``viewitems()`` が追加されました。
 
 
 挿入順を保存する dict
    >>> od['baz'] = 3
    >>> od
    OrderedDict([('foo', 1), ('bar', 2), ('baz', 3)])
-   >>> od.items()
+   >>> list(od.items())
    [('foo', 1), ('bar', 2), ('baz', 3)]
 
 
 
    >>> s = set(range(5))
    >>> s
-   set([0, 1, 2, 3, 4])
+   {0, 1, 2, 3, 4}
    >>> s.add(3)
    >>> s
-   set([0, 1, 2, 3, 4])
+   {0, 1, 2, 3, 4}
    >>> s.remove(3)
    >>> s
-   set([0, 1, 2, 4])
+   {0, 1, 2, 4}
    >>> s.add(5)
    >>> s
-   set([0, 1, 2, 4, 5])
+   {0, 1, 2, 4, 5}
 
 和集合や差集合、共通部分集合などを計算することができます。
 
    >>> t = set(range(0,8,2))
    >>> t
-   set([0, 2, 4, 6])
+   {0, 2, 4, 6}
    >>> s
-   set([0, 1, 2, 4, 5])
+   {0, 1, 2, 4, 5}
    >>> t & s         # 共通部分集合
-   set([0, 2, 4])
+   {0, 2, 4}
    >>> t | s         # 和集合
-   set([0, 1, 2, 4, 5, 6])
+   {0, 1, 2, 4, 5, 6}
    >>> t - s         # 差集合
-   set([6])
+   {6}
    >>> s - t
-   set([1, 5])
+   {1, 5}
 
 もちろん、 ``for`` や ``in`` を利用することもできます。
 
    >>> 3 in t
    False
    >>> for c in t:
-   ...     print c
+   ...     print(c)
    ... 
    0
    2
     ...         L.append(i+1)
     ...
     >>> L
-    [1, 4, 7]
+    [1, 4, 7, 10]
 
 次のようにかけます。 ::
 
     {0: 0, 1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18}
 
     >>> {i*2 for i in range(10)}    # set 内包
-    set([0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
-    >>> set(i*2 for i in range(10)} # Python 2.6 までの書き方
-    set([0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
+    {0, 2, 4, 6, 8, 10, 12, 14, 16, 18}
+    >>> set(i*2 for i in range(10)) # Python 2.6 までの書き方
+    {0, 2, 4, 6, 8, 10, 12, 14, 16, 18}