高瀬有広のブログ

東方の鍵山雛ちゃんを愛するニートのお話。Python ドキュメントの翻訳やってます。

Python 3 ドキュメント日本語訳の Nightly Build ができました

Python 3 の日本語訳がついに仮公開されました!
Python 3.3.0b1 documentation (原文)
翻訳プロジェクトはこちらです。

2011 Pythonアドベントカレンダー(Python3) 23 日目 リストの代わりにビューやイテレータを使う

2011 Pythonアドベントカレンダー(Python3) 23 日目
@hirokiky さんに指名を頂きました、@hinaclegear です。
What's New In Python 3.0 (日本語訳) の、
Views And Iterators Instead Of Lists に関する解説をしていきたいと思います。

Python のリストはめちゃくちゃ便利です。しかし、内容をすべてメモリに
置いておくのでかなり消費します。

そこで、後方互換性のしがらみを断ち切った Python3 は、
無駄にリストを使わず、必要なだけのリソースを使うことを徹底しました。

イテレータ
イテレータには __next__() メソッド (2.x では next() メソッド) があります。
これを呼び出すごとに、イテレータは要素を一つずつ返します。

集合、マッピング、(リストのような) シーケンスなどは、
イテラブルと呼ばれます。イテラブルには __iter__() メソッドがあります。
これを呼び出すことで、そのイテラブルのイテレータを取り出せます。
イテラブルであるということは、自身の要素を一つずつ返せることを意味します。

>>> L = [1, 12, 123, 1234]
>>> i = iter(L) # これは L.__iter__() と同じ
>>> next(i) # これは i.__next__() と同じ
1
>>> next(i)
12
>>> next(i)
123
>>> next(i)
1234
>>> next(i) # リスト内包表記などは、この例外を検知してイテレートを終える
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

イテレータもイテラブルです。__iter__() メソッドはイテラブル自身を返します。
最初に戻るためには、イテレータではなくもとのイテラブルの __iter__() を
呼び出さなければなりません。
また、イテレータを分割する (≒イテレータのコピーを作る) には、
itertools.tee() を使ってください。

イテレータには、自身が返す要素をすべて知っている必要がありません。
次の要素の返し方、例えばイテラブルの次の要素にアクセスする方法だけを
知っていれば、他の情報を忘れてもいいのです。
よって、イテレータには、リストなどよりも少ないメモリで十分です。
引数としてイテラブルを取れる関数や、内包表記などには、
なるべくイテレータを使いましょう。

map()、filter()、zip() 関数は、リストではなくイテレータを返すようになりました。

イテレータの中でも、特に range 型は大出世しました。もとは xrange 型として
導入され、3.0 では (リストを返していた旧 range() 関数に代わって)
range の名を手にし、さらに 3.2 で sequence の abc を実装したのです。
リストではないという不便さをあまり感じさせない出来になっています:

>>> r = range(0, 20, 2)
>>> r
range(0, 20, 2)
>>> 11 in r
False
>>> 10 in r
True
>>> r.index(10)
5
>>> r[5]
10
>>> r[:5]
range(0, 10, 2)
>>> r[-1]
18

ビュー
辞書は、キーから値を取り出すのに使えますが、
その機能を使わず、キーなどの一覧のみを取り出したいことがあります。
そのために使われていたのが dict.keys() メソッドなどで、リストを返していました。

でも、本当は新しいリストを作る必要すらないのです。
必要なことは辞書自身が知っているからです。
そこで、項目を保持するのではなく、辞書の項目に対する参照だけを持つ
辞書ビューオブジェクトが取り入れられました。
dict.keys() などは、この辞書ビューを返すようになりました。
辞書ビューもイテラブルです。

>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
>>> keys = dishes.keys()
>>> values = dishes.values()

>>> # イテレート
>>> n = 0
>>> for val in values:
...     n += val
>>> print(n)
504

>>> # キーと値は、同じ順序でイテレートされる
>>> list(keys)
['eggs', 'bacon', 'sausage', 'spam']
>>> list(values)
[2, 1, 1, 500]

>>> # ビューオブジェクトは、辞書の変更を動的に反映する
>>> del dishes['eggs']
>>> del dishes['sausage']
>>> list(keys)
['spam', 'bacon']

>>> # 項目のビューやキーのビューは、集合のような演算もできる
>>> keys & {'eggs', 'bacon', 'salad'}
{'bacon'}
>>> keys ^ {'sausage', 'juice'}
{'juice', 'sausage', 'bacon', 'spam'}

辞書ビューは、2.7 にもバックポートされ、
viewitems()、viewkeys()、viewvalues() として利用できます。

以上です。
ちょっと口調がリファレンスマニュアルっぽくなっちゃったかな。
これで Python の進化したデータ型に興味を持ってもらえれば幸いです。

24 日目は、@hekyou さんにお願いします。

Python ドキュメント日本語翻訳プロジェクトで活動開始

Python ドキュメント日本語翻訳プロジェクト (google Project)
http://code.google.com/p/python-doc-ja/

一人でちまちまやっていたけど、非公式でやっていくのはさすがに限界があるので、
公式のプロジェクトに参加して翻訳することにした。
非公式訳の wiki はそのうち消そう。
時間はあるから、たくさん貢献できそうだ。
これからは人に有り難がられるニートという新しいジャンルが流行る(*´ω`*)

……しかしあれだ、ブログを書くというのは、
面倒だし、黒歴史みたいなのが死屍累々と絡み付いてくるしで
あまり良い物でもないなあ。

FAQ 訳了

ついに FAQ の訳が完成した。ヒキニートなめんなオラァァァ!
しかしこれだけの訳に半年は掛かりすぎた。もっとペースを早めよう。

Python v3.2 documentation 非公式訳 Python Frequently Asked Questions
http://w.livedoor.jp/py3kdocjauo/d/faq%26index

Hello Blogosphere!

はじめまして、高瀬有広です。今日から雑多なことを書き連ねていきたいと思います。

高瀬有広は本名ではありません。本当は名も無きニートです。でも、昔から本名よりもこっちのほうがしっくり来るのです。

どうか、よろしくお願いします!
  • ライブドアブログ