eco*_*coe 6 python indexing yield generator python-2.7
我以为我可以通过直接访问传递给生成器的值的索引来使我的python(2.7.10)代码更简单send
,并且对代码运行感到惊讶.然后我发现应用的索引yield
并没有真正做任何事情,也没有抛出异常:
def gen1():
t = yield[0]
assert t
yield False
g = gen1()
next(g)
g.send('char_str')
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试索引yield
三次或更多,我得到一个例外:
def gen1():
t = yield[0][0][0]
assert t
yield False
g = gen1()
next(g)
g.send('char_str')
Run Code Online (Sandbox Code Playgroud)
哪个扔了
TypeError: 'int' object has no attribute '__getitem__'
Run Code Online (Sandbox Code Playgroud)
这是异常不一致的行为,我想知道是否有一个直观的解释,索引产量实际上是做什么的?
Mar*_*ers 13
你没有索引.你正在产生一个清单; 表达式yield[0]
实际上与以下相同(但没有变量):
lst = [0]
yield lst
Run Code Online (Sandbox Code Playgroud)
如果你查看next()
返回的内容,你就会得到该列表:
>>> def gen1():
... t = yield[0]
... assert t
... yield False
...
>>> g = gen1()
>>> next(g)
[0]
Run Code Online (Sandbox Code Playgroud)
你不需要有有之间的空间yield
和[0]
,这就是全部.
尝试将订阅应用于包含的0
整数会导致异常:
>>> [0] # list with one element, the int value 0
[0]
>>> [0][0] # indexing the first element, so 0
0
>>> [0][0][0] # trying to index the 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not subscriptable
Run Code Online (Sandbox Code Playgroud)
如果要索引发送到生成器的值,请在表达式周围加上括号yield
:
t = (yield)[0]
Run Code Online (Sandbox Code Playgroud)
演示:
>>> def gen1():
... t = (yield)[0]
... print 'Received: {!r}'.format(t)
... yield False
...
>>> g = gen1()
>>> next(g)
>>> g.send('foo')
Received: 'f'
False
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
101 次 |
最近记录: |