2012-06-09 19 views
8

मैं हाल ही में के लिए ... किसी और अजगर के लिए निम्न उदाहरण दिया है:"मौजूद" कीवर्ड?

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.") 

एक साथी छात्र, ने मुझे बताया इस कार्य को इस तरह स्काला साथ किया जा सकता है कि:

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

कौन सा आलसी मूल्यांकन हो जाता है।

क्या कुछ ऐसा है जो मौजूद है- कीवर्ड पाइथन में मौजूद है? या उसके लिए एक पीईपी है?

+3

के अनुरूप is_prime() को नाम बदल देंगे! आप शायद 'तत्व% 2 == 0' से पहले' तत्व == 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") 

अजगर भी all() जो किसी भी अनुक्रम के माध्यम से क्रैंक और True लौटाता है यदि सभी तत्वों को सच का मूल्यांकन है।

any() और all() दोनों शॉर्ट सर्किट मूल्यांकन है: अगर any() किसी भी तत्व यह सच का मूल्यांकन करता है पाता है, यह बंद हो जाता है और True रिटर्न; और यदि all() कोई तत्व है जो गलत मूल्यांकन करता है, तो यह बंद हो जाता है और False देता है।

दोनों "आलसी" हैं कि वे एक समय में मूल्यों को खींचने के लिए पायथन पुनरावृत्ति का उपयोग करते हैं। उदाहरण के लिए:

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 

पीएस मैं एक पायथन सम्मेलन में एक वार्ता में गया, और स्पीकर ने उल्लेख किया कि वह आमतौर पर any() का उपयोग लूप करने के लिए एक बहुत ही कुशल तरीका के रूप में करता है। एक for लूप प्रत्येक लूप के लिए लूप वैरिएबल को फिर से बांधता है, लेकिन any() ऐसा नहीं करता है; यह सिर्फ मूल्यों की जांच करता रहता है। इसलिए यदि आप any() का उपयोग ऐसे फ़ंक्शन के साथ करते हैं जो हमेशा None या झूठा मान देता है, तो यह अनुक्रम के अंत तक अपने रास्ते को फिर से चालू कर देगा, और उस लड़के के अनुसार, यह पाइथन में ऐसा करने का सबसे तेज़ तरीका है। (और यदि आपका फ़ंक्शन एक मान देता है जो None नहीं है और यह गलत नहीं है, तो आप उसी चाल के लिए all() का उपयोग कर सकते हैं। केवल एक बार यह काम नहीं करता है अगर कभी-कभी फ़ंक्शन एक वास्तविक मान देता है और कभी-कभी यह झूठा देता है । मूल्य लेकिन आप इसे मजबूर कर सकते हैं हमेशा काम करने के लिए:

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

पी पी एस के all()isPrime() के पुनर्लेखन के लिए उपयोग करते हैं मैं पीईपी 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

हाँ, शॉर्ट सर्किट व्यवहार का उपयोग कर '()' एक तार्किक और या तार्किक या ऑपरेटर के साथ कम करने से अधिक बड़ा लाभ है। – steveha

+1

ध्यान दें कि दोनों शॉर्ट सर्किट, अभिव्यक्ति में आलस्य उत्पन्नकर्ता जनरेटर अभिव्यक्ति का उपयोग करके प्रदान की जाती है। –

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

-1 यह आलसी मूल्यांकन नहीं है। – jamylak

+2

यह सिर्फ एक सूची समझ है, शॉर्ट-सर्किट व्यवहार नहीं – shihongzhi

संबंधित मुद्दे