python for अजगर में int() का प्रतिउत्तर व्यवहार




python programming examples (4)

यह लगभग निश्चित रूप से पायथन के ज़ेन से तीन सिद्धांतों को लागू करने का मामला है:

स्पष्ट बेहतर निहित है।

[...] व्यावहारिकता शुद्धता को हरा देती है

त्रुटियों को कभी भी चुपचाप नहीं गुजरना चाहिए

समय का कुछ प्रतिशत, कोई व्यक्ति int('1.23') अपने उपयोग के मामले के लिए गलत रूपांतरण को बुला रहा है, और इसके बजाय कुछ float या decimal.Decimal तरह चाहता है। इन मामलों में, उनके लिए यह स्पष्ट रूप से बेहतर है कि वे तत्काल त्रुटि प्राप्त कर सकते हैं जो वे गलत मूल्य देने के बजाय चुपचाप ठीक कर सकते हैं।

इस मामले में कि आप एक ट्रंक को अलग करना चाहते हैं, यह स्पष्ट रूप से ऐसा करने के लिए तुच्छ है, इसे पहले float माध्यम से पारित करके, और फिर int , round , trunc , floor या floor से एक को उपयुक्त के रूप में कॉल करना। यह आपके कोड को अधिक स्व-दस्तावेजीकरण भी बनाता है, बाद के संशोधन के खिलाफ रख-रखाव करता है। यह काल्पनिक रूप से चुपचाप काट-छाँट करने के लिए एक गुप्त कॉल को "सही" करके यह स्पष्ट करता है कि गोल मूल्य वह है जो आप चाहते हैं।

docs में यह स्पष्ट रूप से कहा गया है कि int (संख्या) एक फ़्लोरिंग प्रकार रूपांतरण है:

int(1.23)
1

और int (string) एक int देता है यदि और केवल अगर स्ट्रिंग एक पूर्णांक शाब्दिक है।

int('1.23')
ValueError

int('1')
1

क्या उसका कोई विशेष कारण है? मुझे यह स्पष्ट प्रतीत होता है कि एक मामले में फ़ंक्शन फर्श है, लेकिन दूसरा नहीं।


Answer #1

कभी-कभी एक सोचा प्रयोग उपयोगी हो सकता है।

  • व्यवहार A: int('1.23') एक त्रुटि के साथ विफल हो जाता है। यह मौजूदा व्यवहार है।
  • व्यवहार बी: int('1.23') त्रुटि के बिना 1 उत्पादन करता है। यह वही है जो आप प्रस्तावित कर रहे हैं।

व्यवहार A के साथ, यह व्यवहार B का प्रभाव प्राप्त करने के लिए सीधा और तुच्छ है: इसके बजाय int(float('1.23')) उपयोग करें।

दूसरी ओर, व्यवहार बी के साथ, व्यवहार ए का प्रभाव प्राप्त करना काफी अधिक जटिल है:

def parse_pure_int(s):
    if "." in s:
        raise ValueError("invalid literal for integer with base 10: " + s)
    return int(s)

(और यहां तक ​​कि ऊपर दिए गए कोड के साथ, मुझे पूरा भरोसा नहीं है कि कुछ कोने का मामला नहीं है कि यह गलतफहमी है।)

व्यवहार A इसलिए व्यवहार B से अधिक अभिव्यंजक है।

एक और बात पर विचार करें: '1.23' एक फ्लोटिंग-पॉइंट वैल्यू का एक स्ट्रिंग प्रतिनिधित्व है। '1.23' को पूर्णांक में बदलने के लिए वैचारिक रूप से दो रूपांतरण (स्ट्रिंग से पूर्णांक तक तैरना) शामिल हैं, लेकिन int(1.23) और int('1') प्रत्येक में केवल एक रूपांतरण शामिल है।

संपादित करें:

और वास्तव में, कोने के मामले हैं जो उपरोक्त कोड नहीं संभालेंगे: 1e-2 और 1E-2 दोनों फ्लोटिंग पॉइंट मान भी हैं।


Answer #2

सरल शब्दों में - वे समान कार्य नहीं हैं।

  • int (दशमलव) 'मंजिल के रूप में व्यवहार करता है यानी दशमलव भाग को खटखटाता है और int के रूप में लौटता है'
  • int (string) यह व्यवहार करता है कि 'यह पाठ एक पूर्णांक का वर्णन करता है, इसे रूपांतरित करें और int के रूप में लौटें'।

वे एक ही नाम के साथ 2 अलग-अलग कार्य हैं जो पूर्णांक लौटाते हैं लेकिन वे अलग-अलग कार्य हैं।

'int' छोटा और याद रखने में आसान है और इसका अर्थ प्रत्येक प्रकार पर लागू होता है, अधिकांश प्रोग्रामर के लिए सहज होता है, यही वजह है कि उन्होंने इसे चुना।

इसका कोई निहितार्थ नहीं है कि वे एक ही या संयुक्त कार्यक्षमता प्रदान कर रहे हैं, उनके पास बस एक ही नाम है और एक ही प्रकार वापस करते हैं। उन्हें आसानी से 'फ्लोरडेसिमलएसेसइंट' और 'कन्वर्टस्ट्रीमिंगटॉइंट' कहा जा सकता है, लेकिन वे 'इंट' के लिए गए क्योंकि यह याद रखना आसान है, (99%) सहज और भ्रम शायद ही कभी होगा।

पाठ के लिए एक पूर्णांक के रूप में पार्सिंग पाठ जिसमें दशमलव बिंदु शामिल था जैसे कि "4.5" कंप्यूटर भाषाओं के बहुमत में एक त्रुटि फेंक देगा और अधिकांश प्रोग्रामर द्वारा एक त्रुटि फेंकने की उम्मीद की जाएगी, क्योंकि पाठ-मान एक पूर्णांक और तात्पर्य का प्रतिनिधित्व नहीं करता है वे गलत डेटा प्रदान कर रहे हैं


Answer #3

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

int(some_string) एक स्ट्रिंग को पूर्णांक प्रारूप में बदलने के लिए एक स्पष्ट अनुरोध है; इस रूपांतरण के नियम निर्दिष्ट करते हैं कि स्ट्रिंग में मान्य पूर्णांक शाब्दिक प्रतिनिधित्व होना चाहिए। int(float) एक फ्लोट को पूर्णांक में बदलने के लिए एक स्पष्ट अनुरोध है; इस रूपांतरण के लिए नियम निर्दिष्ट करते हैं कि फ्लोट के आंशिक भाग को काट दिया जाएगा।

int("3.1459") क्रम में 3 को लौटाने के लिए दुभाषिए को स्ट्रिंग को फ्लोट में बदलना होगा। चूंकि पायथन निहित रूपांतरणों का समर्थन नहीं करता है, इसलिए वह इसके बजाय अपवाद को चुनना चाहता है।





python