gpt4 book ai didi

python - 有没有更优雅的方法来过滤函数的失败结果?

转载 作者:太空狗 更新时间:2023-10-29 21:23:19 25 4
gpt4 key购买 nike

现在我的代码中有一些东西看起来像这样:

def f(x):
if x == 5:
raise ValueError
else:
return 2 * x

interesting_values = range(10)
result = []
for i in interesting_values:
try:
result.append(f(i))
except ValueError:
pass

f 实际上是一个更复杂的函数,它以不可预测的方式针对特定值失败(我不知道 f(x) 之前是否会失败尝试一下)。

我感兴趣的是这个result:f的所有有效结果的列表。

我想知道是否有办法使第二部分像列表理解一样。当然我不能简单地这样做:

def f(x):
if x == 5:
raise ValueError
else:
return 2 * x

interesting_values = range(10)
result = [f(i) for i in interesting_values]

因为对 f(5) 的调用会使一切都失败,但也许有一种方法可以将 try-except 结构集成到列表理解中。是这样吗?

编辑:我可以控制 f。

最佳答案

看起来您可以控制 f 并且可以修改它处理错误的方式。

如果是这种情况,并且 None 不是该函数的有效输出,我会让它在出错时返回 None 而不是抛出:

def f(x):
if x == 5: return None
else: return 2*x

然后过滤:

results = (f(x) for x in interesting_values) # A generator expression; almost a list comptehension

valid_results = filter(lambda x: x is not None, results)

这是通常称为“可选模式”的精简版。返回错误时的特殊标记值(在本例中为 None),否则返回有效值。通常 Optional 类型是一种特殊类型,而 sentinal 值是该类型(或类似的东西)的子类,但这在这里不是必需的。

关于python - 有没有更优雅的方法来过滤函数的失败结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56049253/

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