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

स्ट्रिंग्स

docs.scrimba.com

लगभग हर प्रोग्राम जो आप लिखते हैं उसमें टेक्स्ट दिखाई देता है। नाम, संदेश, स्कोर, लेबल। Python में, टेक्स्ट का कोई भी हिस्सा स्ट्रिंग कहलाता है: कोई भी मान जिसे आप कोट मार्क्स में लपेटते हैं। एकल या दोहरे, दोनों समान तरीके से काम करते हैं।

स्ट्रिंग्स Python का प्राथमिक टेक्स्ट प्रकार हैं। वे एक यूजरनेम से लेकर एक URL पथ तक सब कुछ ले जाते हैं। एकल और दोहरी कोट्स समान परिणाम देती हैं; चुनाव शैली का मामला है।

str हर सिस्टम बाउंड्री पर बैठता है: टर्मिनल I/O, फाइल कंटेंट्स, नेटवर्क रिस्पांसेज, सीरीएलाइज़्ड डेटा। यह Python का अपरिवर्तनीय (निर्माण के बाद परिवर्तनीय नहीं) Unicode क्रम प्रकार है। दोनों कोट स्टाइल समान वस्तु उत्पन्न करती हैं, इसलिए उनके बीच चुनाव विशुद्ध रूप से शैली का है।

python
greeting = "Hello, world"
username = 'alice'

कोट्स की चुनाव केवल तब महत्वपूर्ण होती है जब आपके टेक्स्ट में कोट मार्क्स हों। विपरीत स्टाइल का उपयोग करें ताकि आपको उन्हें एस्केप न करना पड़े:

कम्युनिटी कन्वेंशन दोहरी कोट्स है। स्टाइल को स्विच करने का व्यावहारिक कारण यह है कि जब कंटेंट में वह वर्ण हो तो एस्केपिंग से बचा जा सके:

कन्वेंशन दोहरी कोट्स है, और Black और Ruff जैसे फॉर्मेटर्स इसे स्वचालित रूप से लागू करते हैं। हाथ से लिखा जाने वाला एकमात्र कारण स्टाइल स्विच करने का यह है कि जब कंटेंट में डिलिमिटर हो तो बैकस्लैश एस्केप से बचा जा सके:

python
note = "It's a great day"      # apostrophe inside, use double quotes
message = 'She said "hello"'   # double quotes inside, use single quotes
escaped = "She said \"hello\""  # or escape with a backslash

अपरिवर्तनीयता

स्ट्रिंग्स अपरिवर्तनीय होती हैं: एक बार आप इसे बनाते हैं, आप इसे बदल नहीं सकते। एक स्ट्रिंग को स्थायी रूप से ठीक समझें जब यह बनाई जाती है। कोई भी ऑपरेशन जो ऐसा दिखता है कि वह स्ट्रिंग को संशोधित कर रहा है, वास्तव में एक बिल्कुल नई स्ट्रिंग बना रहा है। मूल बिल्कुल वैसा ही रहता है।

स्ट्रिंग्स अपरिवर्तनीय होती हैं: कोई भी तरीका स्ट्रिंग को स्थान पर संशोधित नहीं करता। हर ऑपरेशन जो टेक्स्ट को ट्रांसफॉर्म करता है एक नई स्ट्रिंग देता है और मूल को अछूता रखता है। व्यावहारिक परिणाम यह है कि एक तरीके की कॉल जिसे आप कहीं भी असाइन नहीं करते, उसका कोई प्रभाव नहीं है।

str ऑब्जेक्ट्स अपरिवर्तनीय हैं, जिसका अर्थ है कि उनकी कंटेंट्स निर्माण के बाद ठीक हैं और कोई भी उसमें लिख नहीं सकता। यह स्ट्रिंग्स को दो गुण देता है जिन्हें आप वास्तव में उपयोग करते हैं: वे हैशेबल हैं (एक मान जिसकी कंटेंट्स कभी नहीं बदलती, उन कंटेंट्स द्वारा फाइल की जा सकती हैं, जो एक स्ट्रिंग को डिक्शनरी की या सेट सदस्य के रूप में काम करने देता है), और उन्हें नामों के बीच पास करना सुरक्षित है बिना किसी को कॉपी किए, क्योंकि कोई भी साझा स्ट्रिंग को बदल नहीं सकता।

python
name = "alice"
name = name.upper()   # "ALICE" is a new string; "alice" is unchanged

सीधा परिणाम: आप किसी विशेष स्थान पर वर्ण को बदल नहीं सकते। Python यदि आप कोशिश करेंगे तो त्रुटि उठाएगा।

python
name = "alice"
name[0] = "A"   # TypeError: 'str' object does not support item assignment

एक संशोधित स्ट्रिंग प्राप्त करने के लिए, स्लाइसिंग या एक तरीके का उपयोग करके एक नई स्ट्रिंग बनाएं। दोनों नीचे कवर किए गए हैं।

वर्ण असाइनमेंट की कोशिश सीधे बाधा दिखाती है:

python
name = "alice"
name[0] = "A"   # TypeError: 'str' object does not support item assignment

जब आपको संशोधित संस्करण की आवश्यकता हो, तो मानक उपकरण स्लाइसिंग हैं स्थिति संपादन के लिए स्लाइसिंग और replace() प्रतिस्थापन के लिए। दोनों एक नई स्ट्रिंग उत्पन्न करते हैं और मूल को अछूता रखते हैं।

