2012-05-24 14 views
5

मैं अजगरगोता असफल

उदाहरण 4.18 में गोता से इस विशिष्ट उदाहरण पर अटक कर रहा हूँ। और-या चाल विफल

>>>>a = "" 
>>>>b = "second" 
>>>1 and a or b 
>>>>'second' 

के बाद से एक एक रिक्त स्ट्रिंग है, जो अजगर एक बूलियन संदर्भ में झूठी समझता है, 1 और '' evalutes लिए ', और फिर' 'या' दूसरा 'है जब 'दूसरे' के लिए evalutes। ऊप्स! यही वह नहीं है जो आप चाहते थे। एंड-या चाल, बूल और ए या बी, सी अभिव्यक्ति बूल की तरह काम नहीं करेंगे? ए: बी जब बूलियन संदर्भ में गलत है।

ऐसा क्यों कहता है कि यह उपयोगकर्ता नहीं चाहता है, मेरा मतलब है 1 और "" गलत मूल्यांकन करेगा, जबकि "" बी "का मूल्यांकन करेगा," "या बी" का मूल्यांकन करेगा, यह बिल्कुल सही है, मैं नहीं करता हूं, समझ में नहीं आता क्यों गलत है? क्या मुझे कुछ याद आ रही है?

उत्तर

4

नहीं, आप कुछ याद नहीं कर रहे हैं।

expr if cond else expr इनलाइन सशर्त पाइथन 2.5 को PEP 308 में पेश किया गया था; उससे पहले, सशर्त, पूर्ण रूप

if cond: 
    expr 
else: 
    expr 

हालांकि की होना ही था, लोगों को देखा है कि expr and cond or expr तरह-की एक इनलाइन के रूप में काम सशर्त, जब तक कि पहले भाव का मूल्यांकन करने के लिए हुआ सच बूलियन करने के लिए। चूंकि पाइथन में अधिकांश चीजें सच होती हैं, इसलिए यह वाक्यविन्यास आम तौर पर काम करने के लिए होता है - और फिर, निश्चित रूप से, कभी-कभी असफल हो जाता है। यह वास्तव में "उचित" इनलाइन सशर्त जोड़ने के लिए प्रेरणा थी।

2

"और-चाल" का उपयोग टर्नरी सशर्त ऑपरेटर, condition ? if-true : if-false या इसी तरह के अनुकरण के लिए किया गया था। चूंकि 1 बूलियन संदर्भ में True के समतुल्य है, इसलिए अभिव्यक्ति a, b नहीं होने की उम्मीद है। तो, सबक है, उपयोग नहीं करते हैं और-या चाल। अजगर 2.5 के बाद से त्रिगुट सशर्त है: अजगर में

true if condition else false 
+0

धन्यवाद। मैंने सोचा कि कुछ और है जिसे मैं समझ नहीं पा रहा हूं। –

2

गोता एक अच्छा ट्यूटोरियल और should not be followed नहीं है


x and y or z अभिव्यक्ति से पहले अजगर एक उचित त्रिगुट अभिव्यक्ति (y if x else z) था इस्तेमाल किया गया था। यह खंड कह रहा है कि यदि आप सी 0 के x ? y : z की तरह व्यवहार करने की अपेक्षा करते हैं तो यह आपको आश्चर्यचकित क्यों कर सकता है।


python wiki. पर ट्यूटोरियल है कि आप की तारीख संसाधन पर निर्भर एक और अधिक दे सकता है की एक सूची नहीं है।

+0

अच्छा zed shaw rant। – gary

+0

मुझे तब क्या करना चाहिए ?, मैंने सोचा कि पाइथन में गोताखोरी उदाहरण के रूप में पर्याप्त होनी चाहिए। मुझे सिंटैक्स के बारे में पता है, मैं उदाहरण के लिए खोज रहा था कि पाइथन –

+0

@ कार्टिक के साथ चीजों को बेहतर कैसे किया जा सकता है: मेरे उत्तर में लिंक है "लर्निंग पायथन" अनुभाग के तहत कई विकल्प (जहां आप देख सकते हैं कि डीआईपी किसी भी रूप में मौजूद नहीं है।) – Daenyth

0

क्यों यह कहना है कि वह नहीं उपयोगकर्ता क्या चाहता है करता है, मेरा मतलब है 1 और "" , गलत पर मूल्यांकन करेगा, जबकि "" या ख के लिए "दूसरी" का मूल्यांकन करेंगे, कि है पूरी तरह से क्या होना चाहिए, मुझे समझ में नहीं आता कि यह गलत क्यों है? क्या मैं कुछ खो रहा हूं?

मुझे लगता है कि इस सवाल का हिस्सा अनदेखा किया जा रहा है। condition and if-true or if-false अन्य भाषाओं 'condition ? if-true : if-false या बाद के संस्करणों' if-true if condition else if-false की नकल करने के लिए, अन्य उत्तरों में समझाया गया संस्करणों 2.5 में उपयोग किया गया एक चाल है।

इसके साथ समस्या यह है कि अगर if-true एक वस्तु है कि झूठी ("", [], (), False या 0), तो यह विफल हो जाएगा, के रूप में उम्मीद है जब आप मूल्यांकन को देखो, लेकिन जिसमें रेंगना सकता है का आकलन करती है if-true गतिशील रूप से सेट है और गलत पर मूल्यांकन कर सकते हैं के रूप में एक बग के रूप में।

condition and a or b के भोलेपन से अपेक्षित परिणाम, a ("", रिक्त स्ट्रिंग) की सामग्री के रूप में किया गया है हालत (1) true का आकलन करती है, लेकिन के रूप में 1 and afalse का आकलन करती है ताकि आप b की सामग्री को मिलेगा।

इस समस्या का समाधान या तो पायथन 2.5+ वाक्यविन्यास (if-true if condition else if-false) का उपयोग करना है या यह सुनिश्चित करना है कि if-true कभी झूठा नहीं है। एक तरह से दूसरे को पूरा करने के if-true और एक टपल या सूची में if-false पैक करने के लिए, एक अरिक्त iterable हमेशा सच है के रूप में है:

>>> a = "" 
>>> b = "second" 
>>> condition = 1 
>>> condition and a or b 
'second' 

>>> condition and [a] or [b] 
[''] 

>>> (condition and [a] or [b])[0] 
'' 

यह बदसूरत समाधान का एक प्रकार है, लेकिन अगर आप पुराने वर्शन को लक्ष्य करने की जरूरत है यह नहीं है पायथन का।

+0

वास्तव में जो आपने कहा है वह पुस्तक में पहले से ही दिया गया है, और मेरा सवाल यह नहीं है कि बग को कैसे सुधारें, मेरा सवाल यह है कि लेखक क्यों कहते हैं "यह उपयोगकर्ता की अपेक्षा नहीं है" .असल आपने अपने उत्तर के पहले भाग में अपने प्रश्न का उत्तर दिया, कोड और धन्यवाद की कोई आवश्यकता नहीं थी :) –

+0

@ कार्टिकअनंद: निश्चित रूप से, मैं बस चाहता था यह सुनिश्चित करने के लिए कि अगर किसी को भविष्य में यह प्रश्न मिल जाए, तो उनके पास पूर्ण संदर्भ होगा :) – voyager

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