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

आउटपुट और इनपुट

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

print() और input() Python के मानक टर्मिनल I/O फ़ंक्शन हैं। दोनों पहली नज़र में जितने दिखते हैं उससे अधिक कॉन्फ़िगर करने योग्य हैं। print() ऐसे आर्ग्युमेंट स्वीकार करता है जो नियंत्रित करते हैं कि मानों को कैसे जोड़ा जाए और आउटपुट कहाँ समाप्त हो। input() हमेशा एक स्ट्रिंग लौटाता है, जो यह तय करता है कि आप उपयोगकर्ता से आने वाले प्रत्येक मान को कैसे संभालते हैं।

print() sys.stdout को रैप करता है; input() sys.stdin को रैप करता है। दोनों केवल टेक्स्ट के साथ काम करते हैं, एन्कोडिंग को स्ट्रीम के codec को सौंपते हैं, और डिफ़ॉल्ट रूप से आउटपुट बफ़र करते हैं। stdout को stderr से अलग करना, और फ़्लशिंग पर नियंत्रण, दोनों वास्तविक प्रोग्रामों में मायने रखते हैं।

Python आपके कोड को कैसे चलाता है

Python आपके कोड को ऊपर से नीचे, एक समय में एक पंक्ति, ठीक उसी क्रम में चलाता है जिस क्रम में आपने लिखा है। कोई इधर-उधर कूदना नहीं। जिस क्रम में आप चीज़ें लिखते हैं, उसी क्रम में वे चलती हैं। हमेशा।

python
city = "नई दिल्ली"
print(city)
print("Population: 14 million")

city को पहले असाइन किया जाता है। पहला print चलता है। दूसरा print चलता है। हर बार, उसी क्रम में।

यह इसलिए मायने रखता है क्योंकि आप किसी वेरिएबल का उपयोग असाइन करने से पहले नहीं कर सकते। Python ने इसे अभी तक देखा नहीं है और एक त्रुटि उत्पन्न करेगा:

python
print(country)   # NameError: country is not defined yet
country = "India"

जैसे-जैसे आपके प्रोग्राम बढ़ते हैं, इसे ध्यान में रखें: जो भी आप उपयोग करते हैं उसे उपयोग करने से पहले परिभाषित किया जाना चाहिए।

Python अनुक्रमिक निष्पादन का उपयोग करता है: प्रत्येक स्टेटमेंट का मूल्यांकन उसके सामने आने पर किया जाता है, फ़ाइल के माध्यम से एक ही टॉप-टू-बॉटम पास में। पूरी फ़ाइल का पहले कोई प्री-स्कैन नहीं होता। असाइन करने से पहले किसी नाम को संदर्भित करने पर ठीक उसी पंक्ति पर NameError उत्पन्न होता है, पहले नहीं।

python
city = "नई दिल्ली"
print(city)             # works: city is already bound
print(country)          # NameError: not yet assigned
country = "India"

नियम सरल है: निर्भरताओं को उस पंक्ति से पहले परिभाषित किया जाना चाहिए जो उनका उपयोग करती है।

Python का निष्पादन मॉडल सिंगल-पास अनुक्रमिक मूल्यांकन है। नाम समाधान मूल्यांकन के बिंदु पर होता है, पार्स समय पर नहीं। पार्सर नामों को हल किए बिना बाइटकोड बनाता है, यही कारण है कि NameError एक रनटाइम अपवाद है न कि सिंटैक्स त्रुटि। Python में कोई होइस्टिंग नहीं है (JavaScript के var के विपरीत) और कोई फ़ॉरवर्ड डिक्लरेशन नहीं है (C के विपरीत)। एक नाम उपलब्ध होता है जिस क्षण वह बाइंड होता है; उससे पहले, कोई भी संदर्भ त्रुटि उत्पन्न करता है।

python
print(country)   # NameError at runtime, not a syntax error
country = "India"

आउटपुट प्रिंट करना

