通过列表迭代函数

时间:2013-12-10 05:48:14

标签: python function loops for-loop

我有一个函数prime(x),如果x是素数则返回True,如果x是假,则返回False。

是否有一种有效的方法来遍历列表,如果所有成员都满足该函数,则返回True,否则返回false?

对于最好的例子,我写道:

def primecheck(x):
    for index in xrange(0,len(x)):
        if prime(x[index])==False:
            return False
            break
    return True

但我认为这是效率低下的,必须有更好的方法。

是否有一种标准方法可以通过列表迭代泛型函数(我将泛型函数定义为评估整数或字符串为True或False的东西),而不必每次都执行上述操作?或者即使没有标准方法,有没有比运行列表索引更有效的方法?

2 个答案:

答案 0 :(得分:3)

是的!将all与生成器表达式结合使用:

def primecheck_all(x):
    return all(prime(n) for n in x)

这与执行以下操作大致相同:

def primecheck_longway(x):
    for n in x:
        if not prime(n):
            return False
    return True

做一些时间安排,看起来primecheck_longway实际上更快,尽管primecheck_all更容易阅读。 primecheck_xrange(您的版本)速度最慢:

>>> def prime(n): 
        #simple function so all timing goes to how the list check is done
        return n % 2 == 0

>>> l = range(100)
>>> timeit.timeit(lambda: primecheck_all(l))
1.4247075990295475
>>> timeit.timeit(lambda: primecheck_longway(l))
0.6282418298159413
>>> timeit.timeit(lambda: primecheck_xrange(l))
1.161489160644436

>>> l = range(2,100,2)
>>> timeit.timeit(lambda: primecheck_all(l))
10.058764784981875
>>> timeit.timeit(lambda: primecheck_longway(l))
7.728265179204939
>>> timeit.timeit(lambda: primecheck_xrange(l))
10.481824344034152

这可能是由于不必拥有发电机的开销。对于一百万次迭代,这是一个2.3秒的差异,以便对其进行透视。

答案 1 :(得分:1)

您的代码与all的工作方式非常相似。对代码进行一些更改即可实现此

def primecheck(x):
    for i in x:
        if not prime(i):
            return False
    return True

我改变的只是循环x而不是range,并删除不必要的break

使用all更简洁,但长版本适用于非常旧版本的Python(< 2.5)。