2013-07-22 2 views
12

का उपयोग करके पाइथन असाइनमेंट और फ़ंक्शन का परीक्षण मैंने इस तरह के प्रश्न देखे हैं लेकिन काफी समान नहीं हैं। मेरे पास एक अभिव्यक्ति हैएलिफ

if foo == .... 
    return -1 
elif myFunction(bar) != -1: 
    return myFunction(bar) 
elif ... 

मैं दो बार myFunction(bar) की गणना नहीं करना चाहता हूं। यदि यह बस एक if थे, मैं

temp = myFunction(bar) 
if temp != -1 
    return temp 

कर सकता है हालांकि एक elif के साथ ऐसा करने temp के अनावश्यक गणना में परिणाम होगा अगर हम intitial if पालन करने के लिए थे।

मैं एक

if ... 
else 
    temp = myFunction(bar) 
    if temp != -1: 
    return temp 
    elif ... 

का उपयोग कर एक समाधान देख सकते हैं लेकिन यह अब और अधिक बदसूरत बनने के लिए शुरू होता है। क्या इसे पूरा करने का कोई बेहतर तरीका है?

+0

आप 'कॉल करने के लिए myfunction (बार)' दो बार और अगर आप केवल कर सकते हैं नहीं करना चाहते हैं/अपने 'foo' को जांचने के बाद इसे कॉल करना चाहते हैं, फिर परिणाम को स्टोर करने के लिए इंटरमीडिएट वैरिएबल का उपयोग करने का कोई दूसरा तरीका नहीं है। इस मूल तार्किक समस्या को पाने के लिए कोई जादू नहीं है :-)। मुझे लगता है कि एक समाधान बदसूरत नहीं है जब यह सही तर्क को दर्शाता है। आपको बस सावधान रहना होगा कि अंतिम 'एलिफ' कहां रखा जाए। –

+2

लेकिन 'if' (कम से कम उदाहरण में) में' वापसी 'है, तो आप * अस्थायी मान का उपयोग कर सकते हैं और एक नया' if' ब्लॉक शुरू कर सकते हैं। – Volatility

उत्तर

6

यदि आप ऐसा करते हैं, तो यह memoizing decorator के आसपास भुगतान कर सकता है। केवल memoizer मानक पुस्तकालय (नए अजगर 3.x के लिए) में है कि lru_cache, जो overkill है, लेकिन सामान्य विचार पता चलता है:

>>> def func(): 
...  print("foo") 
...  return 1 
... 
>>> if func(): 
...  print(func()) 
...  
foo 
foo 
1 

अब memoize func:

>>> from functools import lru_cache 
>>> func = lru_cache(1)(func) 
>>> if func(): 
... print(func()) 
...  
foo 
1 
+0

+1, मुझे इसे हराया और पहिया को पुनर्निर्मित नहीं किया। –

+0

"यदि आप इसे बहुत करते हैं" तो यहां महत्वपूर्ण बिंदु है।अन्यथा पूरा दृष्टिकोण सिर्फ ओटीटी है। –

1

हैं आपका फ़ंक्शन कॉल काफी आसान है, आप दो बार कॉल करने के साथ जा सकते हैं। पाइथन को असाइन करने और सुविधा की तुलना करने के लिए समर्थन नहीं है। तो, आपको प्रदर्शन के साथ पठनीयता/लालित्य का व्यापार करना होगा।

5

यदि आप दो बार मेरा फ़ंक्शन (बार) नहीं कॉल करना चाहते हैं तो परिणाम को स्टोर करने के लिए इंटरमीडिएट वैरिएबल का उपयोग करने का कोई दूसरा तरीका नहीं है। यहां लोग जटिल कैशिंग समाधान का प्रस्ताव देना शुरू कर देते हैं। यह चरम मामलों में बहुत सुविधाजनक हो सकता है, लेकिन ऐसा करने से पहले, आइए बुनियादी बातों पर थोड़ा सा वापस आ जाएं। आपको इस तथ्य का उचित उपयोग करना चाहिए कि आप अपने सशर्त ब्लॉक के भीतर से वापस लौटना चाहते हैं। इन स्थितियों में आप कई else एस बचा सकते हैं। क्या अब मूल रूप से इस प्रकार उचित खरोज के साथ अपने प्रश्न से कोड ब्लॉक है, लेकिन डॉट्स के बिना, है, और PEP8 के अनुसार नाम के साथ:

if foo == "bar" 
    return -1 
elif myfunction(bar) != -1: 
    return myfunction(bar) 
else 
    return None 

यह आसानी से बदला जा सकता है:

if foo == "bar" 
    return -1 
t = myfunction(bar) 
if t != -1: 
    return t 
return None 
जैसा कि पहले ही

एक और जवाब में कहा गया है, यदि आप अपने कोड के प्रदर्शन को प्रभावित नहीं करते हैं तो आप अपने फ़ंक्शन को दो बार कॉल कर सकते हैं। परिणाम के रूप में सरल रूप में

if foo == "bar" 
    return -1 
if myfunction(bar) != -1: 
    return myfunction(bar) 
return None 
0

आप भी एक समारोह promise इस तरह बना सकते हैं दिखेगा:

class Promise(): 
    def __init__(self, func): 
     self.__func = func; 
     self.__computed = False; 

    def Get(self): 
     if not self.__computed: 
      self.__result = self.__func() 
      self.__computed = True 
     return self.__result 

def func(text): 
    print text 
    return 1 

    f = Promise(lambda: func("compute")) 
    >>> f.Get()  # first call, compute 
    compute 
    1 
    >>> f.Get()  # second call, return result 
    1