किसी स्थान को असाइन करने के लिए (name[0] = "A") हर बार TypeError उठाता है, कोई अपवाद नहीं। स्थिति संपादन के लिए, आप जो बदलना चाहते हैं उसके चारों ओर स्लाइसिंग करके एक नई स्ट्रिंग बनाएं: name[:1].upper() + name[1:] पहले वर्ण को कैपिटलाइज़ करता है। स्ट्रिंग में कहीं भी प्रतिस्थापन के लिए, replace()

Junoअपरिवर्तनीयता एक स्ट्रिंग एक बार बनने के बाद कभी नहीं बदलती। कुछ भी जो ऐसा दिखता है कि वह इसे संपादित कर रहा है आपको इसके बजाय एक नई स्ट्रिंग सौंपता है, इसलिए परिणाम को असाइन करें या वह फिसल जाता है। वह जो मुझे जल्दी पकड़ा: name[0] = "A" काम नहीं करता, यह एक TypeError उठाता है।
Junoअपरिवर्तनीयता कोई भी स्ट्रिंग तरीका स्थान पर संपादित नहीं करता, हर एक एक नई स्ट्रिंग देता है और मूल को अकेला रखता है। तो name.upper() अपने आप कुछ उपयोगी नहीं करता, आपको इसे असाइन करना होगा। और name[0] = "A" `TypeError` उठाता है, कोई स्थान पर वर्ण स्वैप नहीं है।
Junoअपरिवर्तनीयता अपरिवर्तनीयता यह है जो स्ट्रिंग्स को हैशेबल बनाता है, इसलिए वे dict की तरह काम करती हैं, और कॉपी किए बिना साझा करने के लिए सुरक्षित। व्यावहारिक फलाफल: हर ट्रांसफॉर्मिंग तरीके के परिणाम को असाइन करें, क्योंकि कोई भी मूल को छूता नहीं है। स्थिति संपादन के लिए, बिंदु के चारों ओर स्लाइस करें और पुनः निर्माण करें, क्योंकि आइटम असाइनमेंट हमेशा TypeError उठाता है।

इंडेक्सिंग और स्लाइसिंग

स्ट्रिंग में हर वर्ण का एक संख्यात्मक स्थान है, शून्य से शुरू होता है। आप वर्ग कोष्ठक में स्थान संख्या रखकर अलग-अलग वर्णों को पढ़ सकते हैं। नकारात्मक संख्याएं अंत से पीछे की ओर गिनती करती हैं।

स्ट्रिंग्स शून्य-आधारित इंडेक्सिंग के साथ अनुक्रम हैं। नकारात्मक इंडेक्स अंत से गिनती करते हैं। स्लाइसिंग एक ही अभिव्यक्ति में किसी भी सन्निहित श्रेणी को निकालता है, और यह कभी भी श्रेणी से बाहर मानों पर त्रुटि नहीं उठाता।

एक स्ट्रिंग एक क्रमबद्ध अनुक्रम की तरह व्यवहार करती है जिसे आप इंडेक्स और स्लाइस कर सकते हैं। एक एकल स्थान को पढ़ना (s[i]) IndexError उठाता है यदि इंडेक्स अंत से आगे इशारा करता है। स्लाइसिंग (s[start:stop:step]) अलग तरीके से व्यवहार करता है: श्रेणी से बाहर की सीमाओं को वह चुप से कलैम्प किया जाता है, इसलिए एक स्लाइस कभी भी IndexError नहीं उठा सकता। वह अंतर व्यावहारिक है: इंडेक्स एक्सेस कठोर है, स्लाइसिंग क्षमाशील है।

python
word = "Python"
#       012345

print(word[0])    # "P"
print(word[2])    # "t"
print(word[5])    # "n"
print(word[-1])   # "n"  (last character)
print(word[-2])   # "o"  (second to last)

-1 हमेशा अंतिम वर्ण है, -2 दूसरा अंतिम है, और इसी तरह। वे तब उपयोगी होते हैं जब आप स्ट्रिंग के अंत को चाहते हैं बिना उसकी सटीक लंबाई जाने।

नकारात्मक इंडेक्स लपेटते हैं: -1 है len(s) - 1, -2 है len(s) - 2। अंत-लंगरित एक्सेस के लिए सबसे उपयोगी जब आप लंबाई को मैन्युअल रूप से कंप्यूट नहीं करना चाहते। एक नकारात्मक इंडेक्स जो श्रेणी से बाहर जाता है, फिर भी IndexError उठाता है, एक सकारात्मक की तरह।

एक नकारात्मक इंडेक्स को सीमा जांच से पहले len(s) + i में परिवर्तित किया जाता है, इसलिए -1 अंतिम वर्ण पर और -2 इससे पहले वाले पर पड़ता है। श्रेणी से बाहर जाना दोनों तरीकों से IndexError उठाता है, सकारात्मक या नकारात्मक: केवल स्लाइसिंग उसे माफ करता है, सादी इंडेक्सिंग नहीं।

स्लाइसिंग एक हिस्सा निकालता है। [start:stop] start को शामिल करता है और stop को बाहर करता है:

python
word = "Python"

print(word[0:2])   # "Py"     (positions 0 and 1)
print(word[2:])    # "thon"   (position 2 to end)
print(word[:3])    # "Pyt"    (start to position 2)
print(word[:])     # "Python" (a copy of the whole string)
print(word[::2])   # "Pto"    (every second character)
print(word[::-1])  # "nohtyP" (reversed)