print() वह तरीका है जिससे Python आपसे जवाब में बात करता है। इसे कोई भी मान पास करें और यह उस मान को प्रदर्शित करता है। यह आपके द्वारा दी गई किसी भी चीज़ को स्वचालित रूप से टेक्स्ट में बदल देता है।

print() प्रत्येक आर्ग्युमेंट को str() के माध्यम से एक स्ट्रिंग में परिवर्तित करता है, उन्हें एक सेपरेटर (डिफ़ॉल्ट रूप से एक स्पेस) के साथ जोड़ता है, फिर परिणाम को एक न्यूलाइन के साथ मानक आउटपुट में लिखता है। डिफ़ॉल्ट को समझने से वैकल्पिक आर्ग्युमेंट के बारे में सोचना आसान हो जाता है।

print() का पूरा सिग्नेचर print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) है। *objects कलेक्टर किसी भी संख्या में पोज़िशनल आर्ग्युमेंट स्वीकार करता है और प्रत्येक पर str() कॉल करता है। sep और end फ़ॉर्मेटिंग को नियंत्रित करते हैं; file आउटपुट को किसी भी लिखने योग्य स्ट्रीम में पुनर्निर्देशित करता है; flush बफ़र को तुरंत खाली करने के लिए मजबूर करता है।

python
print("Hello")    # Hello
print(42)         # 42
print(3.14)       # 3.14
print(True)       # True

एकाधिक मान

आप एक साथ कई मानों को कॉमा से अलग करके प्रिंट कर सकते हैं। Python डिफ़ॉल्ट रूप से उनके बीच एक स्पेस डालता है। सेपरेटर को sep के साथ बदलें:

एकाधिक पोज़िशनल आर्ग्युमेंट प्रत्येक को व्यक्तिगत रूप से str() के साथ परिवर्तित किया जाता है, फिर sep द्वारा जोड़ा जाता है। डिफ़ॉल्ट sep एक एकल स्पेस है। इसे ओवरराइड करने से आप स्ट्रिंग कॉन्केटनेशन के बिना फ़ॉर्मेटेड आउटपुट उत्पन्न कर सकते हैं:

प्रत्येक पोज़िशनल आर्ग्युमेंट को जोड़ने से पहले व्यक्तिगत रूप से str() के माध्यम से पास किया जाता है। जॉइन sep का उपयोग करता है, फिर end जोड़ा जाता है, और पूरी चीज़ को आउटपुट स्ट्रीम में एक ही कॉल में लिखा जाता है। sep को ओवरराइड करना स्ट्रिंग को मैन्युअल रूप से बनाने की तुलना में साफ़ है:

python
name = "आरव"
age  = 28
print(name, age)                        # आरव 28
print("Name:", name)                    # Name: आरव
print("2024", "01", "15", sep="-")     # 2024-01-15
print("a", "b", "c", sep=", ")         # a, b, c

लाइन एंडिंग को नियंत्रित करना

प्रत्येक print() कॉल डिफ़ॉल्ट रूप से एक न्यूलाइन के साथ समाप्त होती है, इसलिए अगला आउटपुट एक नई पंक्ति पर शुरू होता है। इसे end के साथ बदलें। end="" सेट करने से अगला प्रिंट उसी पंक्ति पर जारी रहता है:

end पैरामीटर डिफ़ॉल्ट न्यूलाइन को बदल देता है। लाइन ब्रेक को दबाने के लिए इसे "" पर सेट करें, स्पेस के साथ उसी पंक्ति पर रहने के लिए " " पर, या किसी अन्य स्ट्रिंग पर। sep के साथ संयोजन में, आप मैन्युअल रूप से स्ट्रिंग बनाए बिना अधिकांश आउटपुट प्रारूप उत्पन्न कर सकते हैं:

