我最近为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?
答案 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)]