gpt4 book ai didi

python - 对尝试循环一个空的可迭代对象采取行动的惯用方式

转载 作者:太空狗 更新时间:2023-10-30 00:37:27 29 4
gpt4 key购买 nike

假设我正在遍历一个可迭代对象,并且想在迭代器为空时采取一些行动。我能想到的两种最佳方法是:

for i in iterable:
# do_something
if not iterable:
# do_something_else

empty = True
for i in iterable:
empty = False
# do_something
if empty:
# do_something_else

第一个取决于可迭代对象是一个集合(当可迭代对象被传递到循环所在的函数/方法时无用),第二个在每次通过循环时设置 empty这看起来很难看。

是否还有其他方法是我遗漏的,或者第二种方法是最好的?如果我可以将一些子句添加到循环语句中来为我处理这个问题,那就太好了,就像 else 使 not_found 标志消失一样。


我不是在寻找聪明的技巧。

我不是在寻找涉及大量代码的解决方案

我正在寻找一种简单的语言功能。我正在寻找一种清晰pythonic 的方法来迭代可迭代对象,并在可迭代对象为空时采取一些操作,任何有经验的 python 程序员都会理解。如果我能在每次迭代时不设置标志的情况下做到这一点,那就太棒了。如果没有简单的成语可以做到这一点,那就别管它了。

最佳答案

我认为这是最简洁的方法:

# first try with exceptions
def nonempty( iter ):
""" returns `iter` if iter is not empty, else raises TypeError """
try:
first = next(iter)
except StopIteration:
raise TypeError("Emtpy Iterator")
yield first
for item in iter:
yield item


# a version without exceptions. Seems nicer:
def isempty( iter ):
""" returns `(True, ())` if `iter` if is empty else `(False, iter)`
Don't use the original iterator! """
try:
first = next(iter)
except StopIteration:
return True, ()
else:
def iterator():
yield first
for item in iter:
yield item
return False, iterator()



for x in ([],[1]):
# first version
try:
list(nonempty(iter(x))) # trying to consume a empty iterator raises
except TypeError:
print x, "is empty"
else:
print x, "is not empty"

# with isempty
empty, it = isempty(iter(x))
print x, "is", ("empty" if empty else "not empty")

关于python - 对尝试循环一个空的可迭代对象采取行动的惯用方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3486257/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com