Skip to content
This page has been auto-translated and may contain errors.View in English

संख्याएँ और अंकगणित

संख्याएँ लगभग हर उस प्रोग्राम में दिखती हैं जो आप लिखते हैं। एक शॉपिंग कार्ट कीमत का कुल जोड़ता है। एक गेम स्कोर अपडेट करता है। एक स्क्रिप्ट गिनती करती है कि कोई चीज़ कितनी बार हुई। Python आपको ऐसे अंकगणितीय ऑपरेटर देता है जो कागज़ी गणित की तरह काम करते हैं, साथ ही कुछ और भी जो शुरुआत से ही जानने योग्य हैं।

Python के अंकगणितीय ऑपरेटर मानक सेट के साथ-साथ पूर्णांक भाजन, मॉड्यूलो, और घात (exponentiation) को भी कवर करते हैं। कुछ व्यवहार अन्य भाषाओं से इस तरह से भिन्न हैं जो व्यावहारिक रूप से मायने रखते हैं: / हमेशा float लौटाता है, फ़्लोर डिवीज़न ऋणात्मक अनंत की ओर राउंड करता है, और मॉड्यूलो वास्तविक मॉड्यूलो सेमांटिक्स का पालन करता है।

Python का संख्यात्मक टावर: int (मनमानी परिशुद्धता), float (IEEE 754 binary64), complex (यहाँ कवर नहीं किया गया)। अंकगणितीय ऑपरेटर C परंपरा के बजाय गणितीय परिभाषाओं का पालन करते हैं: // फ़्लोर डिवीज़न है (ऋणात्मक अनंत की ओर), % भाजक का चिह्न रखता है, और दोनों मिलकर सभी पूर्णांक इनपुट के लिए पहचान a == (a // b) * b + (a % b) को संतुष्ट करते हैं।

ऑपरेटर्स

गणित के चार ऑपरेटर (+, -, *, /) ठीक उसी तरह काम करते हैं जैसा आप अपेक्षा करेंगे। Python तीन और जोड़ता है जिनका आप लगातार उपयोग करेंगे: पूर्णांक भाजन, शेषफल, और घात।

मानक चार ऑपरेटर अपेक्षा के अनुसार व्यवहार करते हैं, एक उल्लेखनीय नियम के साथ: / हमेशा float लौटाता है, भले ही परिणाम पूर्ण संख्या हो। तीन अतिरिक्त ऑपरेटर आपके द्वारा बिना किसी अतिरिक्त कार्य के व्यक्त किए जा सकने वाले को विस्तारित करते हैं।

सातों ऑपरेटर डंडर मेथड्स पर मैप करते हैं: + से __add__, // से __floordiv__, % से __mod__, ** से __pow__, इत्यादि। मिश्रित int/float ऑपरेशन float में विस्तारित होते हैं। ऑपरेंड प्रकारों की परवाह किए बिना / हमेशा float लौटाता है।

python
price    = 12.99
quantity = 3

print(price * quantity)   # 38.97
print(price + 2)          # 14.99
print(price - 1.00)       # 11.99
ऑपरेटरनामउदाहरणपरिणाम
+जोड़5 + 38
-घटाव5 - 32
*गुणा5 * 315
/भाग5 / 31.6666...
//पूर्णांक भाग5 // 31
%शेषफल5 % 32
**घात5 ** 3125

भाग: / बनाम //

/ आपको हमेशा सटीक दशमलव परिणाम देता है, भले ही उत्तर पूर्ण संख्या हो। // आपको केवल पूर्ण-संख्या भाग देता है, दशमलव बिंदु के बाद की सब कुछ काट देता है। यह राउंड नहीं करता; यह काटता है:

/ हमेशा एक float लौटाता है, चाहे इनपुट पूर्णांक हों या नहीं। // परिणाम का फ़्लोर लौटाता है: सबसे बड़ा पूर्णांक जो वास्तविक परिणाम से कम या उसके बराबर हो। धनात्मक संख्याओं के लिए यह ट्रंकेशन के समान है। ऋणात्मक के लिए, यह नहीं है:

