Python 通过列表迭代函数

Python 通过列表迭代函数,python,function,loops,for-loop,Python,Function,Loops,For Loop,我有一个函数prime(x),如果x是prime,它返回True,如果x是False,它返回False 是否有一种有效的方法来迭代列表,如果所有成员都满足函数,则返回True,否则返回false 对于主要示例,我写道: def primecheck(x): for index in xrange(0,len(x)): if prime(x[index])==False: return False break retu

我有一个函数prime(x),如果x是prime,它返回True,如果x是False,它返回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的函数),而无需每次执行上述操作?或者,即使没有标准方法,还有比遍历列表索引更有效的方法吗?

是的!与生成器表达式一起使用:

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\u all
更容易阅读,但通过一些计时,似乎
primecheck\u longway
实际上更快
primecheck\u 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秒。

您的代码实际上与
所有
的工作方式非常相似。对代码进行一些更改就可以实现这一点

def primecheck(x):
    for i in x:
        if not prime(i):
            return False
    return True
我所做的更改是循环
x
而不是
范围
,并删除不必要的
中断


使用
all
更整洁,但是对于非常古老的Python版本来说,使用长手版本更为有效(非常酷!只有一个建议:不要使用
l
作为标识符,这很容易被一个
1
搞乱。哇。我没想到
all
会慢那么多。