そうだ! EuroPython 2011へ行こう

#1 基調講演とカンファレンスの全体像

この記事を読むのに必要な時間:およそ 5 分

WHAT MAKES PYTHON SO AWESOME: Pythonのいけてるところ

基調講演のもう一人はRaymond Hettinger氏。

Raymond Hettinger氏

Raymond Hettinger氏

Raymond Hettinger氏は,Pythonのコア開発者でitertoolsモジュールやsetオブジェクト等の作者であり,Pythonソフトウェア財団(PSF)の役員も務めています。彼のActiveState Codeのレシピには,Pythonクックブックに引用されているコードがいくつもあります。また,氏のTwitter@raymondhでは,Pythonのちょっとしたテクニックをよく紹介しています。

基調講演では,Pythonそのものの良さを次の3つの視点から紹介し,これらの項目すべてを含めてPythonがいけてるということを講演されていました。

成功の背景
  • ライセンス
  • 商用ディストリビューション
  • Zen
  • コミュニティ
  • モジュールリポジトリ(PyPI)
  • キラーアプリ
  • Win32
  • 書籍
優れた品質
  • 習得しやすい
  • 高速な開発サイクル
  • 簡潔な表現
  • 可読性と美しさ
  • たった1つのやり方
  • インタラクティブプロンプト(アプリへのインタプリタ組み込み)
  • バッテリーインクルード(豊富な標準ライブラリ)
  • 縁の下の力持ち(互換性を意識した進化,シンプルな実装)
  • 共通プロトコル
プログラマを魅了する機能
  • 信頼できる基盤:リスト,ディクショナリ,メモリ
  • マネジメント,例外,ファーストクラス関数,オーバーライド可能な構文
  • イテレータープロトコルとジェネレーター
  • 内包表記
  • デコレーター
  • イントロスペクションと抽象基底クラス
  • Exec,eval(),type()
  • with文
  • インデントブロック

この中から,筆者が印象に残った項目,もしくは(比較的)新しめの話題をいくつか紹介します。

なお,本講演はWHAT MAKES PYTHON SO AWESOMEから視聴できます。

モジュールリポジトリ(PyPI)

PythonのパッケージリポジトリとしてPyPI(Python Package Index)があります。資料の中では,現在15,318個のパッケージがあると紹介されていました。筆者の周りではPyPIを「ぱいぱい」と呼んでいますが,Raymond氏は「ぴぴぃ」と呼んでいました。

PyPIへパッケージをアップロードすると,他環境へのインストールの簡略化,他人へパッケージの存在を知ってもらうなど,たくさんのメリットがあります。

PythonのパッケージングやPyPIへパッケージをアップロードする方法については,清水川さん@shimizukawaがまとめられたPython Hack-a-thon 4ハンズオン 中級コースがとても分かりやすいです。筆者もこの内容を参考にしてPyPIデビューを果たしました。

習得しやすい

Pythonは,1時間でデータ型,制御構造,モジュールを学べて,1日あればPythonのイディオム,汎用オブジェクト,ライブラリ,特殊メソッドが分かるから,週末だけで学習できるよと述べられていました。

Pythonを学び始めるならPythonチュートリアルから始めるのが良いという人が,筆者の周りにも何人かいます。ぜひ挑戦してみてください。

Ease of Learning

Ease of Learning

簡潔な表現

簡潔な表現の例として,次のPythonのサンプルコードが紹介されていました。

import collections
import glob
import gzip
import re
import heapq
import pprint

counter = collections.Counter()
for filename in glob.glob('Data/logs/*.gz'):
    for line in gzip.open(filename):
        mo = re.search(r'GET (.*) HTTP/1', line)
        if mo is not None:
            url = mo.group(1)
            counter[url] += 1

result = heapq.nsmallest(20, counter.items(),
                         key=lambda (url, cnt): cnt)
pprint.pprint(result)

このサンプルプログラムは,Webサーバのログディレクトリからログファイルを取り出して,参照されたページのアクセス数が少ない方から20個のページ情報を表示するプログラムです。いくつか標準ライブラリを利用していますが,Pythonでは,こういった小さなツールや機能を組み合わせて処理を実装するコーディングが好まれます。

簡潔さに加えて,インデントにより整形されたコードは見栄えも良くなります。企業が業務でPythonを選択する最も多い理由は,優れた可読性によるメンテナンス性の高さにあると,講演の中でも触れられていました。

また,利用する上で必要なものが一通り揃っているということをBatteries Included(バッテリーインクルード)と呼ぶそうです。Pythonには,豊富な標準ライブラリが付属していて,アプリケーションを開発する上で便利な機能を提供しています。

イテレータープロトコルとジェネレーター

イテレータープロトコル

イテレータープロトコル

Pythonそのものと結び付きの強い仕組みにイテレーターがあります。文字列やリスト,ディクショナリからファイルやその他のコレクション型まで,様々なオブジェクトがイテレータープロトコルをサポートしています。このおかげで,そういったオブジェクト(Iterable)のデータ型の違いをあまり意識せずに,forループ文から,min/max,sortedといった関数まで一貫して扱えます。

例えば,ディクショナリをソートしようとすると,そのキーのイテレータが返され,キーのソートされたリストが得られます。

>>> sorted({"a":1, "b": 3, "c": 2})
['a', 'b', 'c']

キーと値を保持して値でソートしたい場合は,key引数に比較する要素を取り出す関数を渡します。

>>> sorted({"a":1, "b": 3, "c": 2}.items(),
...        key=lambda (k, v): v)
[('a', 1), ('c', 2), ('b', 3)]

さらにおもしろい例では,Raymond氏が開発したイテレーターを作成して返すitertoolsモジュールに様々なツールがあります。無限リスト,または巨大なリストを扱うときなど,パフォーマンスを考慮する場面でitertoolsモジュールは活躍します。

次のような例を考えてみます。引数で受け取ったオブジェクトを返すrepeat()と,map()と同じように引数で受け取った関数に対して,繰り返し可能なオブジェクトの要素を1つずつ適用して返すimap()を組み合わせると,任意のリストの要素を2乗する処理が次のように書けます。

>>> from itertools import imap, repeat
>>> list(repeat(2,3))
[2, 2, 2]

>>> # [pow(i, 2) for i in [1, 2, 3]]
>>> list(imap(pow, [1, 2, 3], repeat(2)))
[1, 4, 9]

最後にイテレーターを作成する最も簡単な方法としてジェネレーターを紹介します。関数を定義するときにyieldというキーワードを使うのみで,イテレーターを作成できるとてもシンプルな構文です。

>>> def f(n):
...     for i in xrange(n):
...         yield i

>>> list(f(3))
[0, 1, 2]

PEP 342によりyieldyield式として再定義されました。この詳細は,別の講演のPython拡張ジェネレータの先へにおいて,説明されていたので次回に紹介します。

イテレーターに関する内容を簡単に紹介しましたが,もっと詳しく知りたい方は関数型プログラミングHOWTOを参照してください。

著者プロフィール

森本哲也(もりもとてつや)

一介のプログラマ。

自分で設計して,自分で開発して,自分で直せるような独立したプログラマを目指している。OSSコミュニティのゆるい人のつながりが性にあっていてPythonプログラミングが好き。共訳書に『エキスパート Pythonプログラミング』(アスキーメディアワークス)がある。

Twitter:@t2y

ブログ:http://d.hatena.ne.jp/t2y-1979/