我有以下代码,我想知道我是否可以将其转换为单行for循环?
for a,b in myList :
sth = calcSth(a, b)
if sth > 60 :
return True
return False
另一个问题是:循环的单行和循环的块代码的性能是否存在差异?
答案 0 :(得分:4)
你可以用这个oneliner替换你的整个循环(在一行上使用if
时这真的是一个oneliner吗?):
if any(calcSth(a,b)>60 for a,b in myList): return True
只要any
符合条件, a,b
就会停止测试。
另外,根据您的上一次修改,如果您计划在循环后立即返回False
,如果没有匹配,您可以通过以下方式替换整个例程:
return any(calcSth(a,b)>60 for a,b in myList)
编辑:关于性能,我做了一个快速测试,正如预测的那样,我提供的输入数据any
构造大约快20%(最终有35个项目和匹配条件,类型& #34;最糟糕的情况")。如果匹配条件位于列表的开头,则两个结构之间的差异非常小。
答案 1 :(得分:1)
也许是这样的(修改):
from itertools import starmap
list(filter(lambda x: x > 60, starmap(calcSth, myList))) != []
或者,如果您不想评估完整列表
from itertools import starmap, islice
list(islice(filter(lambda x: x > 60, starmap(calcSth, myList)), 1)) != []
最后一个将在第一个大于60的值之后停止。
答案 2 :(得分:0)
严格来说,我认为没有单行等同于您发布的代码。正如让 - 弗朗索瓦回答的那样,您可以用一行替换循环块,而不是return
。