我有一个像这样的for循环的函数
def my_func():
order = [1,2,3,4,5,6,7]
my_list = []
for o in order:
tmp = is_odd(o)
if tmp:
my_list.append(tmp)
return my_list
def is_odd(n):
if n%2 != 0:
return n
else:
return False
我想将它转换为一行python for loop。我这样做了
def my_func():
order = [1,2,3,4,5,6,7]
my_list = [is_odd(o) for o in order if is_odd(o)]
return my_list
def is_odd(n):
if n%2 != 0:
return n
else:
return False
此代码的问题在于它在每次循环迭代中调用is_odd
函数两次。有没有其他方法将循环转换为一个行循环并只调用is_odd
函数一次?
(这不是原始代码。只是一个例子)
答案 0 :(得分:4)
正如问题的答案所述,我已将其与您的问题重复链接:
您将创建一个生成器(或列表),用于生成函数调用的(中间)结果,并根据该结果生成过滤后的输出:
示例:
def my_func():
order = [1,2,3,4,5,6,7]
intermediate_results = (is_odd(o) for o in order)
# alternatively filter using `filter(None, intermediate_results)`
return [i for i in intermediate_results if i]
答案 1 :(得分:1)
在这种情况下,您可以使用filter function.例如。 my_list = filter(is_odd, order)
。
如果您有类似需求,请查看itertools module.
答案 2 :(得分:1)
嗨 - 看起来你为is_odd(o)
的实例返回函数 o
(因此再次运行它),其中函数is_odd(o)
返回true。以下应该只运行一次:
def my_func():
order = [1,2,3,4,5,6,7]
my_list = [o for o in order if is_odd(o)]
return my_list