sep और end कीवर्ड-ओनली आर्ग्युमेंट हैं जिनके डिफ़ॉल्ट ' ' और '\n' हैं। end="" सेट करना आंशिक पंक्ति प्रिंट करने और अगली कॉल को इसे जारी रखने देने का मानक तरीका है। प्रगति संकेतक या लॉग जैसे रीयल-टाइम आउटपुट के लिए, flush=True बफ़र को न्यूलाइन या बफ़र भरने की प्रतीक्षा करने के बजाय तुरंत खाली करने के लिए मजबूर करता है।

python
print("Loading", end="")
print("...")
# Loading...

print("one", end=" | ")
print("two", end=" | ")
print("three")
# one | two | three

f-strings के साथ आउटपुट फ़ॉर्मेट करना

संदेश बनाने का सबसे साफ़ तरीका f-strings है। ओपनिंग कोट से पहले f लगाएं, फिर किसी भी वेरिएबल या एक्सप्रेशन को कर्ली ब्रेसेस में लपेटें। Python इसे रनटाइम पर भर देता है। आप {} के अंदर कोई भी मान, गणना, या मेथड कॉल रख सकते हैं।

f-strings रनटाइम पर {} के अंदर किसी भी एक्सप्रेशन का मूल्यांकन करते हैं और परिणाम को एक स्ट्रिंग के रूप में एम्बेड करते हैं। मान के बाद एक कोलन एक फ़ॉर्मेट स्पेक पेश करता है: दशमलव स्थानों, संरेखण, और संख्या फ़ॉर्मेटिंग को नियंत्रित करने के लिए एक संक्षिप्त सिंटैक्स। ये कॉन्केटनेशन की तुलना में तेज़ और अधिक पठनीय हैं, और इन्हें स्पष्ट str() कॉल की आवश्यकता नहीं होती।

f-strings (PEP 498) प्रत्येक {} को बाइटकोड में संकलित करते हैं जो format(value, spec) को कॉल करता है, जो value.__format__(spec) को सौंपता है। __format__ लागू करने वाला कोई भी क्लास f-string के अंदर अपने स्वयं के डिस्प्ले को नियंत्रित करता है। कन्वर्ज़न फ़्लैग !r, !s, !a फ़ॉर्मेट कॉल से पहले repr(), str(), या ascii() लागू करते हैं। !r सबसे उपयोगी है: यह स्ट्रिंग्स के चारों ओर उद्धरण दिखाता है और अदृश्य वर्णों को दृश्यमान बनाता है।

python
name  = "आरव"
score = 980

# concatenation: clunky, requires str() for numbers
print("Player: " + name + ", Score: " + str(score))

# f-string: readable, no manual conversion
print(f"Player: {name}, Score: {score}")

आप {} के अंदर कोई भी एक्सप्रेशन रख सकते हैं: अंकगणित, मेथड कॉल, फ़ॉर्मेट स्पेक्स:

python
price = 49.99
tax   = 0.2
total = price * (1 + tax)

print(f"Total: {total:.2f}")          # Total: 59.99
print(f"Name: {name.upper()}")        # Name: आरव
print(f"2 + 2 = {2 + 2}")             # 2 + 2 = 4

: के बाद फ़ॉर्मेट स्पेक नियंत्रित करता है कि मान को कैसे प्रदर्शित किया जाए:

python
ratio = 0.8765
count = 1234567
label = "revenue"

print(f"{ratio:.1%}")       # 87.7%
print(f"{count:,}")         # 1,234,567
print(f"{label:>12}")       # "     revenue"

:.2f का अर्थ है "दो दशमलव स्थान"। आप इसका उपयोग कीमतों और मापन के लिए लगातार करेंगे। बाकी सब जब आपको ज़रूरत हो तब है। मुख्य बात: {} के अंदर कुछ भी जा सकता है, केवल वेरिएबल नाम नहीं।

