2015-10-15 8 views
6

मैं बहुत इस तरह की कुछ कोड [मेरे द्वारा नहीं लिखा] के बारे में उलझन महसूस:कैसे अजगर के उपयोग करने के लिए किसी भी

version = any(func1(), func2()) # wrong, should be any([func1(), func2()]) 

def func1(): 
    if something: 
     return 1 
    else: 
     return None 

def func2(): 
    if something: 
     return 2 
    else: 
     return 3 

version एक संख्या होना चाहिए। जब [func1(), func2()][1, None] है, 1 लौटना चाहिए, जब [None, 2] है, 2, लौट जाना चाहिए जब [1, 2], लौटना चाहिए 1.

तो मुझे लगता है इस कोड में any() उपयोग करने के लिए गलत है, क्योंकि any() सिर्फ True या False लौट आते हैं। अगर मैं इस तर्क को किसी अन्य तरीके से दोबारा जोड़ता हूं, तो मुझे पाइथनर के रूप में एक शानदार तरीका नहीं मिल रहा है।

मैं जानना चाहता हूं कि any() तर्क प्राप्त कर सकता है, अगर नहीं, तो इसे कैसे प्राप्त किया जाए?

+1

क्या आप इस परिदृश्य के बारे में पूछ रहे हैं कि 'किसी भी() 'का उपयोग करने के लिए या कोड के इस टुकड़े को सरल कैसे बनाया जाए? – Nayuki

+0

@NayukiMinase मैं जानना चाहता हूं कि 'कोई()' तर्क प्राप्त कर सकता है, यदि नहीं, तो इसे कैसे प्राप्त किया जाए? –

उत्तर

12

आप बस or का उपयोग कर सकते हैं।

version = func1() or func2() 

सुनिश्चित करें कि उन्हें कॉल करने का प्रयास करने से पहले कार्यों को परिभाषित किया गया है।

यह काम करता है क्योंकि or पहला ट्रू-जैसे मान या अंतिम मान देता है (यदि कोई मान सही नहीं है)। और 'कोई नहीं' को बूलियन संदर्भ में झूठा माना जाता है।

+2

यह एक अच्छा तरीका है, धन्यवाद। –

5

@ आनंदस कुमार का जवाब इष्टतम है। लेकिन अभी आप किसी भी बारे में कुछ जानकारी देने के लिए यदि आप रुचि रखते हैं:

>>> def foo(): 
... return 2 
... 
>>> def boo(): 
... return 3 
... 
>>> def doo(): 
... return 4 
... 
>>> f = [foo, boo, doo] 

>>> any(i() < 3 for i in f) 
True 

अंततः अंदर क्या किसी भी है हो रहा है, तरीकों में से सरणी पर पुनरावृति:

इस उदाहरण लें जे, और इंगित करता है कि प्रत्येक आइटम 3 से कम है, इस मामले में "कोई भी" क्या करेगा, "कोई भी" स्थिति वापस आती है जो उससे मेल खाती है। तो अगर आपको एक झूठा लगता है, तो भी यह सच हो जाएगा।

"सभी" नामक एक और समान विधि है, जो यह सुनिश्चित करेगी कि आपकी परिस्थितियों के आधार पर सभी स्थितियों को पूरा किया जा सके। यहां उदाहरण दिया गया है:

>>> all(i() < 3 for i in f) 
False 

तो, जैसा कि आप देख सकते हैं, क्योंकि एक शर्त विफल हुई, यह गलत हो जाएगी।

4
मनमाना लंबाई मामले के लिए

(जहां स्पष्ट रूप से or चेनिंग मतलब नहीं है), तो आप जब सभी परिणामों के साथ falsy हैं कि पहले truthy मूल्य या किसी दिए गए मान देता है any का एक संस्करण बना सकते हैं:

# If on Py2, you'll want to do this to get shortcircuiting behavior 
from future_builtins import filter 

result = next(filter(None, iterable_to_check), False) # False can be replaced with a chosen default 

filter केवल "सच्चाई" मान उत्पन्न करता है, और दो तर्क next को पहला "सच्चाई" मान मिलता है, या filter पर डिफ़ॉल्ट मान कोई "सत्य" मान नहीं पाता है।

तो iterable_to_check है एक गैर खाली Sequence (बजाय केवल Iterable), आप बिल्कुल श्रृंखलित or रों के व्यवहार से मेल कर सकते हैं ("falsy" परिणाम अंतिम मान, नहीं False या None की तरह एक विशिष्ट मूल्य है) साथ:

result = next(filter(None, sequence_to_check), sequence_to_check[-1]) 

परिणाम के रूप में अंतिम तत्व ("truthy" या "falsy") का उपयोग करने के लिए जब सभी तत्वों "falsy" थे।

स्पष्ट होने के लिए, यदि परीक्षण करने के लिए चीजों का सेट तय और छोटा है, तो आनंद 0 उत्तर प्रति स्पष्ट or जाने का बेहतर तरीका है।

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