📝 آموزش کامل رشته‌ها در پایتون (Strings)

از تعریف و اندیس‌گذاری تا برش (slicing)، متدهای پیشرفته، f-string و تمرینات عملی | آکادمی غیاثی

📑 آنچه در این مقاله می‌خوانید

🔰 رشته (String) چیست؟

در پایتون، رشته (String) یک نوع داده برای ذخیره‌سازی متن است. هر چیزی که داخل علامت نقل قول قرار بگیرد، یک رشته محسوب می‌شود. رشته‌ها در پایتون بسیار قدرتمند هستند و امکانات زیادی برای کار با متن ارائه می‌دهند.

📌 نکته مهم: رشته‌ها در پایتون تغییرناپذیر (Immutable) هستند، یعنی پس از ایجاد نمی‌توان یک کاراکتر خاص را مستقیماً تغییر داد.

📝 تعریف رشته و کاراکتر

در پایتون، رشته مجموعه‌ای از کاراکترهاست. هر حرف، عدد، فاصله یا نشانه‌ای که تایپ می‌کنیم یک کاراکتر محسوب می‌شود. رشته‌ها با علامت ' یا " محصور می‌شوند.

🐍 تعریف رشته
text1 = 'سلام دنیا'
text2 = 'Hello world'
text3 = '12345'  # این هم رشته است چون داخل ' ' است
💡 توجه کنید که '12345' رشته است، اما 12345 (بدون نقل قول) عدد صحیح (int) است.

〽️ استفاده از نقل قول‌ها و Escape Characters

اگر داخل رشته نیاز به استفاده از علامت نقل قول داشته باشیم، دو راه داریم:

🐍 استفاده از نقل قول در رشته
print('I\'m OK, How are you?')
print('He said: "Python is fun!"')
print("My name is \"Erfan\"")
⚠️ Escape Characters پرکاربرد:
- \' : نمایش یک ' داخل رشته
- \" : نمایش یک " داخل رشته
- \n : رفتن به خط جدید (new line)
- \t : فاصله tab

📄 رشته‌های چندخطی (Triple Quotes)