:.2f और :.0% अधिकांश फ़ॉर्मेटिंग आवश्यकताओं को कवर करते हैं। एक चौड़ाई के साथ संरेखण निर्दिष्ट करने वाले (>, <, ^) साफ़-सुथरा टेबुलर आउटपुट उत्पन्न करते हैं। सामान्य पैटर्न {value:[align][width][.precision][type]} है। एक बार जब आप भागों को पहचान लेते हैं, तो सभी संयोजनों को याद किए बिना कोई भी स्पेक पठनीय हो जाता है।

स्पेक स्ट्रिंग को शब्दशः value.__format__(spec) को पास किया जाता है। बिल्ट-इन प्रकार C में फ़ॉर्मेट मिनी-भाषा को लागू करते हैं। कस्टम क्लासेस मनमानी स्पेक स्ट्रिंग्स को स्वीकार करने के लिए __format__ को परिभाषित कर सकते हैं। !r फ़ॉर्मेटिंग से पहले repr() को कॉल करता है: f"{name!r}" ट्रेलिंग व्हाइटस्पेस वाली स्ट्रिंग को एक उद्धृत repr में बदल देता है, अदृश्य वर्णों को दृश्यमान बनाता है। जब भी किसी वेरिएबल का मान गलत दिखे और आपको ठीक से देखने की आवश्यकता हो कि उसमें क्या है, तो इसका उपयोग करें।

उपयोगकर्ता से इनपुट प्राप्त करना

input() आपके प्रोग्राम को रोकता है और उपयोगकर्ता द्वारा कुछ टाइप करने की प्रतीक्षा करता है। जो भी वे टाइप करते हैं (और Enter दबाते हैं) रिटर्न वैल्यू के रूप में वापस आता है। कोष्ठक के अंदर की स्ट्रिंग वह प्रॉम्प्ट है जिसे उपयोगकर्ता देखता है।

python
name = input("What's your name? ")
print(f"Hello, {name}!")

input() हमेशा एक स्ट्रिंग लौटाता है, चाहे उपयोगकर्ता कुछ भी टाइप करे। 42 टाइप करें और आपको "42" मिलता है, संख्या 42 नहीं। इसके साथ अंकगणित करने के लिए, स्पष्ट रूप से परिवर्तित करें:

python
age = int(input("How old are you? "))
print(f"In ten years you'll be {age + 10}.")

क्या होगा यदि उपयोगकर्ता कुछ ऐसा टाइप करता है जिसे परिवर्तित नहीं किया जा सकता? Python एक ValueError उत्पन्न करता है। इसे ठीक से संभालना फ़ाइलें और अपवाद अध्याय में कवर किया गया है।

input() प्रॉम्प्ट को मानक आउटपुट में लिखता है, मानक इनपुट से एक पंक्ति पढ़ता है, ट्रेलिंग न्यूलाइन को हटाता है, और परिणाम को एक स्ट्रिंग के रूप में लौटाता है। कोई टाइप इन्फ़रेंस नहीं है। टर्मिनल से सब कुछ टेक्स्ट के रूप में आता है; आप घोषणा करते हैं कि आपको किस प्रकार की आवश्यकता है, सीमा पर स्पष्ट रूप से परिवर्तित करके।

python
name = input("What's your name? ")
age  = int(input("How old are you? "))

यह पैटर्न (टेक्स्ट प्राप्त करें, आवश्यक प्रकार में परिवर्तित करें) हर जगह लागू होता है जहां बाहरी डेटा आता है। int(), float(), और str() कन्वर्ज़न उपकरण हैं। यदि स्ट्रिंग को परिवर्तित नहीं किया जा सकता, तो Python ValueError उत्पन्न करता है, जो फ़ाइलें और अपवाद अध्याय में कवर किया गया है।