तीन पैटर्न सबसे अधिक पहुंचने योग्य: word[:n] पहले n वर्णों के लिए, word[n:] स्थान n से सब कुछ, word[-n:] अंतिम n वर्णों के लिए। word[::-1] एक स्ट्रिंग को उलट देता है। यह पहली बार अजीब दिखता है, लेकिन यह प्रमाणिक Python है और आप इसे अक्सर देखेंगे।

प्रत्यक्ष इंडेक्सिंग के विपरीत, स्लाइसिंग कभी भी IndexError नहीं उठाता। Python चुप से श्रेणी से बाहर की सीमाओं को कलैम्प करता है, इसलिए word[100:] एक छोटी स्ट्रिंग पर "" के बजाय क्रैश होने के बजाय देता है। स्टेप आर्गुमेंट stride को नियंत्रित करता है: word[::2] हर दूसरे वर्ण को लेता है, word[::-1] विपरीत रूप से ट्रैवर्स करता है।

s[start:stop:step] में, आप जो भी छोड़ते हैं वह "जिस दिशा में आप जा रहे हैं उसके लिए प्राकृतिक अंत" को डिफॉल्ट करता है, एक निर्धारित 0 और len() को नहीं। एक सकारात्मक स्टेप के साथ इसका अर्थ है शुरुआत से अंत; एक नकारात्मक स्टेप के साथ यह फ्लिप होता है, इसलिए start अंतिम वर्ण बन जाता है और stop सामने से निकल जाता है। यही कारण है कि s[::-1] बिना किसी सीमा लिखे पूरी स्ट्रिंग को विपरीत में चलाता है, और वही कारण s[::-2] आपको हर दूसरा वर्ण पीछे की ओर देता है।

Junoइंडेक्सिंग और स्लाइसिंग स्थान शून्य से शुरू होते हैं, इसलिए word[0] पहला वर्ण है और word[-1] अंतिम है। एक स्लाइस एक श्रेणी को पकड़ता है: word[start:stop] start को रखता है और stop से पहले रोकता है। word[::-1] स्ट्रिंग को उलट देता है, जो पहली बार अजीब दिखता है और फिर आप इसे हमेशा के लिए उपयोग करते हैं।
Junoइंडेक्सिंग और स्लाइसिंग शून्य से इंडेक्स करें, या अंत से नकारात्मक के साथ, जहां word[-1] अंतिम वर्ण है। स्लाइस एक श्रेणी लेते हैं जो start को शामिल करता है और stop को बाहर करता है, और एक तीसरा step stride सेट करता है, इसलिए word[::-1] उलट देता है। याद रखने योग्य पकड़: श्रेणी से बाहर इंडेक्सिंग `IndexError` उठाता है, लेकिन स्लाइसिंग श्रेणी से बाहर वह वापस करता है जो वहां है, विफल होने के बजाय।
Junoइंडेक्सिंग और स्लाइसिंग सादी इंडेक्सिंग कठोर है और श्रेणी से बाहर `IndexError` उठाता है, स्लाइसिंग क्षमाशील है और जो भी exists को कलैम्प करता है, इसलिए `word[100:]` `""` के बजाय उठाने के बजाय देता है। एक स्लाइस भाग छोड़ें और यह स्टेप की दिशा के लिए प्राकृतिक अंत को डिफॉल्ट करता है, जो पूरी वजह है कि `word[::-1]` बिना किसी सीमा लिखे विपरीत में चलाता है। जब आप खाली या छोटे इनपुट पर क्रैश न करना चाहते हों तो स्लाइस के लिए पहुंचें।

आवश्यक स्ट्रिंग तरीके

स्ट्रिंग्स के साथ अंतर्निहित तरीकों का एक समूह आता है: ऑपरेशन जिन्हें आप किसी भी स्ट्रिंग मान पर सीधे कॉल करते हैं। आप स्ट्रिंग लिखते हैं (या इसे धारण करने वाला वेरिएबल), फिर एक बिंदु, फिर तरीके का नाम। हर तरीका एक नई स्ट्रिंग देता है। मूल कभी नहीं बदली जाती।

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

हर ट्रांसफॉर्मिंग तरीका एक नया str देता है और मूल को अकेला रखता है, जो अपरिवर्तनीयता से सीधा अनुसरण करता है। वे कोड पॉइंट्स पर भी काम करते हैं (वास्तविक वर्ण, उन्हें स्टोर करने के लिए उपयोग किए जाने वाले कच्चे बाइट्स नहीं), इसलिए तरीके बिना कुछ किए accented और गैर-लैटिन टेक्स्ट पर सही तरीके से व्यवहार करते हैं। ट्रेड-ऑफ: हर तरीका एक नई स्ट्रिंग आवंटित करता है, इसलिए बड़े टेक्स्ट पर कई को चेन करने का अर्थ है कई आवंटन।

केस

python
text = "Hello, World"

text.lower()       # "hello, world"
text.upper()       # "HELLO, WORLD"
text.title()       # "Hello, World"  (each word capitalised)
text.capitalize()  # "Hello, world"  (first word only)

lower() और upper() दो हैं जिन्हें आप सबसे अधिक उपयोग करेंगे। lower() विशेष रूप से टेक्स्ट की तुलना करते समय उपयोगी है: "Alice" और "alice" दोनों पक्षों पर .lower() कॉल करने के बाद एक ही चीज़ बन जाते हैं।

