2012-06-09 22 views
8

我最近做了如下例子爲蟒蛇的...其他:Python中的「存在」關鍵字?

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中是否存在類似存在關鍵字的存在?或者是否有PEP?

+3

!你可能 希望在元素%2 == 0之前檢查'element == 2';當前者爲真時,後者總是如此。 – icktoofay

+0

謝謝,我已經糾正它。但是,這只是一個例子,可以用來製作一個場景。 –

回答

21
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;如果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()作爲一個循環的高效方式。 A for循環會重新綁定每個循環的循環變量,但any()不會這樣做;它只是不斷檢查值。因此,如果您使用any()的函數始終返回None或者一個錯誤的值,那麼它會遍歷整個序列的末尾,根據那個人,這是Python中最快的方法。 (如果你的函數返回的值不是None而且不是假的,你可以使用all()作爲同一個技巧。唯一不工作的時候是有時函數返回一個真值,有時它返回一個假。值,但你可以迫使它始終工作:

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

PPS讓我們用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

我沒有意識到「任何」和「全部」都是短路的!大。 – weronika

+0

是的,短路行爲與使用邏輯AND或邏輯OR運算符的reduce()相比具有很大的優勢。 – steveha

+1

請注意,雖然都是短路,但表達式中的懶惰是通過使用生成器表達式提供的。 –

-1
[x for x in myList if isPrime(x)] 
+5

-1這不是懶惰評估。 – jamylak

+2

這只是一個列表理解,而不是短路行爲 – shihongzhi