2013-10-06 6 views
17

मैं रेखा के अर्थ समझ में नहीं आता:का उपयोग करते हुए "और" और "या" अजगर तार के साथ ऑपरेटर

parameter and (" " + parameter) or "" 

जहां पैरामीटर स्ट्रिंग

क्यों एक and का उपयोग करना चाहते हैं और or ऑपरेटर, सामान्य रूप से, अजगर तारों के साथ?

+5

यह '" "+ पैरामीटर यदि किसी और पैरामीटर" "' अतिरिक्त अस्पष्टता के साथ। – zch

+1

@ Smac89: यह समझ में आता है, लेकिन ऐसा मैं लोग इस अस्पष्ट विचार पर विचार करेंगे। –

उत्तर

17

आप parameter का मूल्य उपयोग कर रहे हैं मान लीजिए, लेकिन अगर मूल्य None कहना है, तो आप के बजाय एक खाली स्ट्रिंग None के बजाय "" करना चाहते हैं। आप सामान्य रूप से क्या करेंगे?

if parameter: 
    # use parameter (well your expression using `" " + parameter` in this case 
else: 
    # use "" 

यह अभिव्यक्ति क्या कर रही है। सबसे पहले आप को समझना चाहिए क्या and और or ऑपरेटर करता है:

  • a and b रिटर्न b अगर एक True है, बाकी a देता है।
  • a or ba देता है यदि True है, तो b लौटाता है।

तो, आपकी अभिव्यक्ति:

parameter and (" " + parameter) or "" 

जो प्रभावी रूप से के बराबर है:

  • parameter - A1 लिए मूल्यांकन किया जाता है:

    (parameter and (" " + parameter)) or "" 
    # A1    A2    B 
    #   A      or B 
    

    कैसे अभिव्यक्ति करता है, तो मूल्यांकन किया जाता है True:

    result = (True and " " + parameter) or "" 
    
    result = (" " + parameter) or "" 
    
    result = " " + parameter 
    
  • parameter - A1None है:

    result = (None and " " + parameter) or "" 
    
    result = None or "" 
    
    result = "" 
    

एक सामान्य सुझाव के रूप में, यह सशर्त अभिव्यक्ति के लिए A if C else B प्रपत्र अभिव्यक्ति का उपयोग करने के लिए बेहतर और अधिक पठनीय है। तो, आपको बेहतर उपयोग करना चाहिए:

" " + parameter if parameter else "" 

दिए गए अभिव्यक्ति के बजाय। if-else अभिव्यक्ति के पीछे प्रेरणा के लिए PEP 308 - Conditional Expression देखें।

2

यह जांचता है कि parameter का मूल्य है या नहीं। यदि यह करता है तो यह एक जगह तैयार करता है। यदि नहीं, तो यह एक खाली स्ट्रिंग देता है।

$ python 
Python 2.7.2 (default, Oct 11 2012, 20:14:37) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> foo = 'bar' 
>>> foo and (" " + foo) or "" 
' bar' 
+0

सही है, लेकिन आप यह बताना चाहते हैं कि यह कैसे काम करता है। –

4

पायथन में खाली स्ट्रिंग False बूलियन मान के बराबर है, वैसे ही खाली सूची के समान।आपके द्वारा प्रस्तुत की गई रेखा एक टर्नरी ऑपरेटर का पायथन संस्करण है (जैसा कि नीचे टिप्पणी में उल्लेख किया गया है, आजकल एक अप्रचलित निर्माण, पायथन now has a real ternary operator के रूप में)। यह तीन नियमों पर आधारित है:

    a and b के लिए
  • अगर a है False तो b मूल्यांकन नहीं किया जाएगा
  • a or b के लिए
  • अगर aTrue तो b मूल्यांकन नहीं किया जाएगा
  • एक तार्किक का मूल्य है खंड इसकी हाल ही में मूल्यांकन की गई अभिव्यक्ति का मूल्य है