lower() तुलना या स्टोरेज से पहले मानक सामान्यीकरण कदम है। title() एक कच्चे नियम का उपयोग करके प्रत्येक शब्द का पहला अक्षर कैपिटलाइज़ करता है जो contractions पर विफल हो जाता है: "it's" बन जाता है "It'S"। इसे केवल डिस्प्ले फॉर्मेटिंग के रूप में मानें।

lower() Unicode पूर्ण केस कन्वर्जन लागू करता है। केस-असंवेदनशील तुलना के लिए, casefold() अधिक सही है: यह अतिरिक्त रूपांतरण लागू करता है (जैसे German ß ss बन जाता है) जो lower() छोड़ देता है। title() किसी भी गैर-अल्फान्यूमेरिक वर्ण के बाद कैपिटलाइज़ करता है, जो contractions और hyphenated नामों को गलत तरीके से संभालता है। सही title casing के लिए, तर्क को मैन्युअल रूप से लागू करें।

व्हाइटस्पेस

python
text = "  hello  "

text.strip()    # "hello"    (both sides)
text.lstrip()   # "hello  "  (left only)
text.rstrip()   # "  hello"  (right only)

strip() स्ट्रिंग के दोनों सिरों से स्पेस हटाता है। आप इसे लगभग हर बार उपयोग करेंगे जब आप यूजर इनपुट या फाइल से टेक्स्ट संभालते हैं, क्योंकि stray spaces मौन विफलताओं का कारण बनती हैं: "alice" != "alice "

strip() दोनों सिरों से सभी leading और trailing व्हाइटस्पेस हटाता है: स्पेस, tabs, और newlines। दिशात्मक variants आपको केवल एक ओर को साफ करने देते हैं, indentation को छुए बिना trailing newline को हटाने के लिए उपयोगी। सभी तीन एक वैकल्पिक characters argument स्वीकार करते हैं विशेष वर्णों को हटाने के बजाय।

बिना किसी argument के, strip() दोनों सिरों से हर तरह की व्हाइटस्पेस हटाता है, non-ASCII व्हाइटस्पेस सहित, केवल सादे स्पेस नहीं। एक character argument के साथ यह उन वर्णों में से किसी को भी सिरों से हटाता है, और वह trap है: argument एक सेट के वर्ण हटाने के लिए है, एक prefix मिलान नहीं। "xxhelloxx".strip("x") "hello" देता है, लेकिन "https://".strip("https") prefix "https" को हटाता नहीं, यह हर h, t, p और s दोनों सिरों से हटाता है और "://" देता है। एक ज्ञात prefix या suffix को हटाने के लिए, इसके बजाय removeprefix() और removesuffix() का उपयोग करें।

खोज

python
text = "Hello, world"

text.find("world")         # 7
text.find("Python")        # -1  (not found)
text.count("l")            # 3
text.startswith("Hello")   # True
text.endswith("world")     # True

find() उस स्थान को देता है जहां टेक्स्ट का एक टुकड़ा आपकी स्ट्रिंग के अंदर शुरू होता है। यदि यह नहीं है, तो यह -1 देता है। startswith() और endswith() का उपयोग करें जब आप केवल परवाह करते हैं कि क्या स्ट्रिंग किसी विशिष्ट चीज़ से शुरू या समाप्त होती है।

find() पहली मिलान का शुरुआत इंडेक्स देता है, या -1-1 कन्वेंशन आपको परिणाम को सीधे स्लाइसिंग या अंकगणित में एक जांच के बिना उपयोग करने देता है। startswith() और endswith() हर एक स्ट्रिंग्स के एक tuple को स्वीकार करते हैं, इसलिए आप एक कॉल में कई prefixes या suffixes का परीक्षण कर सकते हैं।

find() बाएं से दाएं स्कैन करता है और जब कोई मिलान न हो तो -1 देता है। index() एक ही खोज करता है लेकिन -1 देने के बजाय ValueError उठाता है: index() चुनें जब मिलान की कमी का अर्थ है आपके कोड में एक बग है और आप चाहते हैं कि यह वहां रोकें, find() जब अनुपस्थिति सामान्य इनपुट है जिसे आप जांच करेंगे। एक शुद्ध "क्या यह इससे शुरू या समाप्त होता है" प्रश्न के लिए, startswith() और endswith() कहते हैं कि आपका क्या मतलब है और पहली विसंगति पर रोकते हैं, इसलिए उस नौकरी के लिए find() या in जांच पर उनको पसंद करें।

प्रतिस्थापन

python
text = "Hello, world"

text.replace("world", "Python")   # "Hello, Python"
text.replace("l", "L")            # "HeLLo, worLd"  (all occurrences)
text.replace("l", "L", 1)         # "HeLlo, world"  (first only)

replace() टेक्स्ट के एक टुकड़े को दूसरे के लिए स्वैप करता है और आपको एक नई स्ट्रिंग देता है। मूल नहीं बदली जाती। तीसरा argument पास करें यदि आप केवल पहली occurrence को बदलना चाहते हैं।

replace() डिफॉल्ट रूप से सभी non-overlapping occurrences को बदलता है। count argument कितने को बदलता है उसे सीमित करता है। क्योंकि यह एक नई स्ट्रिंग देता है, कॉल्स को chain किया जा सकता है: text.replace("a", "A").replace("e", "E") क्रम में दोनों प्रतिस्थापन लागू करता है।

