क्या अजगर के मेमने में "अगर" प्रदर्शन करने का एक तरीका है


358

में अजगर 2.6 , मैं क्या करना चाहते हैं:

f = lambda x: if x==2 print x else raise Exception()
f(2) #should print "2"
f(3) #should throw an exception

यह स्पष्ट रूप से वाक्यविन्यास नहीं है। यह एक प्रदर्शन करने के लिए संभव है ifमें lambdaऔर यदि ऐसा है तो यह कैसे करना है?

धन्यवाद


2
आप लैम्बडा में प्रिंट या बढ़ा नहीं सकते हैं। लैंबडास केवल फ़ंक्शन हैं, आप इसके बजाय एक फ़ंक्शन का उपयोग कर सकते हैं।
लेन्नर्ट रेगेब्र

10
मैं आप से असहमत हूं। मुझे 4 अलग-अलग, बहुत छोटे कार्यों की आवश्यकता है जैसे कि ऊपर दिए गए एक सूची / शब्दकोश में डालने की आवश्यकता है ताकि मैं उन पर पुनरावृत्त कर सकूं और प्रत्येक पुनरावृत्ति में कौन से उपयोग करूं। केवल inits के कोड की कई पंक्तियों के बजाय, पुनरावृत्ति से पहले, खुद को मैं init कोड की केवल 4 पंक्तियों तक नीचे ला सकता हूं। कम मर्जर ..
लड़के

5
कोड की 4 लाइनें एक प्रशंसनीय समाधान नहीं है जब अन्य लोगों को कोड को पढ़ना, व्याख्या करना, समझना और बनाए रखना है। इसके अलावा, उदाहरण में "प्रिंट / बढ़ाएँ" समस्या यह दर्शाती है कि लैम्ब्डा में ऐसा नहीं किया जा सकता है और नहीं किया जाना चाहिए।
२.१२

@LennartRegebro लंबोदर अजगर में कार्य नहीं हैं, वे केवल अभिव्यक्ति हैं, यही कारण है कि कई चीजें हैं जो आप उनके साथ नहीं कर सकते हैं।
एरॉन मैकमिलिन

1
@AaronMcMillin लम्बदा फंक्शन हैं। वे सिंटैक्स कारणों से अभिव्यक्तियों तक सीमित हैं, लेकिन वे कार्य हैं।
लेन्नर्ट रेगेब्र

जवाबों:


660

आप जिस वाक्य-विन्यास की तलाश कर रहे हैं:

lambda x: True if x % 2 == 0 else False

लेकिन आप उपयोग नहीं कर सकते printया raiseएक लैम्ब्डा में।


33
अजगर 3 में, आप
पुनरावर्ती

11
ज़रूर, लेकिन सवाल था "मैं ifएक मेमने में कैसे उपयोग करूं ?" नहीं "लैम्बडा लिखने का सबसे अच्छा तरीका क्या है जो एक नंबर भी है तो सही है?"
रॉबर्ट रॉसनी

99
यह एक भयानक वाक्यविन्यास है - आसानी से सबसे खराब पायथन भाषा का निर्माण, अपने आउट-ऑफ-ऑर्डर मूल्यांकन में बेरुखी के पर्ल स्तरों के करीब - लेकिन यह वही है जो पूछा गया था। आप सही होने के लिए गंभीरता से जवाब दे रहे हैं?
ग्लेन मेनार्ड

41
यह प्रश्न का सही उत्तर है "मैं एक लंबो फ़ंक्शन कैसे लिखता हूं जो मुझे बताता है कि क्या कोई संख्या समान है?" हालांकि, यह इस सवाल का सही जवाब नहीं है कि ओपी ने मूल रूप से क्या पूछा। हालांकि बहुत आप उदाहरण मैं काल्पनिक की तरह, मेरी पोस्ट नहीं है करता है , वास्तव में, स्पष्ट रूप से ओ पी के सवाल का जवाब।
रॉबर्ट रोसनी

