2013-04-09 3 views
77

बस अजगर के साथ शुरू है, तो यह शायद मेरी गलती है, लेकिन ...पायथन के साथ गलत गणित?

मैं बाहर अजगर कोशिश कर रहा हूँ। मैं इसे कैलकुलेटर के रूप में उपयोग करना पसंद करता हूं, और मैं धीरे-धीरे कुछ ट्यूटोरियल के माध्यम से काम कर रहा हूं।

मैं आज कुछ अजीब में भाग गया। मैं 2013 * 2013 पता लगाने के लिए चाहता था, लेकिन मैं गलत बात लिखा था और 2013 * 013 लिखा था, और यह मिल गया:

>>> 2013*013 
22143 

मैं अपने कैलकुलेटर के साथ की जाँच, और 22143 गलत जवाब है! 2013 * 13 26169 होना चाहिए।

पायथन मुझे गलत जवाब क्यों दे रहा है? मेरा पुराना Casio कैलकुलेटर ऐसा नहीं करती है ...

+2

संबंधित: वास्तव में ध्यान देने के लिए http://stackoverflow.com/q/13013638/748858 – mgilson

+6

+1। मुझे पता था कि यह एक ऑक्टल नंबर था, लेकिन अगर मैं नहीं जानता था, तो अब मुझे लगता है कि 2013 * 13 22143 था। आपने यह कैसे पाया कि यह गलत जवाब था? – 11684

+11

मैंने हाईस्कूल में कुछ समय पहले मानसिक गणित किया था, और मैंने सोचा था कि 22143 इससे थोड़ा छोटा होना चाहिए। तो मैंने अपने भरोसेमंद कैलकुलेटर के साथ जांच की। –

उत्तर

137
अष्टाधारी गणित की वजह से

, 013 वास्तव में पूर्णांक 11.

>>> 013 
11 
के साथ एक अग्रणी शून्य, 013 एक आधार-8 नंबर के रूप में व्याख्या और है

है 1 * 8 + 3 * 8 = 11.

नोट: इस व्यवहार changed in python 3 था। यहाँ PEP 3127

The default octal representation of integers is silently confusing to people unfamiliar with C-like languages. It is extremely easy to inadvertently create an integer object with the wrong value, because '013' means 'decimal 11', not 'decimal 13', to the Python language itself, which is not the meaning that most humans would assign to this literal.

+1

एह? ऑक्टल का उपयोग कौन करेगा? –

+7

कोई भी जो सिस्टम सिस्टम अनुमतियों से संबंधित है, ऑक्टल का उपयोग करेगा .. – wim

+14

@ जेम्ससलेगन: शायद यही कारण है कि पायथन 3 '0123' वाक्यविन्यास को अवैध बनाता है और हमेशा '0o123' की आवश्यकता होती है। –

36

013 से एक विशेष रूप से उपयुक्त उद्धरण है (दशमलव पूर्णांक शाब्दिक 11 के बराबर) एक अष्टाधारी पूर्णांक शाब्दिक, प्रमुख 0.

>>> 2013*013 
22143 
>>> 2013*11 
22143 
>>> 2013*13 
26169 

यह बहुत आम है (निश्चित रूप से की वजह से है अधिकांश भाषाओं में मैं परिचित हूं) ऑक्टल पूर्णांक अक्षर 0 से शुरू होता है और हेक्साडेसिमल पूर्णांक अक्षर 0x से शुरू होता है। सटीक भ्रम आप अनुभव के कारण, अजगर 3 एक सिंटैक्स त्रुटि को जन्म देती है:

>>> 2013*013 
    File "<stdin>", line 1 
    2013*013 
     ^
SyntaxError: invalid token 

और की आवश्यकता है या तो 0o या बजाय 0O:

>>> 2013*0o13 
22143 
>>> 2013*0O13 
22143 
+0

उत्तर के लिए धन्यवाद! मुझे लगता है कि यह ऑक्टल चीज थोड़ा उलझन में है, लेकिन कम से कम अब मुझे इसके बारे में पता है :) –

+3

