2016-06-30 7 views
38

True और False के बाद से int के उदाहरण हैं, निम्न पायथन में मान्य है:क्या Python में सूची [ट्रू], सूची [गलत] का कोई वैध उपयोग है?

>>> l = [0, 1, 2] 
>>> l[False] 
0 
>>> l[True] 
1 

मैं समझता हूँ कि ऐसा क्यों होता। हालांकि, मुझे यह व्यवहार थोड़ा अप्रत्याशित लगता है और हार्ड-टू-डीबग बग का कारण बन सकता है। यह निश्चित रूप से मुझे दो बार काट दिया है।

क्या कोई True या False के साथ अनुक्रमण सूची के कानूनी उपयोग के बारे में सोच सकता है?

+3

([यहाँ उदाहरण के एक गुच्छा है] http://www.petercollingridge.co.uk/python-tricks/boolean -indices)। –

+21

कोड गोल्फ के लिए उपयोगी: प्रिंट (('ko', 'ठीक है') [एक polku

+8

यह वैध अजगर कोड, यह है कि क्या "कानूनी" उपयोग तो राय के ज्यादातर एक मामला है। – skyking

उत्तर

59

अतीत में, कुछ लोगों को इस व्यवहार का इस्तेमाल किया है निर्माण करने के लिए एक गरीब-आदमी की conditional expression: एक proper conditional expression साथ

['foo', 'bar'][eggs > 5] # produces 'bar' when eggs is 6 or higher, 'foo' otherwise 

हालांकि, अजगर 2.5 में भाषा में जोड़ दिया गया था, इससे बहुत ज्यादा पर सिकोड़ी है , जिन कारणों से आप कहते हैं: पूर्णांक के उप-वर्ग होने वाले बुलियन पर भरोसा करना भी 'जादुई' है और एक रखरखाव के लिए अपठनीय है।

तो, जब तक आप कोड-गोल्फ (जानबूझ बहुत कॉम्पैक्ट और अस्पष्ट कोड का निर्माण कर रहे हैं),

'bar' if eggs > 5 else 'foo' 
बजाय

है, जो अतिरिक्त लाभ है कि दो भाव इस बीच चयन करता हैं lazily है का उपयोग का मूल्यांकन; यदि eggs > 5 गलत है, if से पहले अभिव्यक्ति कभी निष्पादित नहीं की जाती है।

+0

लेकिन यह वास्तव में मार्टिन कैसे काम करता है? मैं करने की कोशिश की सूची एल = [2, 0, 1] क्या यह ए डी एन झूठी रिटर्न 2 और यह सच है 0 .. –

+7

@ Ev.Kounis पैदावार को देखने के लिए: 'सच == 1',' झूठी == 0', क्योंकि बूलियन्स हैं 'int' का एक उप-वर्ग। 'अंडे के बाद से> 5' एक बूलियन पैदा करता है, लेकिन अनुक्रमण पूर्णांक मान,' अंडे> 5' किया जा रहा लेता है 'TRUE'' [ 'foo', 'बार'] का उत्पादन [1] ', अन्यथा' [ 'foo', ' बार '] [0]' उत्पादन किया जाता है। –

+0

क्या वैकल्पिक रूप अभी भी स्पष्ट है यदि आप जिस इकाई को अनुक्रमणित कर रहे हैं वह वर्बोज़ है? 'x = उपलब्ध_ विकल्प [पसंद] .response_text [int (n <9)] 'शायद? मैं निश्चित रूप से उस 'int() 'को और अधिक पठनीय बनाने के लिए बहस करता हूं, भले ही यह भाषा परिभाषाओं द्वारा नो-ऑप न हो। – nigel222

35

आप हैरान हैं, तो क्यों bool एक वैध सूचकांक तर्क है: बस तथ्य यह है कि boolint का एक उपवर्ग है और अजगर में यह एक संख्यात्मक प्रकार है के साथ स्थिरता के लिए इस है।

यदि आप पूछ रहे हैं क्यों bool पहले स्थान पर है तो आप यह समझना होगा कि bool अजगर की पुरानी विज्ञप्ति में मौजूद नहीं थे और लोगों के बजाय int रों इस्तेमाल किया है में एक संख्यात्मक प्रकार है।

मैं ऐतिहासिक बहस का एक सा जोड़ देगा। पाइथन में bool के सभी जोड़े में सबसे पहले गिडो वैन रॉसम (उर्फ बीडीएफएल) ब्लॉगपोस्ट में वर्णित है: The History of Python: The history of bool, True and False। प्रकार PEP 285 के माध्यम से जोड़ा गया था।

पीईपी में वास्तविक तर्कसंगत इस निर्णय के लिए उपयोग किए गए तर्कसंगत हैं। मैं नीचे पीईपी के कुछ हिस्सों का उद्धरण दूंगा।

4) हम भविष्य में bools पर गैर बूलियन आपरेशन समाप्त करने के लिए प्रयास करना चाहिए, उपयुक्त चेतावनी के माध्यम से, ताकि उदाहरण True+1 के लिए अंत में (अजगर 3000 में) अवैध हो सकता है?

=> सं

वहाँ एक छोटी लेकिन मुखर अल्पसंख्यक कि "पाठ्यपुस्तक" bools कि सब पर अंकगणितीय आपरेशनों का समर्थन नहीं करते देखने के लिए पसंद करेंगे, लेकिन सबसे समीक्षक मेरे साथ सहमत हैं कि bools हमेशा चाहिए अंकगणितीय परिचालन की अनुमति दें।


6) boolint से विरासत चाहिए?

=> हां।

एक आदर्श दुनिया में, bool बेहतर एक अलग पूर्णांक प्रकार जानता है कि कैसे मिश्रित मोड प्रदर्शन करने के लिए गणित के रूप में लागू किया जा सकता है। हालांकि, boolint से इनहेरिट (- इस int की उपवर्गों के लिए सच रिटर्न सब सी कोड कहता है कि PyInt_Check() काम करना जारी रखेंगे के बाद से भाग में) कार्यान्वयन काफी आसान बनाता है। इसके अलावा, मेरा मानना ​​है कि इस बात का प्रतिस्थापन मामले में सही है: कि एक int की आवश्यकता है कोड एक bool खिलाया जा सकता है और यह 0 या 1 रूप में एक ही व्यवहार करेगा। कोड जो bool की आवश्यकता होती है जब इसे int दिया जाता है; उदाहरण के लिए, 3 0 है, लेकिन सत्य मानों के रूप में माना जाने पर 3 और 4 दोनों सत्य हैं।


क्योंकि int से bool इनहेरिट करती है, True+1 वैध है और 2 के बराबर होती है, और इतने पर। पिछली संगतता के लिए यह महत्वपूर्ण है: क्योंकि तुलना और वर्तमान में पूर्णांक मान वापस लौटने पर, कोई मानों के मौजूदा अनुप्रयोगों का उपयोग करने के तरीके के बारे में बताए जाने का तरीका नहीं है।


पश्च संगतता की वजह से, bool प्रकार कई गुण है कि कुछ देखना चाहेंगे का अभाव है। उदाहरण के लिए, अंकगणित एक या दो बूल तर्कों के साथ संचालन की अनुमति है, का इलाज 0 के रूप में गलत और 1 के रूप में सही है। इसके अलावा, एक बूल का उपयोग अनुक्रम अनुक्रमणिका के रूप में किया जा सकता है।

मुझे इसे एक समस्या के रूप में नहीं दिख रहा है, और मैं इस दिशा में भाषा विकसित नहीं करना चाहता हूं। मुझे विश्वास नहीं है कि "बूलियननेस" की कठोर व्याख्या भाषा को स्पष्ट बनाता है।


सारांश:

  • अनुकूलता पिछड़ों: वहाँ कोड के बहुत सारे है कि पहले से ही इस्तेमाल किया int रों 0 और 1False और True प्रतिनिधित्व करने के लिए था और इसके बारे में कुछ संख्यात्मक में उन मूल्यों का इस्तेमाल किया संगणना।
  • यह एक बड़ी बात के रूप में नहीं देखा गया था एक "गैर-पाठ्यपुस्तक" bool प्रकार लोगों की
  • बहुत पायथन समुदाय में चाहता था इन सुविधाओं
  • BDFL ऐसा कहा है।
4

अक्सर बेहतर तरीके होते हैं, लेकिन बूलियन इंडेक्स के पास उनके उपयोग होते हैं। मैं उन्हें का उपयोग किया है जब मैं और अधिक मानव कुछ पठनीय करने के लिए एक बूलियन परिणाम परिवर्तित करना चाहते हैं:

test_result = run_test() 
log.info("The test %s." % ('Failed', 'Passed')[test_result]) 
संबंधित मुद्दे