GHZ*_*GHZ 4 python iterator generator
我创建了一个实用程序函数来从生成器表达式返回预期的单个项目
print one(name for name in ('bob','fred') if name=='bob')
Run Code Online (Sandbox Code Playgroud)
这是一个很好的方法吗?
def one(g):
try:
val = g.next()
try:
g.next()
except StopIteration:
return val
else:
raise Exception('Too many values')
except StopIteration:
raise Exception('No values')
Run Code Online (Sandbox Code Playgroud)
Bri*_*ian 21
一个更简单的解决方案是使用元组解包.这已经做了你想要的一切,包括检查它只包含一个项目.
单项:
>>> name, = (name for name in ('bob','fred') if name=='bob')
>>> name
'bob'
Run Code Online (Sandbox Code Playgroud)
过多的物品:
>>> name, = (name for name in ('bob','bob') if name=='bob')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
Run Code Online (Sandbox Code Playgroud)
没有相关产品:
>>> name, = (name for name in ('fred','joe') if name=='bob')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: need more than 0 values to unpack
Run Code Online (Sandbox Code Playgroud)
对于那些使用第三方库或对第三方库感兴趣的人,more_itertools
可以使用本机错误处理来实现这样的工具:
> pip install more_itertools
Run Code Online (Sandbox Code Playgroud)
代码
import more_itertools as mit
mit.one(name for name in ("bob", "fred") if name == "bob")
# 'bob'
mit.one(name for name in ("bob", "fred", "bob") if name == "bob")
# ValueError: ...
mit.one(name for name in () if name == "bob")
# ValueError: ...
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅more_itertools
文档。底层源代码与接受的答案类似。