replace() एक literal substring को मेल खाता है, एक pattern नहीं, इसलिए यह कोई regex नहीं करता और argument के हर वर्ण को अपने आप के रूप में मानता है। यह non-overlapping matches को बाएं से दाएं बदलता है, जो आपको आश्चर्यचकित कर सकता है: "aaa".replace("aa", "b") "bb" नहीं, "ba" देता है, क्योंकि दूसरा aa पहली मिलान को overlap करता है। count argument कितने को बदलता है उसे सीमित करता है, और क्योंकि हर कॉल एक नई स्ट्रिंग देता है आप उन्हें chain कर सकते हैं: text.replace(",", "").replace(" ", "_")

विभाजन और जुड़ना

split() एक स्ट्रिंग को एक separator पर टुकड़ों में काटता है और उन्हें एक list के रूप में देता है। आप इसे बताते हैं कि किस पर काटना है:

split() एक separator पर विभाजित करता है और segments को एक list के रूप में देता है। बिना argument के कॉल किया, यह किसी भी व्हाइटस्पेस run पर विभाजित करता है और कई consecutive spaces से empty strings को त्यागता है:

split(sep) बाएं-दाएं स्कैन करता है, sep की हर non-overlapping occurrence पर विभाजित करता है। बिना argument के यह एक अलग algorithm का उपयोग करता है: यह किसी भी व्हाइटस्पेस run पर विभाजित करता है और परिणाम से leading और trailing व्हाइटस्पेस को strips करता है। rsplit(sep, n) दाएं से विभाजित करता है, एक dotted path या namespaced identifier के अंतिम segment को अलग करने के लिए उपयोगी।

python
csv_row = "राज,28,दिल्ली"
parts = csv_row.split(",")     # ["राज", "28", "दिल्ली"]

"  hello   world  ".split()   # ["hello", "world"]

split() एक list देता है, मानों का एक क्रमबद्ध अनुक्रम। उन्हें अपने Lists अध्याय मिलता है; अब के लिए उन्हें split() produces और join() consumes करने वाले भागों के अनुक्रम के रूप में मानें।

join() विपरीत करता है: यह strings के एक list को एक में संयोजित करता है। .join() से पहले वाली स्ट्रिंग प्रत्येक item के बीच रखी जाती है:

python
words = ["Hello", "world"]

" ".join(words)    # "Hello world"
", ".join(words)   # "Hello, world"
"".join(words)     # "Helloworld"

याद रखने के लिए pattern: separator.join(list_of_strings)। separator बाएं जाता है, list दाएं जाता है। " ".join(words) हर शब्द के बीच एक स्पेस रखता है। "".join(words) उन्हें बीच में कुछ के बिना glue करता है।

join() सही उपकरण है जब भी आप कई टुकड़ों से एक एकल स्ट्रिंग जोड़ रहे हैं। यह एक एकल allocation करता है बजाय प्रत्येक चरण पर एक नई स्ट्रिंग बनाने के। दो या तीन strings के लिए, + बिल्कुल ठीक है। एक बार जब आप किसी भी महत्वपूर्ण आकार की एक list है, join() के लिए पहुंचें।

join() टुकड़ों को एक बार चलता है, कुल आकार का पता लगाता है, एकल बार परिणाम आवंटित करता है, और सब कुछ में लिखता है। एक loop में repeated + के साथ एक ही स्ट्रिंग बनाना महंगा रूप है: क्योंकि strings बदल नहीं सकते, हर + एक ताज़ी स्ट्रिंग आवंटित करता है और अब तक सब कुछ को कॉपी करता है, इसलिए लागत टुकड़ों की संख्या के साथ वर्ग में बढ़ता है। कुछ strings पर कोई नहीं देखता, लेकिन कुछ हज़ार पर यह एक तेज़ ऑपरेशन को धीमा कर देता है। नियम जो इसे रोकता है: टुकड़ों को एक list में collect करें और अंत में एक बार join() करें, कभी भी एक loop में string += न करें।

Junoआवश्यक स्ट्रिंग तरीके इनमें से हर एक एक नई स्ट्रिंग देता है, इसलिए परिणाम को असाइन करें या यह चली गई है। handful आप दैनिक के लिए पहुंचेंगे: .lower() और .upper() case के लिए, .strip() stray spaces को trim करने के लिए, .find() टेक्स्ट को locate करने के लिए (यह `-1` देता है जब यह नहीं है), .replace() टेक्स्ट को स्वैप करने के लिए, और .split() के साथ sep.join() एक स्ट्रिंग को अलग करने और इसे वापस एक साथ रखने के लिए।
Junoआवश्यक स्ट्रिंग तरीके इन सभी एक नई स्ट्रिंग देते हैं, कोई भी mutate नहीं करते, तो उन्हें chain करें या असाइन करें। gotchas को सीधा रखें: .strip("x") trim करने के लिए वर्णों का एक सेट लेता है, एक prefix नहीं, और .split() बिना argument के व्हाइटस्पेस की run को collapse करता है। कई टुकड़ों को जोड़ने के लिए, एक list बनाएं और इसे sep.join() करें।
Junoआवश्यक स्ट्रिंग तरीके दो traps जो वास्तविक कोड में काटते हैं: .strip(chars) सिरों से character set को strips करता है, एक prefix नहीं, तो prefix का मतलब होने पर removeprefix() का उपयोग करें, और loop में `+=` के साथ एक स्ट्रिंग बनाना धीमा रूप है, तो एक list में collect करें और एक बार `join()` करें। तुलना के लिए, .casefold() के साथ normalize करें .lower() पर, और .title() को display-only के रूप में मानें क्योंकि यह contractions को mangle करता है।

f-स्ट्रिंग्स