برای نوشتن متن‌های چندخطی می‌توان از سه علامت نقل قول استفاده کرد: """ یا '''

🐍 رشته چندخطی
print("""سلام
نام من "عرفان" است.
حالت چطوره؟""")

📏 طول رشته با تابع len()

برای به‌دست آوردن تعداد کاراکترهای یک رشته از تابع len() استفاده می‌کنیم. فاصله‌ها و علامت‌ها هم شمرده می‌شوند.

🐍 محاسبه طول رشته
s = 'Hello'
print(len(s))  # خروجی: 5
s2 = 'سلام دنیا'
print(len(s2))  # خروجی: 9 (شامل فاصله)

🎯 اندیس‌گذاری (Indexing) — مثبت و منفی

در پایتون، هر کاراکتر یک رشته یک اندیس (index) دارد. اندیس‌ها از صفر شروع می‌شوند. همچنین می‌توان از اندیس‌های منفی از انتهای رشته استفاده کرد.

🐍 دسترسی به کاراکترها با اندیس
name = 'Python'
print(name[0])   # P
print(name[2])   # t
print(name[-1])  # n (آخرین حرف)
print(name[-2])  # o (یکی مانده به آخر)
⚠️ اگر اندیس خارج از محدوده طول رشته باشد، خطای IndexError رخ می‌دهد.

✂️ برش رشته (Slicing) — ۴ حالت اصلی

برای استخراج بخشی از یک رشته از برش (slicing) استفاده می‌کنیم. فرمت کلی:

🐍 فرمت برش
string[start:end:step]

۴ حالت اصلی برش:

🐍 حالت‌های مختلف برش
a = 'Hello world'
print(a[1:4])    # 1. [start:end] → 'ell'
print(a[:5])      # 2. [:end] → 'Hello'
print(a[6:])      # 3. [start:] → 'world'
print(a[:])       # 4. [:] → کل رشته: 'Hello world'
💡 نکته: در برش، اندیس end شامل نمی‌شود. یعنی a[1:4] اندیس‌های 1، 2 و 3 را برمی‌گرداند.

🔄 برعکس کردن رشته [::-1]

با استفاده از step منفی می‌توان رشته را برعکس کرد:

🐍 برعکس کردن رشته
text = 'Python'
print(text[::-1])  # 'nohtyP'
🎯 کاربرد: بررسی پالیندروم (کلماتی که از چپ و راست یکسان خوانده می‌شوند مثل "radar" یا "noon").

✨ f-string — قالب‌بندی مدرن رشته‌ها

f-string بهترین و خواناترین روش برای ترکیب متن و متغیرها در پایتون است. فقط کافی است قبل از رشته یک f یا F قرار دهیم و متغیرها را داخل {} بنویسیم.

🐍 استفاده از f-string
name = 'عرفان'
age = 32
city = 'بوشهر'
info = f'سلام {name}! شما {age} سال دارید و اهل {city} هستید.'
print(info)
💡 f-stringها از پایتون 3.6 به بعد در دسترس هستند و نسبت به روش‌های قدیمی (+ و %) بسیار سریع‌تر و خواناتر هستند.

⌨️ دریافت ورودی از کاربر (input)

برای دریافت اطلاعات از کاربر از تابع input() استفاده می‌کنیم. نکته مهم: خروجی input() همیشه از نوع رشته (str) است.

🐍 گرفتن ورودی از کاربر
name = input('نام خود را وارد کنید: ')
age = int(input('سن خود را وارد کنید: '))  # تبدیل به عدد
print(f'سلام {name}! شما {age} سال دارید.')
⚠️ اگر ورودی عددی می‌خواهید، حتماً با int() یا float() آن را تبدیل کنید.

🛠️ متدهای مهم رشته‌ها (String Methods)

متدها توابعی هستند که روی یک رشته (یا هر داده دیگری) اجرا می‌شوند و کاری روی آن انجام می‌دهند. در پایتون رشته‌ها متدهای بسیار مفیدی دارند که در ادامه کامل یاد می‌گیریم.

📌 1. متد lower() — تبدیل به حروف کوچک

متد lower() تمام حروف بزرگ یک رشته را به حروف کوچک تبدیل می‌کند. این متد برای مقایسه رشته‌ها بدون توجه به بزرگ یا کوچک بودن حروف بسیار مفید است.

🐍 مثال lower()
text = 'PYTHON Programming'
print(text.lower())  # python programming
✍️ تمرین: رشته "Hello World" را به همه حروف کوچک تبدیل کنید.

📌 2. متد upper() — تبدیل به حروف بزرگ

متد upper() تمام حروف کوچک یک رشته را به حروف بزرگ تبدیل می‌کند.

🐍 مثال upper()
text = 'Python programming'
print(text.upper())  # PYTHON PROGRAMMING

📌 3. متد strip() — حذف فاصله از ابتدا و انتها

گاهی کاربران هنگام ورود اطلاعات، فاصله اضافی وارد می‌کنند. متد strip() این فاصله‌ها را از ابتدا و انتهای رشته حذف می‌کند. فاصله‌های وسط را حذف نمی‌کند.

🐍 مثال strip()
text = '   Hello world   '
print(f'|{text.strip()}|')  # |Hello world|
💡 نکته: متدهای lstrip() فقط فاصله‌های ابتدا و rstrip() فقط فاصله‌های انتها را حذف می‌کنند.

📌 4. متد split() — تکه تکه کردن رشته

متد split() یک رشته را بر اساس یک جداکننده (separator) به چند تکه تقسیم می‌کند و نتیجه را به صورت لیست برمی‌گرداند. این یکی از پرکاربردترین متدهاست.

🐍 مثال split()
sentence = 'Python is fun and powerful'
words = sentence.split(' ')  # تقسیم بر اساس فاصله
print(words)  # ['Python', 'is', 'fun', 'and', 'powerful']
🐍 split با جداکننده کاما
data = 'apple,banana,orange'
fruits = data.split(',')
print(fruits)  # ['apple', 'banana', 'orange']
✍️ تمرین: جمله "I love Python" را با استفاده از split() به کلمات جداگانه تقسیم کنید.

📌 5. متد replace() — جایگزینی زیررشته

متد replace(old, new) تمام رخدادهای یک زیررشته را با زیررشته دیگری جایگزین می‌کند. رشته اصلی تغییر نمی‌کند، بلکه یک رشته جدید برمی‌گرداند.

🐍 مثال replace()
text = 'I like apples and apples are tasty'
new_text = text.replace('apples', 'oranges')
print(new_text)  # I like oranges and oranges are tasty
💡 نکته: می‌توانید تعداد جایگزینی را مشخص کنید: replace('a', 'b', 2) فقط دو بار اول را جایگزین می‌کند.

📌 6. متد count() — شمارش تعداد زیررشته

متد count(sub) تعداد دفعات تکرار یک زیررشته را در رشته اصلی شمارش می‌کند. به حروف بزرگ و کوچک حساس است.

🐍 مثال count()
text = 'hello hello hello world'
print(text.count('hello'))  # 3
print(text.count('HELLO'))  # 0 (چون حساس به کوچکی/بزرگی است)

📌 7. متدهای index() و find() — پیدا کردن موقعیت زیررشته

این دو متد اولین موقعیت (ایندکس) یک زیررشته را در رشته اصلی پیدا می‌کنند.

🐍 مثال find() و index()
text = 'Python programming is fun'
print(text.find('pro'))     # 7
print(text.find('java'))     # -1 (پیدا نشد، خطا نمی‌دهد)
print(text.index('pro'))     # 7
# print(text.index('java'))  # خطا ValueError می‌دهد
💡 توصیه: اگر مطمئن نیستید زیررشته وجود دارد، از find() استفاده کنید تا خطا نگیرید.

📌 8. متدهای startswith() و endswith() — بررسی شروع و پایان

این متدها بررسی می‌کنند که آیا رشته با یک زیررشته خاص شروع می‌شود یا پایان می‌یابد. خروجی True یا False است.

🐍 مثال startswith() و endswith()
filename = 'document.pdf'
print(filename.startswith('doc'))  # True
print(filename.endswith('.pdf'))    # True
print(filename.endswith('.txt'))    # False

📌 9. متد join() — چسباندن اعضای لیست به هم

متد join() برعکس split() عمل می‌کند: اعضای یک لیست را با یک جداکننده به هم می‌چسباند و یک رشته می‌سازد.

🐍 مثال join()
words = ['Python', 'is', 'awesome']
sentence = ' '.join(words)  # با فاصله جدا کن
print(sentence)  # Python is awesome

items = ['apple', 'banana', 'orange']
result = ', '.join(items)
print(result)  # apple, banana, orange

📌 10. متدهای بررسی محتوا: isalpha(), isdigit(), isalnum()

🐍 مثال isalpha() و isdigit() و isalnum()
print('hello'.isalpha())   # True
print('hello123'.isalpha()) # False
print('12345'.isdigit())    # True
print('123ab'.isalnum())    # True
print('123 ab'.isalnum())   # False (فاصله مجاز نیست)

🔄 حلقه for — پیمایش کاراکترهای رشته

حلقه `for` یکی از پرکاربردترین ساختارها در پایتون است. با استفاده از حلقه `for` می‌توانیم روی هر چیزی که «قابل پیمایش» است (مانند رشته‌ها، لیست‌ها، تاپل‌ها و ...) حلقه بزنیم و به هر عضو دسترسی پیدا کنیم.

📌 ایده اصلی: حلقه `for` یعنی «برای هر عضو داخل این مجموعه، یک کار خاص انجام بده».

🔹 فرمت کلی حلقه for

🐍 فرمت حلقه for
for متغیر_موقت in مجموعه:
    # کاری که می‌خواهیم انجام دهیم

توضیح: متغیر_موقت هر بار یکی از اعضای مجموعه را می‌گیرد و کد داخل حلقه اجرا می‌شود. این کار تا زمانی ادامه پیدا می‌کند که همه اعضا پیمایش شوند.

🔹 پیمایش کاراکترهای یک رشته

یک رشته مجموعه‌ای از کاراکترهاست. پس می‌توان با حلقه `for` روی آن پیمایش کرد و به هر کاراکتر دسترسی داشت:

🐍 پیمایش رشته با for
text = 'Python'
for char in text:
    print(char)

خروجی:

📟 خروجی
P
y
t
h
o
n
💡 نکته: متغیر char در هر بار اجرای حلقه، مقدار یک کاراکتر جدید از رشته می‌گیرد. شما می‌توانید نام این متغیر را هر چیزی بگذارید (مثل i، c، letter و ...).

🔹 پیمایش با دسترسی به ایندکس (حالت حرفه‌ای)

گاهی نیاز داریم هم به ایندکس (موقعیت) کاراکتر دسترسی داشته باشیم و هم به خود کاراکتر. این کار با ترکیب range() و len() انجام می‌شود:

🐍 پیمایش با ایندکس
text = 'Python'
for i in range(len(text)):
    print(f'ایندکس {i} : {text[i]}')

خروجی:

📟 خروجی
ایندکس 0 : P
ایندکس 1 : y
ایندکس 2 : t
ایندکس 3 : h
ایندکس 4 : o
ایندکس 5 : n
💡 توضیح تابع range():
range(len(text)) اعداد 0 تا طول رشته منهای یک را تولید می‌کند. مثلاً برای رشته "Python" با طول 6، اعداد 0 تا 5 را می‌سازد.

🔹 مثال عملی: شمارش حروف خاص در رشته

فرض کنید می‌خواهیم تعداد حروف 'a' را در یک رشته بشماریم:

🐍 شمارش حرف 'a'
text = 'banana'
count = 0
for char in text:
    if char == 'a':
        count = count + 1
print(f'تعداد حرف a: {count}')  # خروجی: 3

🔹 مثال عملی: ساختن یک رشته جدید با تغییر کاراکترها

فرض کنید می‌خواهیم همه حروف 'a' را به 'o' تبدیل کنیم:

🐍 جایگزینی کاراکتر با حلقه for
text = 'banana'
new_text = ''
for char in text:
    if char == 'a':
        new_text = new_text + 'o'
    else:
        new_text = new_text + char
print(new_text)  # خروجی: bonono
💡 توجه کنید که چون رشته‌ها immutable (تغییرناپذیر) هستند، نمی‌توانیم مستقیم کاراکتر را عوض کنیم. به همین دلیل یک رشته خالی ساخته و کاراکترهای جدید را به آن اضافه می‌کنیم.

🔹 استفاده از enumerate() برای دسترسی همزمان به ایندکس و مقدار

تابع enumerate() روشی زیباتر و حرفه‌ای‌تر برای پیمایش با ایندکس است:

🐍 استفاده از enumerate()
text = 'Python'
for index, char in enumerate(text):
    print(f'کاراکتر {char} در ایندکس {index} قرار دارد')
🎯 نتیجه‌گیری مهم:
- اگر فقط به خود کاراکترها نیاز دارید → از for char in text: استفاده کنید.
- اگر به ایندکس هم نیاز دارید → از enumerate() یا range(len()) استفاده کنید.
- حلقه `for` یکی از قدرتمندترین ابزارهای پایتون است و در پروژه‌های واقعی دائماً از آن استفاده خواهید کرد.
✍️ تمرین:
برنامه‌ای بنویسید که یک رشته از کاربر بگیرد و با حلقه `for`:
  1. تعداد فاصله‌های داخل رشته را بشمارد.
  2. تعداد حروف بزرگ را بشمارد.
  3. تعداد حروف کوچک را بشمارد.
(راهنمایی: از متدهای isupper() و islower() استفاده کنید)

⚠️ تغییرناپذیری رشته‌ها (Immutability)

در پایتون، رشته‌ها تغییرناپذیر (immutable) هستند؛ یعنی پس از ایجاد، نمی‌توان یک کاراکتر خاص را مستقیماً تغییر داد.

❌ کد زیر خطا می‌دهد:
text = 'Python'
text[0] = 'J'  # TypeError! رشته‌ها تغییرناپذیرند
✅ راه‌حل: باید یک رشته جدید بسازید.
text = 'J' + text[1:]  # 'Jython'
💡 نکته مهم: توابعی مانند upper()، lower()، replace() و ... رشته اصلی را تغییر نمی‌دهند، بلکه یک رشته جدید برمی‌گردانند. پس همیشه نتیجه را در یک متغیر جدید ذخیره کنید.

❌ اشتباهات رایج هنگام کار با رشته‌ها

💡 نکته طلایی: همیشه قبل از استفاده از اندیس، مطمئن شوید رشته خالی نیست و طول کافی دارد.

✍️ تمرینات پایانی

تمرین 1: استخراج حروف اول و آخر
برنامه‌ای بنویسید که یک اسم از کاربر بگیرد و حرف اول و آخر آن را چاپ کند.
تمرین 2: برعکس کردن اسم
اسم کاربر را گرفته و آن را برعکس چاپ کنید.
تمرین 3: پالیندروم
کلمه‌ای از کاربر بگیرید و بررسی کنید آیا با برعکس خودش برابر است یا نه (مثال: "radar").
تمرین 4: حذف فاصله‌ها و تبدیل به حروف کوچک
یک جمله از کاربر بگیرید، فاصله‌های اضافی ابتدا و انتها را حذف کرده و همه حروف را به کوچک تبدیل کنید.
تمرین 5: شمارش کلمات
یک جمله از کاربر بگیرید و تعداد کلمات آن را با استفاده از split() بشمارید.
تمرین 6: جایگزینی
یک جمله از کاربر بگیرید و کلمه "bad" را با "good" جایگزین کنید.
تمرین 7: اعتبارسنجی ورودی
از کاربر یک کد پستی (فقط رقم) بگیرید و با isdigit() بررسی کنید که آیا فقط از رقم تشکیل شده است یا نه.

📌 جدول متدهای پرکاربرد رشته‌ها

در جدول زیر لیستی از مهم‌ترین متدهای رشته‌ها به همراه توضیح و مثال آورده شده است:

متد توضیح مثال
lower() تبدیل همه حروف به کوچک 'PYTHON'.lower() → 'python'
upper() تبدیل همه حروف به بزرگ 'python'.upper() → 'PYTHON'
strip() حذف فاصله از ابتدا و انتها ' hi '.strip() → 'hi'
split(sep) تقسیم رشته به لیست بر اساس جداکننده 'a,b,c'.split(',') → ['a','b','c']
replace(old, new) جایگزینی زیررشته 'hello'.replace('e','a') → 'hallo'
count(sub) شمارش تعداد زیررشته 'ababa'.count('aba') → 1
find(sub) پیدا کردن ایندکس (اگر پیدا نکند -1) 'hello'.find('e') → 1
index(sub) پیدا کردن ایندکس (اگر پیدا نکند خطا) 'hello'.index('e') → 1
startswith(sub) آیا رشته با sub شروع می‌شود؟ 'hello'.startswith('he') → True
endswith(sub) آیا رشته با sub پایان می‌یابد؟ 'hello'.endswith('lo') → True
join(list) چسباندن اعضای لیست با جداکننده '-'.join(['a','b']) → 'a-b'
isalpha() آیا همه کاراکترها حرف هستند؟ 'abc'.isalpha() → True
isdigit() آیا همه کاراکترها رقم هستند؟ '123'.isdigit() → True
🎯 گام بعدی: پس از تسلط به رشته‌ها، سراغ لیست‌ها (Lists) بروید.
✅ کپی شد!