Pythonの技法:リスト以外の選択肢「関数の生成」
文:Nick Gibson(Builder AU)
翻訳校正:原井彰弘
翻訳校正:原井彰弘
2008/01/17 15:10
PythonによるHTMLのカラーコードの生成を例として用い、関数ファクトリについて解説する。
すでにPythonでのリストの内包表記について記事を書いたが、その強力さに魅力を感じて、明示的なループを内包表記にリファクタリングしたいと思っている方々から、多くのフィードバックをいただいてた。
ただし、何事においてもそうであるが、内包表記が役立つ場面がある一方で、ほかの書き方をした方がよい場面というのも存在する。そこで本稿では、内包表記ではなく関数ファクトリの使用がより適している例を取り上げて紹介する。
本稿では、PythonによるHTMLのカラーコードの生成を例として用いる。HTMLでスムーズなグラデーションを作成する必要があり、エンコードの方式にそれほどこだわらないのであれば、テーブルを用いてbgcolor属性を変化させていくという手法を用いることによりとりあえずは作成できる。このケースでは、以下のようにしてリストの内包表記を用いるのがよいアプローチだろう。
def colourslist(red, green, blue, steps):
def f((start,end), i, steps):
return start + i * (end-start)/float(steps)
colours = [tuple([f(c,i,steps-1)
for c in [red,green,blue]])
for i in range(steps)]
return ["%02x%02x%02x" % (rgb) for rgb in colours]
print "<html><body>"
print "<table cellspacing=0 cellpadding=0><tr>"
for colour in colourslist((90,90),(90,255),(90,90),200):
print "<td width=1px bgcolor=%s> </td>" % (colour)
print "</tr></table>"
print "</body></html>"
この例を実行すると、以下のように期待どおりの出力が行われる。
<table cellspacing=0 cellpadding=0><tr> <td width=1px bgcolor=#5a5a5a> </td> <td width=1px bgcolor=#5a5a5a> </td> <td width=1px bgcolor=#5a5b5a> </td> <td width=1px bgcolor=#5a5c5a> </td> <td width=1px bgcolor=#5a5d5a> </td> <td width=1px bgcolor=#5a5e5a> </td> <td width=1px bgcolor=#5a5e5a> </td> <td width=1px bgcolor=#5a5f5a> </td> <td width=1px bgcolor=#5a605a> </td> <td width=1px bgcolor=#5a615a> </td> <td width=1px bgcolor=#5a625a> </td> <td width=1px bgcolor=#5a635a> </td> <td width=1px bgcolor=#5a635a> </td> <td width=1px bgcolor=#5a645a> </td> <td width=1px bgcolor=#5a655a> </td> <td width=1px bgcolor=#5a665a> </td> <td width=1px bgcolor=#5a675a> </td> <td width=1px bgcolor=#5a685a> </td> <td width=1px bgcolor=#5a685a> </td> <td width=1px bgcolor=#5a695a> </td> <td width=1px bgcolor=#5a6a5a> </td> <td width=1px bgcolor=#5a6b5a> </td> <td width=1px bgcolor=#5a6c5a> </td> <td width=1px bgcolor=#5a6d5a> </td> <td width=1px bgcolor=#5a6d5a> </td> <td width=1px bgcolor=#5a6e5a> </td> <td width=1px bgcolor=#5a6f5a> </td> <td width=1px bgcolor=#5a705a> </td> <td width=1px bgcolor=#5a715a> </td> <td width=1px bgcolor=#5a725a> </td> <td width=1px bgcolor=#5a725a> </td> <td width=1px bgcolor=#5a735a> </td> <td width=1px bgcolor=#5a745a> </td> <td width=1px bgcolor=#5a755a> </td> <td width=1px bgcolor=#5a765a> </td> <td width=1px bgcolor=#5a775a> </td> <td width=1px bgcolor=#5a775a> </td> <td width=1px bgcolor=#5a785a> </td> <td width=1px bgcolor=#5a795a> </td> <td width=1px bgcolor=#5a7a5a> </td> <td width=1px bgcolor=#5a7b5a> </td> <td width=1px bgcolor=#5a7b5a> </td> <td width=1px bgcolor=#5a7c5a> </td> <td width=1px bgcolor=#5a7d5a> </td> <td width=1px bgcolor=#5a7e5a> </td> <td width=1px bgcolor=#5a7f5a> </td> <td width=1px bgcolor=#5a805a> </td> <td width=1px bgcolor=#5a805a> </td> <td width=1px bgcolor=#5a815a> </td> <td width=1px bgcolor=#5a825a> </td> <td width=1px bgcolor=#5a835a> </td> <td width=1px bgcolor=#5a845a> </td> <td width=1px bgcolor=#5a855a> </td> <td width=1px bgcolor=#5a855a> </td> <td width=1px bgcolor=#5a865a> </td> <td width=1px bgcolor=#5a875a> </td> <td width=1px bgcolor=#5a885a> </td> <td width=1px bgcolor=#5a895a> </td> <td width=1px bgcolor=#5a8a5a> </td> <td width=1px bgcolor=#5a8a5a> </td> <td width=1px bgcolor=#5a8b5a> </td> <td width=1px bgcolor=#5a8c5a> </td> <td width=1px bgcolor=#5a8d5a> </td> <td width=1px bgcolor=#5a8e5a> </td> <td width=1px bgcolor=#5a8f5a> </td> <td width=1px bgcolor=#5a8f5a> </td> <td width=1px bgcolor=#5a905a> </td> <td width=1px bgcolor=#5a915a> </td> <td width=1px bgcolor=#5a925a> </td> <td width=1px bgcolor=#5a935a> </td> <td width=1px bgcolor=#5a945a> </td> <td width=1px bgcolor=#5a945a> </td> <td width=1px bgcolor=#5a955a> </td> <td width=1px bgcolor=#5a965a> </td> <td width=1px bgcolor=#5a975a> </td> <td width=1px bgcolor=#5a985a> </td> <td width=1px bgcolor=#5a995a> </td> <td width=1px bgcolor=#5a995a> </td> <td width=1px bgcolor=#5a9a5a> </td> <td width=1px bgcolor=#5a9b5a> </td> <td width=1px bgcolor=#5a9c5a> </td> <td width=1px bgcolor=#5a9d5a> </td> <td width=1px bgcolor=#5a9d5a> </td> <td width=1px bgcolor=#5a9e5a> </td> <td width=1px bgcolor=#5a9f5a> </td> <td width=1px bgcolor=#5aa05a> </td> <td width=1px bgcolor=#5aa15a> </td> <td width=1px bgcolor=#5aa25a> </td> <td width=1px bgcolor=#5aa25a> </td> <td width=1px bgcolor=#5aa35a> </td> <td width=1px bgcolor=#5aa45a> </td> <td width=1px bgcolor=#5aa55a> </td> <td width=1px bgcolor=#5aa65a> </td> <td width=1px bgcolor=#5aa75a> </td> <td width=1px bgcolor=#5aa75a> </td> <td width=1px bgcolor=#5aa85a> </td> <td width=1px bgcolor=#5aa95a> </td> <td width=1px bgcolor=#5aaa5a> </td> <td width=1px bgcolor=#5aab5a> </td> <td width=1px bgcolor=#5aac5a> </td> <td width=1px bgcolor=#5aac5a> </td> <td width=1px bgcolor=#5aad5a> </td> <td width=1px bgcolor=#5aae5a> </td> <td width=1px bgcolor=#5aaf5a> </td> <td width=1px bgcolor=#5ab05a> </td> <td width=1px bgcolor=#5ab15a> </td> <td width=1px bgcolor=#5ab15a> </td> <td width=1px bgcolor=#5ab25a> </td> <td width=1px bgcolor=#5ab35a> </td> <td width=1px bgcolor=#5ab45a> </td> <td width=1px bgcolor=#5ab55a> </td> <td width=1px bgcolor=#5ab65a> </td> <td width=1px bgcolor=#5ab65a> </td> <td width=1px bgcolor=#5ab75a> </td> <td width=1px bgcolor=#5ab85a> </td> <td width=1px bgcolor=#5ab95a> </td> <td width=1px bgcolor=#5aba5a> </td> <td width=1px bgcolor=#5abb5a> </td> <td width=1px bgcolor=#5abb5a> </td> <td width=1px bgcolor=#5abc5a> </td> <td width=1px bgcolor=#5abd5a> </td> <td width=1px bgcolor=#5abe5a> </td> <td width=1px bgcolor=#5abf5a> </td> <td width=1px bgcolor=#5abf5a> </td> <td width=1px bgcolor=#5ac05a> </td> <td width=1px bgcolor=#5ac15a> </td> <td width=1px bgcolor=#5ac25a> </td> <td width=1px bgcolor=#5ac35a> </td> <td width=1px bgcolor=#5ac45a> </td> <td width=1px bgcolor=#5ac45a> </td> <td width=1px bgcolor=#5ac55a> </td> <td width=1px bgcolor=#5ac65a> </td> <td width=1px bgcolor=#5ac75a> </td> <td width=1px bgcolor=#5ac85a> </td> <td width=1px bgcolor=#5ac95a> </td> <td width=1px bgcolor=#5ac95a> </td> <td width=1px bgcolor=#5aca5a> </td> <td width=1px bgcolor=#5acb5a> </td> <td width=1px bgcolor=#5acc5a> </td> <td width=1px bgcolor=#5acd5a> </td> <td width=1px bgcolor=#5ace5a> </td> <td width=1px bgcolor=#5ace5a> </td> <td width=1px bgcolor=#5acf5a> </td> <td width=1px bgcolor=#5ad05a> </td> <td width=1px bgcolor=#5ad15a> </td> <td width=1px bgcolor=#5ad25a> </td> <td width=1px bgcolor=#5ad35a> </td> <td width=1px bgcolor=#5ad35a> </td> <td width=1px bgcolor=#5ad45a> </td> <td width=1px bgcolor=#5ad55a> </td> <td width=1px bgcolor=#5ad65a> </td> <td width=1px bgcolor=#5ad75a> </td> <td width=1px bgcolor=#5ad85a> </td> <td width=1px bgcolor=#5ad85a> </td> <td width=1px bgcolor=#5ad95a> </td> <td width=1px bgcolor=#5ada5a> </td> <td width=1px bgcolor=#5adb5a> </td> <td width=1px bgcolor=#5adc5a> </td> <td width=1px bgcolor=#5add5a> </td> <td width=1px bgcolor=#5add5a> </td> <td width=1px bgcolor=#5ade5a> </td> <td width=1px bgcolor=#5adf5a> </td> <td width=1px bgcolor=#5ae05a> </td> <td width=1px bgcolor=#5ae15a> </td> <td width=1px bgcolor=#5ae15a> </td> <td width=1px bgcolor=#5ae25a> </td> <td width=1px bgcolor=#5ae35a> </td> <td width=1px bgcolor=#5ae45a> </td> <td width=1px bgcolor=#5ae55a> </td> <td width=1px bgcolor=#5ae65a> </td> <td width=1px bgcolor=#5ae65a> </td> <td width=1px bgcolor=#5ae75a> </td> <td width=1px bgcolor=#5ae85a> </td> <td width=1px bgcolor=#5ae95a> </td> <td width=1px bgcolor=#5aea5a> </td> <td width=1px bgcolor=#5aeb5a> </td> <td width=1px bgcolor=#5aeb5a> </td> <td width=1px bgcolor=#5aec5a> </td> <td width=1px bgcolor=#5aed5a> </td> <td width=1px bgcolor=#5aee5a> </td> <td width=1px bgcolor=#5aef5a> </td> <td width=1px bgcolor=#5af05a> </td> <td width=1px bgcolor=#5af05a> </td> <td width=1px bgcolor=#5af15a> </td> <td width=1px bgcolor=#5af25a> </td> <td width=1px bgcolor=#5af35a> </td> <td width=1px bgcolor=#5af45a> </td> <td width=1px bgcolor=#5af55a> </td> <td width=1px bgcolor=#5af55a> </td> <td width=1px bgcolor=#5af65a> </td> <td width=1px bgcolor=#5af75a> </td> <td width=1px bgcolor=#5af85a> </td> <td width=1px bgcolor=#5af95a> </td> <td width=1px bgcolor=#5afa5a> </td> <td width=1px bgcolor=#5afa5a> </td> <td width=1px bgcolor=#5afb5a> </td> <td width=1px bgcolor=#5afc5a> </td> <td width=1px bgcolor=#5afd5a> </td> <td width=1px bgcolor=#5afe5a> </td> <td width=1px bgcolor=#5aff5a> </td> </tr></table>
Pythonプログラマの間では、デザインパターンに関する論争が時折生じる。他のオブジェクト指向言語からPythonの世界に入ってきた人には、デザインパターンなしでは生きていけないという人も多い。一方で、パターンを重要視しない言語からPythonの世界に入った人は、デザインパターンはすべてのプログラムがくぎに見える人のためのハンマーにすぎない、と考えている。しかし、いずれにしてもFactoryパターンはさまざまな問題を解決する上で役立つツールであるだろう。
米フォレスター・リサーチ社 シニアアナリスト Jeremiah K.Owyang氏を迎え、同氏が提唱するソーシャルテクノロジーを効果的に活用方法するための方法『POST』を日本で初めて紹介する注目のリアルイベント
- 今日のトップ記事
- 昨日
- 2日前
- 5日前
- 6日前
- 7日前
- ホワイトペーパー
- 話題のタグ
仮想化
Off Topic
Webサービス
Adobe
Linux
Mac OS X
Python
デザイン
プロジェクト管理
Google
Firefox
リファレンス
モバイル
Safari
iPhone 3G
iPhone
レビュー
Internet Explorer
SOA
RIA
iPod touch
脆弱性
PHP
ソフトウェア開発
携帯電話機
Firefox 3
開発環境
UI
ブラウザ
HTML
server
データベース
Tips
Webアプリケーション開発
Windows
仮想化ソフトウェア
Ajax
Java
オープンソース
CSS
プログラミング言語
Database
ユーザーインタフェース
入門
小技
Webデザイン
JavaScript
Mozilla
Flash
Apple
話題のタグを見る »
ソーシャルテクノロジーをビジネスに利用する
Mozilla Labs、Firefoxで地理情報を認識活用できるプラグイン「Geode」を正式発表
DelphiのパフォーマンスをDelphiで改善:エンバカデロの製品戦略
社内政治を生き抜くための教訓10箇条
iPhoneでVoIP--Fringを早速試す
Firefox 3のブックマーク構造を理解しよう
ウェブページの段組みをレイアウトするCSS 3のMulti Column
ラウンドアップ:「優れたUI」を実現するためのアプローチ
MSのバルマー氏、「Windows Cloud」の発表を示唆
ZDNet Japan Green IT
Techno Exchange
これからの時代のセキュリティ対策
エンタメCGM「gooメーカー☆メーカー」
KDDI「SaaSソリューション」
グリーンITの第一歩は見える化です