f-strings values को सीधे टेक्स्ट के अंदर embed करते हैं। opening quote से पहले f रखें, फिर किसी भी वेरिएबल या expression को curly braces में लपेटें। Python जब कोड चलता है तो इसे भरता है। आप मान के बाद एक colon भी जोड़ सकते हैं कि यह कैसे प्रदर्शित होता है, इसे नियंत्रित करने के लिए।

f-strings runtime पर {} के अंदर किसी भी expression का मूल्यांकन करते हैं और परिणाम को एक स्ट्रिंग में परिवर्तित करते हैं। एक colon braces के अंदर एक format spec का परिचय देता है: दशमलव स्थानों, alignment, और number formatting को नियंत्रित करने के लिए एक compact syntax।

एक f-string में प्रत्येक {} मान के अपने __format__ method को कॉल करने के साथ समाप्त होता है (एक dunder, double-underscore method जिसे Python colon के बाद आपने जो लिखा है वह पास करते हुए जब यह एक मान को फॉर्मेट करता है), तो कोई भी class जिसे आप लिखते हैं यह तय कर सकते हैं कि यह __format__ को परिभाषित करके एक f-string के अंदर कैसे दिखाई देता है। conversion flags !r, !s, और !a मान पर repr(), str(), या ascii() को पहले चलाते हैं; !r वह है जिसे रखें, क्योंकि यह एक मान को दिखाता है जिस तरीके से आप इसे कोड में टाइप करते हैं, quotes और escapes के साथ, जो नीचे practice में दिखाया गया है।

python
name = "Alice"
score = 94.5

print(f"Hello, {name}!")           # "Hello, Alice!"
print(f"Score: {score:.1f}%")      # "Score: 94.5%"
print(f"2 + 2 = {2 + 2}")          # "2 + 2 = 4"
print(f"Name: {name.upper()}")     # "Name: ALICE"

: के बाद format spec मान को नियंत्रित करता है कि कैसे प्रदर्शित होता है:

Specअर्थउदाहरण
.2f2 दशमलव स्थानf"{3.14159:.2f}""3.14"
.0%प्रतिशत, कोई दशमलव नहींf"{0.94:.0%}""94%"
,हज़ार separatorf"{1000000:,}""1,000,000"
>1010 chars में right-alignf"{'hi':>10}"" hi"

आप सबसे अधिक .2f का उपयोग करेंगे: किसी भी समय आप दशमलव दिखाते हैं और एक tidy संख्या चाहते हैं बजाय digits की एक लंबी run के। table में सब कुछ और वहां है जब आपको इसकी ज़रूरत हो। आप {} के अंदर कोई भी वेरिएबल, arithmetic, या method call रख सकते हैं।

.2f और .0% सबसे अधिक display formatting को cover करते हैं। alignment specifiers (>, <, ^) एक width के साथ मिलकर tabular output देते हैं। सामान्य pattern है {value:[align][width][.precision][type]}। एक बार जब आप pieces को recognize करते हैं, कोई भी spec सभी combinations को memorize किए बिना readable है।

एक ही spec विभिन्न प्रकारों के लिए विभिन्न चीजें माने सकते हैं, क्योंकि हर प्रकार अपने आप को फॉर्मेट करता है: f"{'hi':5}" दाएं पर text को pads करता है जबकि f"{42:5}" बाएं पर एक संख्या को pads करता है, एक ही :5, विपरीत परिणाम। conversion flag जो एक habit के लायक है !r है: यह फॉर्मेटिंग से पहले repr() चलाता है, जो strings को quotes में लपेटता है और अदृश्य वर्णों (tabs, trailing spaces, newlines) को दृश्य escape sequences में बदल देता है। जब output subtly गलत दिखता है, {value} को {value!r} के लिए स्वैप करना वह है जो वास्तव में वहां है देखने का सबसे तेज़ तरीका है।

Junof-strings opening quote से पहले `f` रखें, फिर किसी भी variable, sum, या method call को `{}` में लपेटें और Python जब line चलता है तो result को drop करता है। एक colon braces के अंदर देखो को control करता है: :.2f two decimal places के लिए वह है जिस पर आप lean करेंगे। `+` के साथ टेक्स्ट को glue करने से बहुत ज़्यादा tidier।
Junof-stringsf"..." `{}` में किसी भी expression का मूल्यांकन करता है और result को सीधे drop करता है, कोई `str()` की जरूरत नहीं। एक colon के बाद format spec आता है: `:.2f`, `:,`, `:>10` और दोस्त, सभी {value:[align][width][.precision][type]} को follow करते हैं। एक बार parts को सीखें और आप सभी spec को memorize किए बिना read कर सकते हैं।
Junof-strings प्रत्येक `{}` मान के अपने `__format__` को कॉल करता है, इसलिए colon के बाद spec का अर्थ जो भी वह प्रकार तय करता है, जो यही कारण है कि `:5` text और numbers को विपरीत दिशा में pads करता है। flag को keep करने के लिए `!r` है: यह एक मान को दिखाता है जिस तरीके से आप इसे type करेंगे, तो stray whitespace और अन्य invisible junk तुरंत निकल जाता है जब output off दिखता है।

मल्टीलाइन स्ट्रिंग्स

एक स्ट्रिंग लिखने के लिए जो एक से अधिक lines में फैली हो, triple quote marks का उपयोग करें: शुरुआत में तीन " और अंत में तीन। Python सभी line breaks और spacing को ठीक उसी तरह preserve करता है जैसे आपने उन्हें लिखा।