10
यह स्पष्ट रूप से स्पष्ट है कि कोई भी "x% 2 == 0" का सुझाव दे रहा है - या एक टिप्पणी को मतदान करने की सिफारिश कर रहा है, जो कम से कम सात लोगों को बनाता है - मूल प्रश्न भी नहीं पढ़ा।
ग्लेन मेनार्ड

40

आप सिर्फ एक फ़ंक्शन को क्यों नहीं परिभाषित करते हैं?

def f(x):
    if x == 2:
        print(x)
    else:
        raise ValueError

वास्तव में इस मामले में लंबोदर का उपयोग करने का कोई औचित्य नहीं है।


3
print2.6 में एक समारोह नहीं है। :)
लुकास लालकिंसी

7
@ लुकास लालिन्स्की: यह अभी भी 2.x में काम करता है। इसे निरर्थक कोष्ठकों की एक जोड़ी के रूप में माना जाएगा
newacct

24
आप उसके वास्तविक उपयोग के मामले को नहीं जानते हैं, इसलिए कोई तरीका नहीं है जिससे आप कह सकते हैं कि लैम्ब्डा का उपयोग करने का कोई कारण नहीं है।
ग्लेन मेनार्ड

6
@ ग्लेन मेनार्ड: लैम्बडा, अवधि का उपयोग करने का लगभग कोई कारण नहीं है। लैम्बडा को एक वैरिएबल में असाइन करना - एक स्टैंड-इन के रूप में def- आम तौर पर एक बहुत खराब आइडिया (tm) है। बस एक defमात्र का उपयोग करें नश्वर प्रोग्रामर इसे पढ़ सकते हैं, व्याख्या कर सकते हैं, समझ सकते हैं और इसे बनाए रख सकते हैं।
एस.लॉट

17
लैम्ब्डा के बहुत सारे वैध उपयोग हैं। यदि आप किसी के बारे में नहीं सोच सकते हैं, तो यह लंबोदर की गलती नहीं है। (मैं स्वयं वाक्य रचना का प्रशंसक नहीं हूँ, निश्चित रूप से - यह इस तथ्य के लिए एक अनाड़ी काम है कि पायथन की खराब-कल्पना इंडेंटेशन सिंटैक्स सामान्य भाषाओं की तरह इनलाइन कार्यों को संभाल नहीं सकता है।)
ग्लेन मेयोनेज़

25

संभवत: सबसे खराब अजगर लाइन जो मैंने अब तक लिखी है:

f = lambda x: sys.stdout.write(["2\n",][2*(x==2)-2])

यदि x == 2 आप प्रिंट करते हैं,

अगर x! = 2 आप बढ़ाते हैं।


यश, मुझे लगता है कि यह पृष्ठ का एकमात्र उत्तर है जो वास्तव में प्रश्न का उत्तर देता है
एप्सिलॉन

22

आप आसानी से एक लैम्ब्डा में एक अपवाद उठा सकते हैं, अगर यह वही है जो आप वास्तव में करना चाहते हैं।

def Raise(exception):
    raise exception
x = lambda y: 1 if y < 2 else Raise(ValueError("invalid value"))

यह एक अच्छा विचार है? सामान्य रूप से मेरी वृत्ति लैम्ब्डा से बाहर रिपोर्टिंग की त्रुटि को छोड़ना है; इसे कोई भी मान न दें और कॉलर में त्रुटि को बढ़ाएं। मुझे नहीं लगता कि यह स्वाभाविक रूप से बुराई है, हालांकि - मैं "y इफ़ एक्स ज़ेड" सिंटैक्स को खुद से भी बदतर मानता है - बस सुनिश्चित करें कि आप एक लैम्ब्डा शरीर में बहुत अधिक सामान बनाने की कोशिश नहीं कर रहे हैं।