/ सच्चा भाजन है: हमेशा float लौटाता है। // फ़्लोर डिवीज़न है: यह वास्तविक भागफल पर math.floor() लागू करता है, हमेशा शून्य के बजाय ऋणात्मक अनंत की ओर राउंड करता है। यह C और Java से अलग है, जहाँ पूर्णांक भाजन ट्रंकेट करता है। गणितीय लाभ: Python के // और % ऋणात्मक सहित सभी पूर्णांक इनपुट के लिए पहचान a == (a // b) * b + (a % b) को संतुष्ट करते हैं। C का ट्रंकेटिंग डिवीज़न ऋणात्मक के लिए इस पहचान को तोड़ता है।

python
10 / 2     # 5.0   (हमेशा float, भले ही समान रूप से विभाजित हो)
10 / 3     # 3.3333333333333335

10 // 3    # 3
7  // 2    # 3
-7 // 2    # -4    (ऋणात्मक अनंत की ओर फ़्लोर करता है, शून्य की ओर नहीं)

-7 // 2 का परिणाम लोगों को आश्चर्यचकित करता है। आप ज्यादातर // का उपयोग धनात्मक संख्याओं के साथ करेंगे जहाँ यह सामने नहीं आता। इसे अपने दिमाग के पीछे रखें जब ऋणात्मक संख्याएँ सामने आएँ।

Python इसे फ़्लोर डिवीज़न कहता है क्योंकि यह गणितीय फ़्लोर फ़ंक्शन लागू करता है। अन्य भाषाएँ इसके बजाय शून्य की ओर ट्रंकेट करती हैं, ऋणात्मक के लिए अलग परिणाम देती हैं। नाम // एक संकेत है: भाग दें, फिर फ़्लोर करें।

// floor(a / b) को लागू करता है, ट्रंकेशन को नहीं। पहचान a == (a // b) * b + (a % b) Python में सभी पूर्णांक इनपुट के लिए बनी रहती है। C और Java में, जहाँ / शून्य की ओर ट्रंकेट करता है, यह पहचान ऋणात्मक मानों के लिए विफल होती है और % शेषफल (भाज्य का चिह्न लेता है) के रूप में कार्य करता है न कि वास्तविक मॉड्यूलो (भाजक का चिह्न लेता है) के रूप में।

शेषफल ऑपरेटर %

% आपको देता है जो पूर्णांक भाजन के बाद बचता है। यदि 10 // 3 3 है (क्योंकि 3, 10 में तीन बार जाता है), तो 10 % 3 1 है (क्योंकि 3 × 3 = 9, और 10 - 9 = 1)। सबसे आम उपयोग यह जाँचना है कि कोई संख्या सम है या विषम।

% मॉड्यूलो ऑपरेटर है। सम/विषम जाँच स्पष्ट उपयोग है, लेकिन यह किसी भी साइकलिंग या रैपिंग समस्या के लिए सामान्यीकृत होता है: किसी रेंज के भीतर काउंटर रखना, समूहों में आइटम वितरित करना, अनुक्रम दोहराना। पैटर्न हमेशा value % limit है, जो 0 और limit - 1 के बीच कुछ लौटाता है।

