رشته‌ها

رشته در پایتون: اندیس‌گذاری، برش (slicing) و تغییرناپذیری

۳ دقیقه مطالعه · به‌روزرسانی ۲۲ مهر ۱۴۰۵

رشته (string، نوع str) دنباله‌ای از کاراکترهاست: حروف، ارقام، فاصله و کاراکترهای ویژه مثل @، # یا %. رشته را بین دو کوتیشن (") یا دو تک‌کوتیشن (') می‌نویسیم:

hi = "hello there"
greeting = 'hello'
print(hi, greeting)

در پایتون بین این دو هیچ فرقی نیست؛ فقط با هر کدام شروع کردید، با همان تمام کنید. این امکان وقتی به کار می‌آید که خود متن کوتیشن دارد: "It's ok" یا 'He said "hi"'.

عملیات روی رشته‌ها

print("ab" + "cd")      # چسباندن (concatenation): abcd
print(3 * "Ali")        # تکرار: AliAliAli
print(len("Salam"))     # طول رشته: 5
  • + بین دو رشته یعنی چسباندن (concatenation). هر دو طرف باید رشته باشند؛ "hi" + 3 خطای TypeError می‌دهد.
  • * بین عدد و رشته یعنی تکرار پشت سر هم.
  • len تعداد کاراکترها را می‌دهد (فاصله‌ها هم شمرده می‌شوند).

اندیس‌گذاری (Indexing)

هر کاراکتر یک شمارهٔ خانه (اندیس) دارد که از صفر شروع می‌شود:

 S   a   l   a   m
 0   1   2   3   4
-5  -4  -3  -2  -1
s = "Salam"
print(s[0])    # S
print(s[1])    # a
print(s[4])    # m
print(s[-1])   # m   ← آخرین کاراکتر
print(s[-2])   # a
  • تقریباً همهٔ زبان‌های برنامه‌نویسی (به‌جز چند استثنا مثل MATLAB) شمارش را از صفر شروع می‌کنند.
  • اندیس منفی از آخر می‌شمارد: -1 همیشه آخرین کاراکتر است، بدون اینکه طول رشته را بدانید.
  • بزرگ‌ترین اندیس مجاز len(s) - 1 است. s[5] روی رشتهٔ ۵ حرفی خطای IndexError می‌دهد.

برش (Slicing)

با : می‌شود یک تکه از رشته را جدا کرد:

s[شروع : پایان : گام]

قانون مهم: خانهٔ شروع جزو نتیجه هست، ولی خانهٔ پایان نیست. به زبان ریاضی، بازه از چپ بسته و از راست باز است. این قانون را تقریباً همه‌جای پایتون خواهید دید (در range، در لیست‌ها، …)، پس همین‌جا خوب یادش بگیرید.

s = "Salam"
print(s[1:3])    # al   ← خانه‌های ۱ و ۲ (نه ۳)
print(s[:3])     # Sal  ← از اول تا قبل از ۳
print(s[2:])     # lam  ← از ۲ تا آخر
print(s[:])      # Salam ← کپی کامل
print(s[::2])    # Slm  ← یکی در میان
print(s[::-1])   # malaS ← معکوس!
  • اگر شروع را ننویسید، از اول رشته شروع می‌شود.
  • اگر پایان را ننویسید، تا آخر رشته می‌رود.
  • گام پیش‌فرض ۱ است؛ گام منفی یعنی از آخر به اول.

یک مثال واقعی

name = "Hamrahe Aval"
print(len(name))       # 12
print(name[0:6])       # Hamrah
print(name[8:])        # Aval
print(name[-4:])       # Aval  ← چهار کاراکتر آخر

💡 برای «تا آخر رشته» بنویسید name[8:]، نه name[8:12] یا name[8:len(name)]. هر سه یک نتیجه دارند، ولی اولی کوتاه‌تر و خواناتر است و اگر طول رشته عوض شود، خراب نمی‌شود.

گرفتن رقم آخر یک عدد

برش فقط روی رشته کار می‌کند، نه روی عدد. برای جدا کردن ارقام یک عدد، اول آن را به رشته تبدیل کنید:

age = 35
print(str(age)[-1])   # '5' ← به‌صورت رشته
print(age % 10)       # 5   ← روش ریاضی، به‌صورت عدد

رشته‌ها تغییرناپذیرند (Immutable)

نمی‌شود یک کاراکتر از رشتهٔ موجود را عوض کرد:

s = "hello"
s[0] = "y"

اجرا کنید: TypeError: 'str' object does not support item assignment.

ولی این کاملاً مجاز است:

s = "hello"
s = "y" + s[1:]
print(s)    # yello

فرقش چیست؟ در خط دوم رشتهٔ "hello" تغییر نکرد؛ پایتون یک رشتهٔ جدید ("yello") ساخت و نام s را از رشتهٔ قبلی جدا کرد و به رشتهٔ جدید وصل کرد:

s ─╳─▶ "hello"     (دیگر کسی به آن اشاره نمی‌کند)
s ───▶ "yello"     (شیء جدید)

همین مفهوم «تغییرپذیر/تغییرناپذیر» (mutable/immutable) بعداً در لیست‌ها خیلی مهم می‌شود. چالش ۱ دقیقاً دربارهٔ همین است.

تمرین

۱. تکرار هر حرف

رشتهٔ a = "MCI" را داریم. با اندیس‌گذاری و عملگرهای + و * رشتهٔ MMMCCCIII را بسازید.

جواب
a = "MCI"
print(a[0] * 3 + a[1] * 3 + a[2] * 3)

(بعد از یادگرفتن حلقهٔ for می‌توانید این را برای رشته‌ای با هر طولی بنویسید.)

۲. پالیندروم

کلمه‌ای «پالیندروم» است که از دو طرف یکسان خوانده شود (مثل level یا radar). یک خط بنویسید که بگوید word پالیندروم است یا نه.

جواب
word = "level"
print(word == word[::-1])