1
यदि आप मुझसे पूछते हैं, तो कॉलगर्ल में इसे उठाना शायद प्रीतिकर तरीका है।
डोमिनिक बाउ-समरा

संभवतः, लेकिन यह विशेष रूप से मामले पर बहुत अधिक निर्भर करता है। बेशक, आप इसे बनाने के बाद मेमने को भी सजा सकते हैं। x = RaiseValueErrorOnNone(x)मामले पर निर्भर करता है।
ग्लेन मेनार्ड

15

पायथन में लैम्ब्डा आप का उपयोग करने की अनुमति के संबंध में काफी प्रतिबंधात्मक हैं। विशेष रूप से, आप (सिवाय ऑपरेटरों की तरह के लिए कोई भी कीवर्ड नहीं कर सकते हैं and, not, orउनके शरीर में, आदि)।

इसलिए, ऐसा कोई तरीका नहीं है कि आप अपने उदाहरण के लिए एक लैम्ब्डा का उपयोग कर सकें (क्योंकि आप उपयोग नहीं कर सकते हैं raise), लेकिन यदि आप उस पर सहमत होने के लिए तैयार हैं ... तो आप उपयोग कर सकते हैं:

f = lambda x: x == 2 and x or None

16
लैम्ब्डा का विशिष्ट प्रतिबंध यह है कि आपको केवल कथन का उपयोग करने की अनुमति नहीं है।
डैनियल वर्नर

13

ध्यान दें कि आप कई और का उपयोग कर सकते हैं ... यदि आपके लैम्ब्डा परिभाषा में कथन:

f = lambda x: 1 if x>0 else 0 if x ==0 else -1

2

यदि आप अभी भी प्रिंट करना चाहते हैं तो आप भविष्य के मॉड्यूल को आयात कर सकते हैं

from __future__ import print_function

f = lambda x: print(x) if x%2 == 0 else False

2

आप कंडिशनल जैसे कुछ करने के लिए लॉजिकल ऑपरेटर्स का भी उपयोग कर सकते हैं

func = lambda element: (expression and DoSomething) or DoSomethingIfExpressionIsFalse

आप यहां लॉजिकल ऑपरेटर्स के बारे में अधिक देख सकते हैं


यह स्पष्टता के संदर्भ में अजगर के दर्शन के साथ नहीं जाता है। तार्किक रूप से समतुल्य होने के बावजूद, ifवाक्यविन्यास हमेशा इस पर पसंद किया जाता है। स्थितियों की जाँच का स्पष्ट तरीका।
0xc0de

धन्यवाद! मैंने कॉलेज में कार्यात्मक भाषा के काम में इसका उपयोग प्रतिबंधों की वजह से किया है जो प्रोफेसर ने कहा है कि मैं ifबयान का उपयोग नहीं कर सकता , इसलिए मुझे यह स्पष्ट नहीं लगा
विक्टर लुकास

2

आपको वास्तव में क्या चाहिए

def fun():
    raise Exception()
f = lambda x:print x if x==2 else fun()

अब फ़ंक्शन को उस तरीके से कॉल करें जिस तरह से आपको ज़रूरत है

f(2)
f(3)


0

निम्नलिखित नमूना कोड मेरे लिए काम करता है। यकीन नहीं होता कि यह सीधे इस सवाल से संबंधित है, लेकिन आशा है कि यह कुछ अन्य मामलों में मदद करता है।

a = ''.join(map(lambda x: str(x*2) if x%2==0 else "", range(10)))


0

यदि लैंबडा में इफ का प्रदर्शन करने का एक आसान तरीका सूची समझ का उपयोग करना है।

आप लैम्ब्डा में एक अपवाद नहीं बढ़ा सकते हैं, लेकिन यह पायथन 3.x में एक तरीका है जो आपके उदाहरण के करीब है:

f = lambda x: print(x) if x==2 else print("exception")

एक और उदाहरण:

1 वापस करें यदि एम अन्यथा 0

f = lambda x: 1 if x=="M" else 0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.