input() एक पतला इंटरफ़ेस है: यह sys.stdout.write(prompt) को कॉल करता है, stdout को फ़्लश करता है, sys.stdin से एक पंक्ति पढ़ता है, ट्रेलिंग न्यूलाइन को हटाता है, और परिणाम को str के रूप में लौटाता है। रिटर्न हमेशा डिज़ाइन द्वारा str होता है: Python के पास यह अनुमान लगाने का कोई तरीका नहीं है कि क्या "42" को एक पूर्णांक, एक फ़्लोट, या शाब्दिक वर्णों के रूप में इरादा किया गया था। सीमा पर टाइप कन्वर्ज़न स्पष्ट है। यह Python I/O में एक मौलिक पैटर्न है: सभी बाहरी डेटा टेक्स्ट के रूप में आता है, और आपका कोड एंट्री पॉइंट पर प्रकार घोषित करता है।

python
name  = input("Enter your name: ")
score = float(input("Enter your score (0.0 to 1.0): "))

print(f"Name:  {name!r}")      # !r reveals any invisible whitespace
print(f"Score: {score:.1%}")

stderr में लिखना

डिफ़ॉल्ट रूप से, print() मानक आउटपुट में लिखता है: वह स्ट्रीम जो टर्मिनल में दिखाई देती है और पाइप्स में बहती है। Python के पास मानक त्रुटि भी है, निदान और चेतावनियों के लिए एक अलग स्ट्रीम। ये टर्मिनल में समान दिखते हैं लेकिन अलग हैं: जब आप एक स्क्रिप्ट के आउटपुट को दूसरे कमांड में पाइप करते हैं, तो केवल stdout से गुज़रता है। Stderr हमेशा टर्मिनल तक पहुँचता है।

stderr में लिखने के लिए print() के file आर्ग्युमेंट का उपयोग किया जाता है। इसके लिए sys को इम्पोर्ट करने की आवश्यकता होती है, जो Modules अध्याय में कवर किया गया है। अभी के लिए, यह जानना पर्याप्त है कि दो स्ट्रीम मौजूद हैं और वे अलग क्यों हैं।

व्यवहार में

एक क्विज़ जो उपयोगकर्ता इनपुट से खुद को व्यक्तिगत बनाती है:

python
name    = input("What's your name? ")
subject = input("Which subject? ")

print(f"Okay, {name}. Starting your {subject} quiz.")
print("Good luck!")

दोनों इनपुट स्ट्रिंग्स के रूप में वापस आते हैं और सीधे f-strings में जाते हैं। कोई कन्वर्ज़न आवश्यक नहीं है क्योंकि आप उन्हें टेक्स्ट के रूप में उपयोग कर रहे हैं, संख्याओं के रूप में नहीं।

एक तापमान कनवर्टर संरेखित टेबुलर आउटपुट के साथ:

python
celsius    = float(input("Temperature in Celsius: "))
fahrenheit = celsius * 9 / 5 + 32

print(f"{'Celsius':>12} {'Fahrenheit':>12}")
print(f"{celsius:>12.1f} {fahrenheit:>12.1f}")

float() उपयोगकर्ता से पूर्णांक और दशमलव दोनों को संभालता है। >12 स्पेक स्तंभों को संरेखित रखता है चाहे संख्याओं में कितने अंक हों। 100 और -40 दर्ज करने का प्रयास करें: आउटपुट किसी भी तरह से साफ़ रहता है।

!r का उपयोग करके Python को वास्तव में क्या प्राप्त हुआ यह सतह पर लाना, जब आउटपुट गलत दिखता है तब उपयोगी है:

python
name  = input("Enter your name: ")
score = float(input("Enter your score (0.0 to 1.0): "))

print(f"Name:   {name!r}")
print(f"Score:  {score!r}")
print()
print(f"Result: {name}: {score:.1%}")

जब इनपुट साफ़ होता है तो {name} और {name!r} समान रूप से प्रदर्शित होते हैं। अंतर तब दिखाई देता है जब ट्रेलिंग स्पेस या अन्य अदृश्य वर्ण होते हैं। डिबगिंग के दौरान !r की आदत डालने से अप्रत्याशित मान तुरंत दृश्यमान हो जाते हैं।

Practice output and input in PythonWork through hands-on exercises on print, f-strings, and user input in the Scrimba course.Start the course →