Triple-quoted strings सभी whitespace और line breaks को literally preserve करती हैं। वे लंबे टेक्स्ट blocks जैसे email templates और SQL queries के लिए मानक हैं, और docstrings के लिए: inline documentation जो एक function या class body के शुरुआत में रखी जाती है।

एक triple-quoted string हर वर्ण को exactly रखता है, leading spaces सहित हर line पर, जो catch है: literal को अपने कोड से match करने के लिए indent करें और वह indentation text के अंदर land करता है। जब यह एक function, class, या module में पहली statement है, Python इसे उस object के docstring के रूप में रखता है (documentation जो help() इसके लिए दिखाता है), तो convention यह है कि एक short summary वहां रखें। एक triple-quoted block को अपने surroundings से match करने के लिए indent करने के लिए बिना indentation को value में leak किए, runtime पर textwrap.dedent() के साथ इसे strip करें। Triple ''' और """ same काम करते हैं; """ convention है।

python
message = """
Dear Alice,

Thank you for your order.

Best regards,
The Team
"""
Junoमल्टीलाइन स्ट्रिंग्स हर अंत में तीन quote marks एक स्ट्रिंग को कई lines में चलने देते हैं, और Python हर line break और space को ठीक उसी तरह रखता है जैसे आपने उन्हें type किया। उन्हें reach करें जब भी आपके पास टेक्स्ट का एक block हो, जैसे एक संदेश या एक template, जो comfortably एक line पर fit नहीं होगा।
Junoमल्टीलाइन स्ट्रिंग्स Triple quotes line breaks और spacing को verbatim preserve करते हैं, तो वे email templates, SQL, और किसी भी long block के लिए suit करते हैं। वे भी यह हैं कि कैसे docstrings काम करते हैं: एक triple-quoted string एक function या class के top पर इसका inline documentation बन जाता है। indentation को देखो, क्योंकि spaces जिन्हें आप इसे line up के लिए जोड़ते हैं वह text के अंदर end up करते हैं।
Junoमल्टीलाइन स्ट्रिंग्स Triple quotes के अंदर सब कुछ literally keep किया जाता है, leading whitespace included, जो trap है: literal को अपने कोड से match करने के लिए indent करें और वह indent value में land करता है। एक short one को एक function या class के top पर रखें और यह docstring बन जाता है जो `help()` दिखाता है। जब आपको source में indent की ज़रूरत हो लेकिन value में clean हो, इसे `textwrap.dedent()` के through चलाएं।

एस्केप sequences

कुछ वर्ण एक स्ट्रिंग के अंदर सीधे type करना कठिन होते हैं। Python escape sequences का उपयोग करता है: एक backslash जो कुछ के लिए खड़ा एक letter द्वारा पीछा किया। दो आप लगातार उपयोग करेंगे \n एक नई line के लिए और \t एक tab के लिए।

Escape sequences आपको वह वर्णों को embed करने देते हैं जो अन्यथा syntax को break करेंगे या सीधे type नहीं किए जा सकते। जो आप पहुंचेंगे: \n (newline), \t (tab), \\ (एक literal backslash), \" और \' (quotes एक matching-delimiter string के अंदर)। Windows paths को backslashes की जरूरत है, जो escape processing से collide करते हैं। escape को disable करने के लिए r के साथ prefix करें।

रोज़मर्रा के \n और \t से परे, Python Unicode escapes को support करता है वर्णों के लिए जिन्हें आप सीधे type नहीं कर सकते: \uXXXX और \UXXXXXXXX एक वर्ण को संख्या द्वारा name करते हैं, और \N{name} इसे शब्दों में name करते हैं, जैसे \N{GREEK SMALL LETTER ALPHA}। वास्तविक कोड में reach करने के लिए raw string है, r"..." लिखा, जो escape handling को completely बंद कर देता है और हर backslash को unchanged pass करता है। इसे Windows paths के लिए और regular expression patterns के लिए उपयोग करें, जहां backslashes उस consumer के लिए हैं बजाय Python के लिए, और जहां r भूलने से patterns शांत तरीके से गलत चीज़ को match करते हैं।

Sequenceवर्ण
\nNewline
\tTab
\\Literal backslash
\"Double quote
\'Single quote
python
print("Line one\nLine two")        # two lines of output
print("Name:\tAlice")              # Name:   Alice
path = r"C:\Users\Alice\Documents" # raw string, no escape processing
Junoएस्केप sequences एक स्ट्रिंग के अंदर backslash का अर्थ है "अगले वर्ण को read करें specially": `\n` एक नई line शुरू करता है, `\t` एक tab insert करता है, `\\` एक real backslash है। वह दो, `\n` और `\t`, वह हैं जिन्हें आप actually type करेंगे। quote से पहले `r` pop करें और backslashes plain वापस जाते हैं, Windows paths के लिए handy।
Junoएस्केप sequences\n, `\t`, `\\`, और `\"` रोज़मर्रा के escapes को cover करते हैं। जो headaches बचाता है वह है: एक raw string, `r"..."`, escape processing को switch ऑफ करते हैं तो हर backslash literal रहता है। इसे Windows paths और regex patterns के लिए उपयोग करें, जहां backslashes कुछ और के लिए हैं Python के बजाय।
Junoएस्केप sequences `\n` और `\t` के past वहां Unicode escapes हैं जैसे `\N{name}`, लेकिन workhorse है raw string `r"..."`, जो हर backslash को untouched pass करता है। Regex patterns और Windows paths पर reach करें, क्योंकि `r` भूलने से आपको एक pattern मिलता है जो quietly गलत चीज़ को match करता है बजाय एक error के जो आपको बताता है।

स्ट्रिंग कंटेंट्स को check करना

Python के पास methods हैं जो yes/no प्रश्न स्ट्रिंग में क्या contains है के बारे में उत्तर देते हैं। वे True या False देते हैं। सबसे उपयोगी जल्दी: isdigit() आपको check करने देता है कि क्या एक स्ट्रिंग सभी numbers है convert करने से पहले, तो आप unexpected input पर एक crash avoid कर सकते हैं।

is* methods हर एक पूरी स्ट्रिंग की एक specific property test करते हैं और True केवल return करते हैं यदि हर character condition को satisfy करता है। उनका main use input validation है: crash से बचने के लिए convert करने से पहले check करें unexpected input पर। isdigit() int() से पहले classic pattern है, एक alternative ValueError को catch करने के लिए जो Files and exceptions chapter में covered है।

ये checks पूछते हैं "क्या हर character इस kind का है" सभी Unicode में, केवल plain ASCII letters और digits नहीं। इसका अर्थ है "2".isdigit() True है superscript two के लिए भी plain "2" के साथ, जो surprising input को एक validation check पास कर सकता है। जब आप strictly digits 0 को 9 माने हैं, combine s.isascii() and s.isdigit()isnumeric() भी wider है, fractions और other numeric-valued characters counting, तो first जो सही दिखता है बजाय जो आप actually accept करते हैं narrowest check reach करें।

python
"42".isdigit()       # True
"hello".isalpha()    # True
"hello42".isalnum()  # True
"   ".isspace()      # True
"Hello".islower()    # False
"HELLO".isupper()    # True
Junoस्ट्रिंग कंटेंट्स को check करना `is*` methods yes-or-no प्रश्न का उत्तर देते हैं और `True` केवल return करते हैं जब हर character fit हो। जो आप पहली बार उपयोग करेंगे: `isdigit()` `int()` से पहले call करें ताकि confirm हो कि text वास्तव में एक number है, तो odd input आपको crash नहीं करेगा।
Junoस्ट्रिंग कंटेंट्स को check करना हर `is*` method `True` है केवल यदि पूरी string passes, जो उन्हें handy बनाता है convert करने से पहले input validate करने के लिए। `isdigit()` `int()` से पहले classic guard है। याद रखें यह पूरी string को test कर रहा है, तो एक empty string सभी के लिए `False` return करता है।
Junoस्ट्रिंग कंटेंट्स को check करना ये checks सभी Unicode में span करते हैं, plain ASCII नहीं, तो `isdigit()` superscripts और other numeric characters pass करता है आप mean नहीं किया। जब आप digits `0` को `9` माने हैं, pair करें: `s.isascii() and s.isdigit()`। अपने real input के लिए पहली narrowest check pick करें जो close दिखता है।

व्यावहारिक रूप से

Whitespace को strip करें, case को normalize करें, फिर जो आपको चाहिए उसे pull out करें। यह sequence लगभग किसी भी यूजर-provided text को संभालता है:

python
raw_input = "  [email protected]  "
email = raw_input.strip().lower()   # "[email protected]"

at_pos = email.find("@")
username = email[:at_pos]
domain = email[at_pos + 1:]

print(f"User:   {username}")    # "alice"
print(f"Domain: {domain}")      # "example.com"

एक URL को parts से build करना और immediately validate और parse करना:

python
BASE_URL = "https://api.example.com"
version = "v2"
resource = "users"
user_id = 42

url = f"{BASE_URL}/{version}/{resource}/{user_id}"
# "https://api.example.com/v2/users/42"

parts = url.split("://")              # ["https", "api.example.com/v2/users/42"]
protocol = parts[0]                   # "https"
secured = url.startswith("https")
domain = parts[1].split("/")[0]       # "api.example.com"

print(f"Protocol : {protocol}")
print(f"Secure   : {secured}")
print(f"Domain   : {domain}")

एक structured log line को parse करना find(), slicing, और f-string alignment का उपयोग करते हुए:

python
log_entry = "[2024-01-15 09:42:11] ERROR: File not found: report.csv"

timestamp = log_entry[1:20]
rest = log_entry[22:]                # "ERROR: File not found: report.csv"
colon_pos = rest.find(":")
level = rest[:colon_pos]             # "ERROR"
message = rest[colon_pos + 2:]       # "File not found: report.csv"

print(f"[{timestamp}] {level:>8}: {message}")
# [2024-01-15 09:42:11]    ERROR: File not found: report.csv

find() boundary को locate करता है, slicing parts को extract करता है, और >8 format spec severity label को right-align करता है तो columns consistent रहते हैं जब level names length में differ करते हैं।

Method संदर्भ

Methodयह क्या करता है
.lower() / .upper()सभी lowercase / सभी uppercase में convert करें
.title() / .capitalize()हर word को capitalize करें / केवल पहले को
.strip() / .lstrip() / .rstrip()Surrounding whitespace हटाएं
.find(sub)पहली मिलान का index, या -1
.count(sub)कितनी बार sub appear होता है
.startswith(s) / .endswith(s)Prefix / suffix check
.replace(old, new)Occurrences को replace करें
.split(sep)एक list में split करें
sep.join(iterable)Items को एक स्ट्रिंग में join करें
.isdigit() / .isalpha() / .isalnum()Character type checks