यदि parameterका मूल्यांकन करता हैखंड का दूसरा भाग मूल्यांकन किया जाएगा: (" " + parameter)। तो यह parameter पर अग्रणी स्थान जोड़ देगा यदि यह खाली स्ट्रिंग नहीं है। or खंड का दूसरा भाग मूल्यांकन नहीं किया जाएगा, क्योंकि आप पहले से ही पूरी अभिव्यक्ति को बता सकते हैं True (True या कुछ भी हमेशा True है)।

तो parameterFalse (इस प्रसंग में रिक्त स्ट्रिंग) and खंड के दूसरे भाग, का मूल्यांकन नहीं किया जाएगा के रूप में आप पहले से ही बता सकते हैं यह किया जा रहा है False (False और कुछ भी हमेशा False है)। इसलिए or खंड का दूसरा भाग एक खाली स्ट्रिंग लौटने का मूल्यांकन किया जाता है।

आप एक और अधिक वर्बोज़ तरीके से लिख सकते हैं:

if parameter: 
    return " " + parameter 
else: 
    return "" 
2

इस टीटीएल पर विचार करें। तो फिर यह सिर्फ विभिन्न परिदृश्यों में प्लग लगाने को देखने के लिए कि क्या होता है :)

ध्यान दें कि and और orपहले मूल्य कि उन्हें "सफल होने" या "असफल" का मूल्यांकन - और इस जरूरत को सही है या गलत नहीं हो!

a b a or b a and b 
-- -- ------ ------- 
T T a (T) b (T) 
T F a (T) b (F) 
F T b (T) a (F) 
F F b (F) a (F) 

टी और एफ "सत्य-वाई" और "झूठी-वाई" मानों का प्रतिनिधित्व करते हैं। यह अभिव्यक्ति-चेनिंग काम करता है क्योंकि ऑपरेटरों को सही या गलत वापस नहीं करने की आवश्यकता होती है - यह या तो a या b का मान होगा।

6

पायथन खाली "स्ट्रिंग" के बूलियन मान के रूप में "झूठी" और गैर-खाली तारों के बूलियन मान के रूप में खाली तारों को मानता है।

तो अभिव्यक्ति के केवल दो संभावित परिणाम हैं, यानी खाली स्ट्रिंग और गैर-खाली स्ट्रिंग के लिए।

नोटिस करने की दूसरी बात यह है कि "या" और "और" ऑपरेटर का कौन सा मान वापस आ गया है। पायथन स्ट्रिंग और/और ऑपरेटर के लिए सिर्फ सही या गलत मान नहीं लौटाता है, यह तारों में से एक लौटाता है (मानते हैं कि उनके पास सत्य या गलत का मूल्य है)। पाइथन आलसी दृष्टिकोण का उपयोग करता है:

"और" ऑपरेटर के लिए यदि बाएं मान सही है, तो सही मान चेक किया गया है और लौटाया गया है। यदि बायां मान गलत है, तो यह

"या" ऑपरेटर के लिए यदि पहला मान सत्य है, तो यह वापस कर दिया जाता है।अन्यथा यदि दूसरा मान गलत है, तो दूसरा मूल्य

parameter = 'test' 
print(parameter and (" " + parameter) or "") 

दिया जाता है ouput: परीक्षण

parameter = '' 
print(parameter and (" " + parameter) or "") 

उत्पादन: (रिक्त स्ट्रिंग)

0

सब अच्छा जवाब के साथ, मैंने पाया इन बयानों में मदद मुझे यह बेहतर याद है और फिट है कि मेरा दिमाग कैसे काम करता है (और उम्मीद है कि वहां कुछ और के लिए):

  • "और" पहली झूठी वस्तु (उदा।, कोई नहीं, "", [],(), {}, 0) या अंतिम आइटम यदि कोई नहीं (उदा। कोई झूठी मिली)

  • "या" पहले यह सच है आइटम या अंतिम आइटम (जैसे कोई सच पाया)

सारांश में वे सब पहले आइटम है कि बयान के परिणाम का फैसला वापस जाने देता है। (सबसे खराब स्थिति में, अनुक्रम में अंतिम आइटम)

नोट इस नियम भी लागू होता है एक श्रृंखलित सभी "और" या सभी "या" बयान

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