我认为您的第一个解决方案是明确的,这是python中最重要的事情。或者,用一个生成器代替一个理解如何?
def try_div_itr(itr):
for elem in itr:
try:
yield 1 / elem
except ZeroDivisionError:
pass
result = list(try_div_itr([-2, -1, 0, 1, 2]))
你甚至可以概括一下
def try_itr(func, itr, *exceptions, **kwargs):
for elem in itr:
try:
yield func(elem, **kwargs)
except exceptions:
pass
x = [random.choice([0, 1]) for _ in range(100_000)]
%timeit [i for i in (try_div(i) for i in x) if i is not None]
42.6 ms ± 109 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit [i for i in [try_div(i) for i in x] if i is not None]
36.3 ms ± 154 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit list(try_div_itr(x))
25.3 ms ± 85.1 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit list(try_itr(lambda i: 1/i, x, ZeroDivisionError))
34.7 ms ± 113 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
# but expect generic method to be slower anyway
%timeit list(try_itr((1).__truediv__, x, ZeroDivisionError))
28.7 ms ± 118 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
# remove lambda abstraction for speed