आपका स्वागत है। जैसा कि मेरे और @ विम के जवाब में उल्लेख किया गया है, पाइथन समुदाय वह कर रहा है जो वे पाइथन 3 के साथ ऑक्टल अक्षरों के आसपास नौसिखिया भ्रम को कम करने के लिए कर सकते हैं। फिर भी, यह जानना बहुत अच्छी बात है - आप सुनिश्चित कर सकते हैं कि आप भाग लेंगे 0-प्रीफिक्स्ड ऑक्टल अक्षर दोबारा, चाहे पाइथन 2.X या कुछ अन्य भाषा में हों। –

+2

पीईपी 3127 इस सम्मान में थोड़ा मनोरंजक पढ़ा गया है ... उदा। "एक नया पायथन उपयोगकर्ता देरी की खोज में (वर्तमान में) रहस्यमय हो सकता है कि उसकी संख्या ठीक से काम नहीं करती है, हम उसे तुरंत समझाकर इसे ठीक कर सकते हैं कि पायथन को अग्रणी शून्य पसंद नहीं है (उम्मीद है कि एक उचित संदेश के साथ!), या हम इस शिक्षण अनुभव को इंटरनेट एक्सप्लोरर ब्राउज़र में जावास्क्रिप्ट दुभाषिया में भेज सकते हैं, और उसे वहां अपनी समस्या को डीबग करने का प्रयास करें। " – wim

5

यह है ज्यादातर बस पर @ विम का जवाब थोड़ा विस्तार हो रहा है, लेकिन अजगर कुछ उपसर्गों का उपयोग कर पूर्णांक अक्षर का आधार इंगित करता है। उपसर्ग के बिना, पूर्णांक को आधार -10 में होने के रूप में व्याख्या किया जाता है। एक "0x" के साथ, पूर्णांक को हेक्साडेसिमल int के रूप में व्याख्या किया जाएगा। पूर्ण व्याकरण विनिर्देश यहाँ है, हालांकि यह थोड़ा मुश्किल समझने के लिए यदि आप औपचारिक व्याकरण से परिचित नहीं होते हैं: http://docs.python.org/2/reference/lexical_analysis.html#integers

तालिका अनिवार्य रूप से कहते हैं कि आप एक लंबे समय के मूल्य (यानी एक ही है कि एक सामान्य की क्षमता से अधिक चाहते हैं int), "एल" या "एल" अक्षर के बाद संख्या लिखें; यदि आप चाहते हैं कि आपकी संख्या दशमलव में व्याख्या की जाए, तो सामान्य रूप से संख्या लिखें (बिना किसी अग्रणी 0 के); यदि आप इसे ऑक्टल में व्याख्या करना चाहते हैं, तो इसे "0", "0o", या "0O" से उपसर्ग करें; यदि आप इसे हेक्स में चाहते हैं, तो इसे "0x" के साथ उपसर्ग करें; और यदि आप इसे बाइनरी में चाहते हैं, तो इसे "0 बी" या "0 बी" से उपसर्ग करें।

+0

पाइथन स्वचालित रूप से उस एल को जोड़ रहा है, जब मैं वास्तव में बड़ी संख्या में प्रवेश करता हूं (जैसे 99 99 99 99 99 99 99 99 99 99 99 999, लेकिन 3333333333 की तरह नहीं)। क्या कोई समय है जब मुझे इसे खुद जोड़ना होगा? –

+0

@JamesElegan केवल तभी यदि आप पाइथन के एक बेहद पुराने संस्करण का उपयोग कर रहे हैं।और पायथन 3 में, एल पूरी तरह से चला गया है, जैसा कि int और लंबे प्रकार के बीच के सभी अन्य भेद हैं। – lvc

+0

पायथन 2.7 बहुत पुराना नहीं है, मैं इसे लेता हूं? तो मुझे एल को जोड़ने की ज़रूरत नहीं है। (मैं पाइथन 3 के बारे में अच्छी चीजें सुनता रहता हूं, शायद मुझे बस इंस्टॉल करना चाहिए और इसका इस्तेमाल करना चाहिए?) –

7

पायथन के अष्टाधारी शाब्दिक के लिए 'आगे शून्य' वाक्य रचना एक आम पकड़ लिया है:

Python 2.7.3 
>>> 010 
8 

वाक्य रचना अजगर 3 में बदल गया था।एक्स http://docs.python.org/3.0/whatsnew/3.0.html#integers

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