路傍のプログラマ

只のプログラマが綴る愚痴と備忘録

Python、空のイテレーター その2

2010-02-22 18:31:24 | プログラミング
解答編。

思いついたもので、ちゃんと動くものから順に。

def s1():
 for i in (): yield i

def s2():
 raise StopIteration
 yield # dummy

def s3(): return iter([])

s1は動作としては正しいけど、何となく野暮ったい。

s3はちょっと違う気がします。

なぜなら、s3自体はイテレータではなく、s3がイテレータを返す、という実装だから。この違いは、ちょっとしたきっかけで表面化します。

例えば、yieldを付け足したくなったとき

def s3kai(x):
 if x ....:
  yield 1
  yield 2
 else:
  return iter([])

がエラーになったり。

というわけで、個人的にはs2がいいと思うのですが、まあ気分の問題かも。

Python、空のイテレーター その1

2010-02-19 13:18:36 | プログラミング
空のイテレータを作ろうとしてハマりました。

1つだけアイテムを返すイテレータを作るのは簡単です。
def f(): yield 1
と定義しておけば、
for i in f(): print i
という感じで使えます。

0個のアイテムを返すイテレータが必要になって、はたと困りました。

失敗作を、作ったものから順番に並べると、次のように。

def f(): pass # イテレータではなく普通の関数になってしまう
def f(): yield # Noneを返すイテレータになる
def f(): raise StopIteration # イテレータを返さずに、単に例外を投げる

正解(というか期待通りに動くもの)は次のエントリで。

・・・分かってる人には当たり前だのクラッカー(ご冥福をお祈りします)かもしれませんけれど。

BOF: 設計段階でのミスには対応しきれない

2010-02-11 02:24:06 | Birds-Of-Feather
記事「【トヨタの苦悩】プリウス・リコール問題(上)「極限の燃費」落とし穴」
http://headlines.yahoo.co.jp/hl?a=20100210-00000062-san-bus_all
より。

「今回のプリウスの不具合は、ソフトの設計段階で起きている」

「あるトヨタ幹部は「設計段階でのミスには対応しきれない」と、今の品質管理体制の限界を認めた」

車の機能の大半は実現にソフトウェアを利用してるはずで、その割合は上がりこそすれ、下がることはなさそう。

そのうち、車のイグニッションを回すと「現在ソフトのアップデート中です。しばらくお待ちください」みたいな音声アナウンスが…

というのを想像してしまいました。

メモ: gedit for windows

2010-02-03 22:12:54 | プログラミング
geditのWindows版を見つけたのでメモ。

http://live.gnome.org/Gedit/Windows

そのままではフォントが変なので、[編集]-[設定]の[フォントと色]タブで、MS Gothicに変更。

ファイルの文字コードのデフォルトはUTF8ですが、[ファイル]-[保存]の[エンコーディング]で、[現在のロケール]にすれば、CP932(シフトJIS)でも保存できるようです。

geditにすれば、UbuntuとWindowsでテキストエディタを統一できそう。