yieldって何だ

ふーん。PythonのyieldとRubyのyieldって全然意味が違う(はず)なのに、結果的によく似たソースになっているのが面白い。

>>> def f():
	for i in range(10):
		yield i

		
>>> g = f()
>>> g
<generator object at 0x00CB8CD8>
>>> dir(g)
['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__',
 '__init__', '__iter__', '__new__', '__reduce__', '__reduce_ex__',
 '__repr__', '__setattr__', '__str__', 'gi_frame', 'gi_running', 'next']
>>> 

yieldはgeneratorオブジェクトを返します。ここからはあんまり自信ないですが、generatorはイテレータの一種(?)というか、nextメソッドと__iter__メソッドがあればなんでもイテレータなんですよね。

で、あとgeneratorはコンテキストも保持しているのではないかと。gi_frameというのがあやしいですね。

わわ、見つけましたよ。g.gi_frame.f_localsというのがあります。

>>> g.gi_frame.f_locals
{'i': 0}
>>> g.next()
1
>>> g.gi_frame.f_locals
{'i': 1}

ところで、Pythonの勉強は進んでいるといっていいのだろうか、、、