Python का % वास्तविक मॉड्यूलो है: परिणाम हमेशा भाजक का चिह्न रखता है। यह C और Java से अलग है जहाँ % एक शेषफल ऑपरेटर है और भाज्य का चिह्न लेता है। Python में, -7 % 3 2 है, -1 नहीं, क्योंकि मॉड्यूलो को a - (a // b) * b के रूप में परिभाषित किया गया है और // ऋणात्मक अनंत की ओर फ़्लोर करता है। यह सुसंगत चिह्न व्यवहार वही है जो % को ऋणात्मक इनपुट के साथ साइकलिंग और रैपिंग के लिए विश्वसनीय बनाता है।

python
10 % 3    # 1
10 % 2    # 0  (समान रूप से विभाजित होता है)
10 % 7    # 3

6 % 2     # 0  (सम)
7 % 2     # 1  (विषम)

घात **

** किसी संख्या को घात तक उठाता है। दो तारांकन का उपयोग करें, ^ प्रतीक का नहीं (जिसका Python में कुछ और अर्थ है):

** घात है। यह floats के साथ भी काम करता है, जो आपको अलग फ़ंक्शन कॉल के बजाय भिन्नात्मक घातों के रूप में मूल (roots) व्यक्त करने देता है:

** __pow__ को कॉल करता है। दो int ऑपरेंड के साथ यह int लौटाता है; किसी भी float ऑपरेंड के साथ यह float लौटाता है। एक प्रिसेडेंस ट्रैप: -2 ** 2 को -(2 ** 2) के रूप में पार्स किया जाता है क्योंकि ** एकल माइनस की तुलना में अधिक मज़बूती से बाइंड करता है, जो 4 नहीं, -4 देता है। कोष्ठक का उपयोग करें: (-2) ** 2

python
2 ** 10    # 1024
3 ** 3     # 27
9 ** 0.5   # 3.0  (वर्गमूल: 0.5 की घात तक उठाएँ)

ऑपरेटर प्रिसेडेंस

Python मानक गणित क्रम का पालन करता है: पहले घात, फिर गुणा और भाग, फिर जोड़ और घटाव। जब आप अनिश्चित हों, कोष्ठक का उपयोग करें। वे इरादे को स्पष्ट करते हैं और कुछ भी खर्च नहीं करते:

Python मानक PEMDAS/BODMAS क्रम का पालन करता है। जो हिस्सा लोगों को परेशान करता है: /, //, और % सभी समान प्रिसेडेंस स्तर साझा करते हैं और मिश्रित होने पर बाएँ से दाएँ मूल्यांकन करते हैं। कोष्ठक मुफ़्त हैं; जब भी क्रम एक नज़र में स्पष्ट न हो, उनका उपयोग करें:

अंकगणितीय ऑपरेटरों में सर्वोच्च से न्यूनतम प्रिसेडेंस: **, फिर एकल -, फिर * / // % (समान प्रिसेडेंस पर बाएँ-से-दाएँ), फिर + -** के साथ एकल माइनस की पारस्परिक क्रिया एक सूक्ष्म ट्रैप है: -2 ** 2 -(2 ** 2) = -4 है क्योंकि एकल माइनस ** की तुलना में कम बाइंड करता है। ऋणीकरण को घात के साथ संयोजित करते समय हमेशा कोष्ठक लगाएँ।

python
2 + 3 * 4      # 14, न कि 20
2 ** 3 + 1     # 9,  न कि 512
10 - 4 / 2     # 8.0, न कि 3.0

(2 + 3) * 4    # 20
10 / (2 + 3)   # 2.0

int और float कैसे परस्पर क्रिया करते हैं

Python का एक सुसंगत नियम है: / हमेशा एक दशमलव लौटाता है (यहाँ तक कि 4 / 2 भी 2.0 देता है), और किसी पूर्णांक और दशमलव को मिलाने वाला कोई भी ऑपरेशन एक दशमलव देता है। जब आपको पूर्ण संख्या चाहिए, // का उपयोग करें या int() से रूपांतरित करें।

प्रकार के नियम पूर्वानुमेय हैं: / हमेशा float लौटाता है। दो पूर्णांकों के साथ // और % int लौटाते हैं। int और float को मिलाने वाला कोई भी ऑपरेशन float लौटाता है। इसका अर्थ है कि 4 / 2 2.0 है, 2 नहीं, जो तब मायने रखता है जब आपको पूर्णांक चाहिए (उदाहरण के लिए, इंडेक्स के रूप में उपयोग करने के लिए)।

प्रकार जबरदस्ती एक निश्चित पदानुक्रम का पालन करती है: मिश्रित ऑपरेशनों में int float में विस्तारित होता है। / __truediv__ पर मैप करता है, जो हमेशा float लौटाता है। // __floordiv__ पर मैप करता है: दो int ऑपरेंड के साथ यह int लौटाता है; किसी भी float ऑपरेंड के साथ यह float लौटाता है। ये नियम सुसंगत और पूर्वानुमेय हैं; एकमात्र आश्चर्य यह है कि / 4 / 2 के लिए भी कभी int नहीं लौटाता।

python
4 / 2      # 2.0   (float, हमेशा)
4 // 2     # 2     (int)
4 + 2      # 6     (int)
4 + 2.0    # 6.0   (float)
4 * 0.5    # 2.0   (float)

Float परिशुद्धता

एक गोत्चा है जो किसी न किसी बिंदु पर लगभग सभी को आश्चर्यचकित करता है:

python
0.1 + 0.2   # 0.30000000000000004

वह छोटी सी त्रुटि कोई Python बग नहीं है। कंप्यूटर दशमलव संख्याओं को बाइनरी में संग्रहीत करते हैं, और 0.1 जैसे कुछ मान सटीक रूप से प्रस्तुत नहीं किए जा सकते। यह उसी तरह है जैसे 1/3 को दशमलव में सटीक रूप से नहीं लिखा जा सकता। अधिकांश रोज़मर्रा की गणनाओं के लिए यह मायने नहीं रखता। पैसे प्रदर्शित करने के लिए, round() या :.2f फ़ॉर्मेट स्पेसिफ़ायर आउटपुट को साफ़-सुथरा रखेगा।

Python floats IEEE 754 binary64 हैं: 64 बिट्स लगभग 15-16 महत्वपूर्ण दशमलव अंकों की परिशुद्धता के साथ। अशुद्धि इसलिए सामने आती है क्योंकि कुछ भिन्न बाइनरी में सटीक रूप से प्रस्तुत नहीं किए जा सकते। 0.1 + 0.2 0.30000000000000004 उत्पन्न करता है। ड्रिफ़्ट केवल तब दिखाई देता है जब आप कच्चे मान का निरीक्षण करते हैं; :.2f या round() के साथ फ़ॉर्मेटिंग इसे आउटपुट में छिपा देती है।

वित्तीय कार्य के लिए जहाँ सेंट के अंश संचित होते हैं, Python स्टैंडर्ड लाइब्रेरी में सटीक बेस-10 अंकगणित के साथ decimal.Decimal प्रदान करता है। यह Modules अध्याय में कवर किया गया है।

float IEEE 754 binary64 है: 53 बिट्स मैंटिसा के साथ sign × mantissa × 2^exponent, जो 2^-52 ≈ 2.2e-16 की सापेक्ष परिशुद्धता देता है। कोई भी भिन्न जिसका हर 2 के अलावा अन्य अभाज्य गुणनखंडों वाला हो (जैसे 1/10 = 1/(2×5)) एक नॉन-टर्मिनेटिंग बाइनरी भिन्न है और सटीक रूप से संग्रहीत नहीं किया जा सकता। त्रुटि छोटी है लेकिन बार-बार अंकगणित में संचित होती है।

सटीक दशमलव अंकगणित के लिए, Python का decimal.Decimal आंतरिक रूप से मनमानी-परिशुद्धता बेस-10 का उपयोग करता है। बिना किसी राउंडिंग के सटीक परिमेय अंकगणित के लिए, fractions.Fraction अंश/हर जोड़े संग्रहीत करता है। दोनों स्टैंडर्ड लाइब्रेरी में हैं, Modules अध्याय में कवर किए गए हैं।

पठनीय संख्या लिटरल्स

Python आपको बड़ी संख्याओं को पढ़ने में आसान बनाने के लिए संख्या लिटरल्स में अंडरस्कोर रखने देता है। Python उन्हें पूरी तरह से अनदेखा कर देता है; वे केवल आपके लिए हैं:

अंडरस्कोर एक संख्यात्मक लिटरल में कहीं भी मान्य हैं और पार्सिंग के दौरान मान पर बिना किसी प्रभाव के हटा दिए जाते हैं। स्थिरांकों में हज़ार विभाजकों के लिए और बाइनरी या हेक्स लिटरल्स में अंकों को समूहित करने के लिए उपयोगी:

संख्यात्मक लिटरल्स में अंडरस्कोर एक टोकनाइज़र फ़ीचर है: लेक्सिंग के दौरान हटा दिया जाता है जिसका परिणामी मान पर शून्य प्रभाव होता है। पूर्णांकों, floats, और बेस्ड लिटरल्स (0xFF_FF, 0b1010_0001, 1_234.567_890) में मान्य। एकमात्र प्रतिबंध: शुरुआत, अंत में, या दशमलव बिंदु या एक्सपोनेंट मार्कर के निकट नहीं आ सकते।

python
population  = 8_100_000_000
distance_km = 384_400
pi_approx   = 3.141_592_653

उपयोगी बिल्ट-इन फ़ंक्शन्स

abs()

abs() निरपेक्ष मान लौटाता है: इनपुट के चिह्न की परवाह किए बिना हमेशा धनात्मक। इसका उपयोग तब करें जब आप परवाह करते हैं कि कोई संख्या शून्य से कितनी दूर है, न कि किस दिशा में।

abs() किसी संख्या का परिमाण लौटाता है। पूर्णांकों और floats पर काम करता है। दूरी की गणना, त्रुटि मार्जिन, और किसी भी स्थिति के लिए उपयोगी जहाँ दिशा अप्रासंगिक है और आपको केवल मान के आकार की आवश्यकता है।

abs() ऑपरेंड पर __abs__ कॉल करता है। int और float के लिए यह वही प्रकार लौटाता है। complex के लिए यह परिमाण (मूल से यूक्लिडियन दूरी) float के रूप में लौटाता है। वास्तविक संख्याओं के लिए रिटर्न प्रकार इनपुट प्रकार से मेल खाता है।

python
abs(-5)     # 5
abs(3.7)    # 3.7
abs(-0.5)   # 0.5

round()

round() डिफ़ॉल्ट रूप से निकटतम पूर्णांक तक राउंड करता है। दशमलव स्थानों की विशिष्ट संख्या रखने के लिए दूसरा तर्क पास करें:

python
round(3.7)          # 4
round(3.2)          # 3
round(3.14159, 2)   # 3.14

एक बात जानने लायक है: round(2.5) 3 नहीं, 2 देता है। जब मान दो विकल्पों के ठीक बीच में होता है तो Python निकटतम सम संख्या तक राउंड करता है।

round() बैंकर्स राउंडिंग का उपयोग करता है: जब मान ठीक बीच में होता है, तो यह हमेशा ऊपर राउंड करने के बजाय निकटतम सम संख्या तक राउंड करता है। यह सांख्यिकीय कार्य में संचित त्रुटि को कम करता है लेकिन यदि आप अपेक्षा करते हैं कि 0.5 हमेशा ऊपर राउंड हो तो यह आपको आश्चर्यचकित कर सकता है:

python
round(2.5)   # 2  (निकटतम सम तक राउंड करता है)
round(3.5)   # 4
round(4.5)   # 4  (5 नहीं)
round(3.14159, 2)   # 3.14

round() IEEE 754 round-half-to-even (बैंकर्स राउंडिंग) को लागू करता है: टाई निकटतम सम पूर्णांक तक राउंड होते हैं। यह "राउंड हाफ अप" परंपरा से अलग है। ndigits तर्क के साथ, round() ऑब्जेक्ट पर __round__ कॉल करता है; कस्टम प्रकार राउंडिंग व्यवहार को ओवरराइड कर सकते हैं। ध्यान दें: क्योंकि floats सटीक नहीं हैं, round(2.5) जैसे "टाई" वास्तव में बाइनरी में ठीक 0.5 पर नहीं हो सकते हैं, जिससे परिणाम असंगत दिखते हैं।

python
round(2.5)   # 2
round(3.5)   # 4
round(4.5)   # 4

divmod()

divmod() आपको एक ही कॉल में भागफल और शेषफल दोनों देता है। यह मानों की एक जोड़ी लौटाता है जिसे आप एक साथ दो नामों को असाइन कर सकते हैं:

divmod(a, b) (a // b, a % b) के बराबर है लेकिन एक ही चरण में गणना की जाती है। इसका उपयोग तब करें जब आपको वैसे भी दोनों मानों की आवश्यकता हो: पेजिनेशन, समय रूपांतरण, या समूहों में आइटम वितरित करना।

divmod() बाएँ ऑपरेंड पर __divmod__ कॉल करता है। यह भाजन एक बार करता है और फ़्लोर भागफल और मॉड्यूलो शेषफल दोनों लौटाता है, // और % को अलग-अलग कॉल करने से अनावश्यक गणना से बचता है। परिणाम सभी पूर्णांक इनपुट के लिए Python के फ़्लोर-डिवीज़न सेमांटिक्स के साथ a == divmod(a, b)[0] * b + divmod(a, b)[1] को संतुष्ट करता है।

python
divmod(10, 3)   # (3, 1): भागफल 3, शेषफल 1
divmod(7, 2)    # (3, 1)
divmod(9, 3)    # (3, 0)

quotient, remainder = divmod(10, 3)
print(quotient)    # 3
print(remainder)   # 1

(3, 1) वाली चीज़ क्या है?

यह एक tuple है: एक साथ लौटाए गए मानों की एक निश्चित जोड़ी। Tuples का अपना अध्याय है। फ़िलहाल, ऊपर दिखाए अनुसार एक साथ दो नामों को असाइन करके दोनों मानों को अलग करें।

व्यवहार में

एक टिप कैलकुलेटर:

python
bill     = 45.50
tip_rate = 0.18
tip      = round(bill * tip_rate, 2)
total    = round(bill + tip, 2)

print(f"Bill:  ${bill}")
print(f"Tip:   ${tip}")
print(f"Total: ${total}")

round() आउटपुट को दशमलव स्थानों की लंबी पंक्ति के बजाय पैसे जैसा दिखाता रखता है।

पेजिनेशन के लिए पृष्ठ गिनना और प्रतिशत के रूप में प्रगति ट्रैक करना:

python
total_items    = 153
items_per_page = 10

full_pages, leftover = divmod(total_items, items_per_page)
total_pages = (total_items + items_per_page - 1) // items_per_page

print(f"Full pages: {full_pages}, leftover: {leftover}")
print(f"Total pages needed: {total_pages}")   # 16
python
total_files     = 847
processed_files = 312

percent = round(processed_files / total_files * 100, 1)
print(f"Progress: {processed_files}/{total_files} ({percent}%)")

सीलिंग डिवीज़न फ़ॉर्मूला (n + d - 1) // d float में रूपांतरित किए बिना ऊपर राउंड करने के लिए एक मानक पूर्णांक ट्रिक है।

मिन-मैक्स नॉर्मलाइज़ेशन और प्रतिशत परिवर्तन: दो पैटर्न जो डेटा कार्य में लगातार दिखाई देते हैं:

python
# मिन-मैक्स नॉर्मलाइज़ेशन: किसी मान को 0.0 से 1.0 रेंज में स्केल करें
value   = 75
minimum = 0
maximum = 100

normalised = (value - minimum) / (maximum - minimum)
print(f"Normalised: {normalised:.2f}")   # 0.75

# दो मापों के बीच प्रतिशत परिवर्तन
before = 1_200
after  = 1_380

change = (after - before) / before * 100
print(f"Change: {change:.1f}%")          # 15.0%

दोनों पैटर्न एक अनुपात में कम हो जाते हैं: संदर्भ रेंज या संदर्भ परिमाण के सापेक्ष एक मान। float की परिशुद्धता अधिकांश विश्लेषणात्मक कार्य के लिए पर्याप्त है; संचित त्रुटि केवल तब मायने रखती है जब गणना दर्जनों ऑपरेशनों को चेन करती है या ऐसे मानों को शामिल करती है जो परिमाण के कई क्रमों से भिन्न होते हैं।