目前我这样做:
try:
something = iterator.next()
# ...
except StopIteration:
# ...
Run Code Online (Sandbox Code Playgroud)
但我想要一个表达式,我可以放在一个简单的if陈述中.是否有任何内置功能可以使这些代码看起来不那么笨拙?
any()False如果iterable为空,则返回,但如果不是,则可能会迭代所有项.我只需要它来检查第一项.
有人问我要做什么.我编写了一个执行SQL查询并生成结果的函数.有时当我调用此函数时,我只想知道查询是否返回任何内容并根据它做出决定.
Joc*_*zel 125
any如果它是真的,它将不会超越第一个元素.如果迭代器产生错误,你可以写any(True for _ in iterator).
Ale*_*lli 35
在Python 2.6+中,如果name sentinel绑定到迭代器不可能产生的值,
if next(iterator, sentinel) is sentinel:
print('iterator was empty')
Run Code Online (Sandbox Code Playgroud)
如果您不知道迭代器可能会产生什么,请创建自己的标记(例如,在模块的顶部)
sentinel = object()
Run Code Online (Sandbox Code Playgroud)
否则,您可以在sentinel角色中使用您"知道"(基于应用程序注意事项)迭代器无法产生的任何值.
Mat*_*hen 19
这不是很清晰,但它显示了一种无损地将其打包到函数中的方法:
def has_elements(iter):
from itertools import tee
iter, any_check = tee(iter)
try:
any_check.next()
return True, iter
except StopIteration:
return False, iter
has_el, iter = has_elements(iter)
if has_el:
# not empty
Run Code Online (Sandbox Code Playgroud)
这不是真正的pythonic,对于特定情况,可能有更好(但不太通用)的解决方案,如下一个默认.
first = next(iter, None)
if first:
# Do something
Run Code Online (Sandbox Code Playgroud)
这不是通用的,因为None可以是许多迭代中的有效元素.
最好的方法是使用peekablefrom more_itertools。
from more_itertools import peekable
iterator = peekable(iterator)
if iterator:
# Iterator is non-empty.
else:
# Iterator is empty.
Run Code Online (Sandbox Code Playgroud)
请注意,如果您保留对旧迭代器的引用,则该迭代器将变得先进。从那时起,您必须使用新的 peekable 迭代器。但是,确实,peekable 期望是修改旧迭代器的唯一代码,因此无论如何您都不应该保留对旧迭代器的引用。
您可以使用:
if zip([None], iterator):
# ...
else:
# ...
Run Code Online (Sandbox Code Playgroud)
但对于代码阅读器来说,它有点无法解释
关于什么:
In [1]: i=iter([])
In [2]: bool(next(i,False))
Out[2]: False
In [3]: i=iter([1])
In [4]: bool(next(i,False))
Out[4]: True
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
34827 次 |
| 最近记录: |