از تعریف و اندیسگذاری تا برش (slicing)، متدهای پیشرفته، f-string و تمرینات عملی | آکادمی غیاثی
در پایتون، رشته (String) یک نوع داده برای ذخیرهسازی متن است. هر چیزی که داخل علامت نقل قول قرار بگیرد، یک رشته محسوب میشود. رشتهها در پایتون بسیار قدرتمند هستند و امکانات زیادی برای کار با متن ارائه میدهند.
در پایتون، رشته مجموعهای از کاراکترهاست. هر حرف، عدد، فاصله یا نشانهای که تایپ میکنیم یک کاراکتر محسوب میشود. رشتهها با علامت ' یا " محصور میشوند.
text1 = 'سلام دنیا'
text2 = 'Hello world'
text3 = '12345' # این هم رشته است چون داخل ' ' است
'12345' رشته است، اما 12345 (بدون نقل قول) عدد صحیح (int) است.اگر داخل رشته نیاز به استفاده از علامت نقل قول داشته باشیم، دو راه داریم:
print('I\'m OK, How are you?')
print('He said: "Python is fun!"')
print("My name is \"Erfan\"")
\' : نمایش یک ' داخل رشته\" : نمایش یک " داخل رشته\n : رفتن به خط جدید (new line)\t : فاصله tab
برای نوشتن متنهای چندخطی میتوان از سه علامت نقل قول استفاده کرد: """ یا '''
print("""سلام
نام من "عرفان" است.
حالت چطوره؟""")
برای بهدست آوردن تعداد کاراکترهای یک رشته از تابع len() استفاده میکنیم. فاصلهها و علامتها هم شمرده میشوند.
s = 'Hello'
print(len(s)) # خروجی: 5
s2 = 'سلام دنیا'
print(len(s2)) # خروجی: 9 (شامل فاصله)
در پایتون، هر کاراکتر یک رشته یک اندیس (index) دارد. اندیسها از صفر شروع میشوند. همچنین میتوان از اندیسهای منفی از انتهای رشته استفاده کرد.
name = 'Python'
print(name[0]) # P
print(name[2]) # t
print(name[-1]) # n (آخرین حرف)
print(name[-2]) # o (یکی مانده به آخر)
IndexError رخ میدهد.
برای استخراج بخشی از یک رشته از برش (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 را برمیگرداند.با استفاده از step منفی میتوان رشته را برعکس کرد:
text = 'Python'
print(text[::-1]) # 'nohtyP'
f-string بهترین و خواناترین روش برای ترکیب متن و متغیرها در پایتون است. فقط کافی است قبل از رشته یک f یا F قرار دهیم و متغیرها را داخل {} بنویسیم.
name = 'عرفان'
age = 32
city = 'بوشهر'
info = f'سلام {name}! شما {age} سال دارید و اهل {city} هستید.'
print(info)
+ و %) بسیار سریعتر و خواناتر هستند.برای دریافت اطلاعات از کاربر از تابع input() استفاده میکنیم. نکته مهم: خروجی input() همیشه از نوع رشته (str) است.
name = input('نام خود را وارد کنید: ')
age = int(input('سن خود را وارد کنید: ')) # تبدیل به عدد
print(f'سلام {name}! شما {age} سال دارید.')
int() یا float() آن را تبدیل کنید.
متدها توابعی هستند که روی یک رشته (یا هر داده دیگری) اجرا میشوند و کاری روی آن انجام میدهند. در پایتون رشتهها متدهای بسیار مفیدی دارند که در ادامه کامل یاد میگیریم.
متد lower() تمام حروف بزرگ یک رشته را به حروف کوچک تبدیل میکند. این متد برای مقایسه رشتهها بدون توجه به بزرگ یا کوچک بودن حروف بسیار مفید است.
text = 'PYTHON Programming'
print(text.lower()) # python programming
متد upper() تمام حروف کوچک یک رشته را به حروف بزرگ تبدیل میکند.
text = 'Python programming'
print(text.upper()) # PYTHON PROGRAMMING
گاهی کاربران هنگام ورود اطلاعات، فاصله اضافی وارد میکنند. متد strip() این فاصلهها را از ابتدا و انتهای رشته حذف میکند. فاصلههای وسط را حذف نمیکند.
text = ' Hello world '
print(f'|{text.strip()}|') # |Hello world|
lstrip() فقط فاصلههای ابتدا و rstrip() فقط فاصلههای انتها را حذف میکنند.متد split() یک رشته را بر اساس یک جداکننده (separator) به چند تکه تقسیم میکند و نتیجه را به صورت لیست برمیگرداند. این یکی از پرکاربردترین متدهاست.
sentence = 'Python is fun and powerful'
words = sentence.split(' ') # تقسیم بر اساس فاصله
print(words) # ['Python', 'is', 'fun', 'and', 'powerful']
data = 'apple,banana,orange'
fruits = data.split(',')
print(fruits) # ['apple', 'banana', 'orange']
متد replace(old, new) تمام رخدادهای یک زیررشته را با زیررشته دیگری جایگزین میکند. رشته اصلی تغییر نمیکند، بلکه یک رشته جدید برمیگرداند.
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) فقط دو بار اول را جایگزین میکند.متد count(sub) تعداد دفعات تکرار یک زیررشته را در رشته اصلی شمارش میکند. به حروف بزرگ و کوچک حساس است.
text = 'hello hello hello world'
print(text.count('hello')) # 3
print(text.count('HELLO')) # 0 (چون حساس به کوچکی/بزرگی است)
این دو متد اولین موقعیت (ایندکس) یک زیررشته را در رشته اصلی پیدا میکنند.
find(sub): اگر زیررشته پیدا شود، ایندکس آن را برمیگرداند. اگر پیدا نشود، -1 برمیگرداند (بدون خطا).index(sub): اگر زیررشته پیدا شود، ایندکس آن را برمیگرداند. اگر پیدا نشود، خطای ValueError میدهد.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() استفاده کنید تا خطا نگیرید.
این متدها بررسی میکنند که آیا رشته با یک زیررشته خاص شروع میشود یا پایان مییابد. خروجی True یا False است.
filename = 'document.pdf'
print(filename.startswith('doc')) # True
print(filename.endswith('.pdf')) # True
print(filename.endswith('.txt')) # False
متد join() برعکس split() عمل میکند: اعضای یک لیست را با یک جداکننده به هم میچسباند و یک رشته میسازد.
words = ['Python', 'is', 'awesome']
sentence = ' '.join(words) # با فاصله جدا کن
print(sentence) # Python is awesome
items = ['apple', 'banana', 'orange']
result = ', '.join(items)
print(result) # apple, banana, orange
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 متغیر_موقت in مجموعه:
# کاری که میخواهیم انجام دهیم
توضیح: متغیر_موقت هر بار یکی از اعضای مجموعه را میگیرد و کد داخل حلقه اجرا میشود. این کار تا زمانی ادامه پیدا میکند که همه اعضا پیمایش شوند.
یک رشته مجموعهای از کاراکترهاست. پس میتوان با حلقه `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(len(text)) اعداد 0 تا طول رشته منهای یک را تولید میکند. مثلاً برای رشته "Python" با طول 6، اعداد 0 تا 5 را میسازد.
فرض کنید میخواهیم تعداد حروف 'a' را در یک رشته بشماریم:
text = 'banana'
count = 0
for char in text:
if char == 'a':
count = count + 1
print(f'تعداد حرف a: {count}') # خروجی: 3
فرض کنید میخواهیم همه حروف 'a' را به 'o' تبدیل کنیم:
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
تابع enumerate() روشی زیباتر و حرفهایتر برای پیمایش با ایندکس است:
text = 'Python'
for index, char in enumerate(text):
print(f'کاراکتر {char} در ایندکس {index} قرار دارد')
for char in text: استفاده کنید.enumerate() یا range(len()) استفاده کنید.isupper() و islower() استفاده کنید)
در پایتون، رشتهها تغییرناپذیر (immutable) هستند؛ یعنی پس از ایجاد، نمیتوان یک کاراکتر خاص را مستقیماً تغییر داد.
text = 'Python'
text[0] = 'J' # TypeError! رشتهها تغییرناپذیرند
text = 'J' + text[1:] # 'Jython'
upper()، lower()، replace() و ... رشته اصلی را تغییر نمیدهند، بلکه یک رشته جدید برمیگردانند. پس همیشه نتیجه را در یک متغیر جدید ذخیره کنید.
'Hello' == 'hello' نتیجه False است.split() بشمارید.
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 |