Python中的“exists”关键字?

时间:2012-06-09 06:14:32

标签: python

我最近为Pythons做了以下示例... else:

def isPrime(element):
    """ just a helper function! don't get religious about it! """
    if element == 2:
        return True
    elif element <= 1 or element % 2 == 0:
        return False
    else:
        for i in xrange(3, element, 2):
            print i
            if element % i == 0:
                return False
    return True


myList = [4, 4, 9, 12]

for element in myList:
    if isPrime(element):
        break
else:
    print("The list did not contain a prime.")

一位同学告诉我,这个任务可以用Scala完成:

List(4, 4, 9, 12) exists isPrime

哪个得到懒惰评估。

Python中是否存在类似exists-keyword的类似内容?或者是否有PEP?

2 个答案:

答案 0 :(得分:22)

myList = [4, 4, 9, 12]

if not any(isPrime(x) for x in myList):
    print("The list did not contain a prime")

Python也有all(),如果所有元素的值都为真,那么它会通过任何序列并返回True

any()all()都有短路评估:如果any()找到任何评估为true的元素,它会停止并返回True;如果all()找到任何评估为false的元素,它将停止并返回False

两者都“懒惰”,因为他们使用Python迭代一次拉取一个值。例如:

import random
def rand_sequence(n_max):
    while True:
        next_random = random.randint(0, n_max)
        print(next_random)
        yield next_random

all(isPrime(x) for x in rand_sequence(20))

这将迭代直到找到非素数,然后返回False。它会将数字打印为副作用,以便您可以观看它的工作情况。我刚试了这个并得到了:

17
3
0

P.S。我在Python会议上进行了一次演讲,发言者提到他通常使用any()作为一种非常有效的循环方式。 for循环为每个循环重新绑定循环变量,但any()不会这样做;它只是不断检查值。因此,如果你将any()与一个总是返回None的函数或一个假值一起使用,那么它将迭代它的方式到序列的末尾,并且根据那个人,它是Python中最快的方法去做吧。 (如果你的函数返回的值不是None并且不是false,你可以使用all()来获得同样的技巧。唯一不行的是有时函数返回一个真值,有时它会返回一个假值。但是你可以强迫它始终有效:

any(my_function(x) and False for x in sequence)

P.P.S。我们使用all()重写isPrime()!我会将名称更改为is_prime()以符合PEP 8. http://www.python.org/dev/peps/pep-0008/

def is_prime(element):
    """ just a helper function! don't get religious about it! """
    if element == 2:
        return True
    elif element <= 1 or element % 2 == 0:
        return False
    else:
        return all(element % i for i in xrange(3, element, 2))

答案 1 :(得分:-1)

[x for x in myList if isPrime(x)]