برنامه‌نویسی پایتون فهرست مطالب
فصل ۳

رشته‌ها

بیشتر داده‌هایی که یک برنامه با آنها سر و کار دارد متن است: نام، آدرس، پیام، محتوای فایل. این فصل درباره این است که چطور متن را اندازه بگیریم، ببُریم، عوض کنیم و از تکه‌هایش پیام بسازیم.

در این فصل می‌خوانید
  1. سه شکل نوشتن رشته
  2. دنباله‌های فرار
  3. طول رشته
  4. اندیس
  5. برش
  6. چسباندن و تکرار
  7. متدهای رشته
  8. جست‌وجو در رشته
  9. f-string
  10. قالب‌بندی با f-string
  11. رشته تغییرناپذیر است
  12. برنامه: حروف اول نام

۱. سه شکل نوشتن رشته

رشته یعنی متن. سه راه برای نوشتنش وجود دارد و هر کدام جای خودش را دارد.

# Single quotes and double quotes do exactly the same thing.
a = 'Kadoos'
b = "Kadoos"
print(a, b)

# Use one kind of quote when the text contains the other kind.
print("I'm a student")
print('He said "hello"')

# Triple quotes keep the line breaks exactly as they are written.
text = '''Hello,
This is a multi-line text.
Goodbye!'''
print(text)

سه نوع گیومه: نمونه 01_quotes.py

Kadoos Kadoos
I'm a student
He said "hello"
Hello,
This is a multi-line text.
Goodbye!

شرح مثال

۲. دنباله‌های فرار

بعضی کاراکترها را نمی‌شود مستقیم در متن نوشت. مثلاً «رفتن به خط بعد» یک کاراکتر است ولی شکل چاپی ندارد. برای این موارد از بک‌اسلش استفاده می‌کنیم: بک‌اسلش به پایتون می‌گوید که حرف بعدی معنی خاصی دارد.

# A backslash starts an "escape sequence": a special character written with
# ordinary letters.
print('Hello\nKadoos!')     # \n  -> new line
print('1\t2\t3')            # \t  -> tab
print('I\'m a student')     # \'  -> a single quote inside single quotes
print("\"\"\"")             # \"  -> a double quote inside double quotes
print('C:\\windows')        # \\  -> one real backslash

# A raw string (r'...') switches escaping off - very handy for Windows paths.
print(r'C:\windows\system32')

دنباله‌های فرار: نمونه 02_escape_sequences.py

Hello
Kadoos!
1	2	3
I'm a student
"""
C:\windows
C:\windows\system32
دنبالهمعنی
\nخط جدید
\tیک تب
\'تک‌گیومه واقعی
\"جفت‌گیومه واقعی
\\یک بک‌اسلش واقعی
r'...'رشته خام: بک‌اسلش‌ها معنی خاص ندارند
رشته خام کجا لازم می‌شود

مسیرهای ویندوز پر از بک‌اسلش هستند. اگر بنویسید 'C:\new\table'، پایتون \n و \t را کاراکتر خاص می‌بیند و مسیر خراب می‌شود. با گذاشتن حرف r پیش از گیومه، این مشکل کاملاً حل می‌شود. در فصل هجدهم که با فایل کار می‌کنیم دوباره به این می‌رسیم.

۳. طول رشته

تابع len می‌گوید یک رشته چند کاراکتر دارد. فاصله و علائم هم کاراکتر حساب می‌شوند.

# len() returns how many characters a string contains.
name = 'Alireza'

length = len(name)
print(length)      # 7

# It works on the empty string too.
print(len(''))     # 0

طول رشته: نمونه 03_length.py

'' یعنی رشته خالی: رشته‌ای که هیچ کاراکتری ندارد و طولش صفر است. بعداً می‌بینید که رشته خالی برای شروع یک انباره متنی خیلی به کار می‌آید.

۴. اندیس

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

# Every character has a position (an index). Counting starts at 0.
#
#   K  a  d  o  o  s
#   0  1  2  3  4  5      <- positive indexes
#  -6 -5 -4 -3 -2 -1      <- negative indexes (from the end)

name = 'Kadoos'

print(name[0])    # 'K'  -> the first character
print(name[2])    # 'd'
print(name[-1])   # 's'  -> the last character
print(name[-2])   # 'o'

# An index that does not exist raises an IndexError:
# print(name[10])  ->  IndexError: string index out of range

اندیس مثبت و منفی: نمونه 04_indexing.py

K
d
s
o

شرح مثال

۵. برش

اندیس یک کاراکتر می‌دهد، برش یک تکه می‌دهد. شکلش این است: text[start:stop:step]. نکته کلیدی: عدد اول شامل است و عدد دوم شامل نیست.

# A slice takes a PIECE of the string: text[start:stop:step]
# 'start' is included, 'stop' is NOT included.
name = 'Kadoos'

print(name[1:4])    # 'ado'   -> characters 1, 2, 3
print(name[:3])     # 'Kad'   -> from the beginning to index 2
print(name[2:])     # 'doos'  -> from index 2 to the end
print(name[:])      # 'Kadoos'-> a full copy
print(name[::2])    # 'Kdo'   -> every second character
print(name[::-1])   # 'soodaK'-> the string reversed
print(name[-3:])    # 'oos'   -> the last three characters

برش رشته: نمونه 05_slicing.py

ado
Kad
doos
Kadoos
Kdo
soodaK
oos

شرح مثال

برش هرگز خطا نمی‌دهد

برخلاف اندیس، برش هیچ‌وقت IndexError نمی‌دهد. 'Kadoos'[2:100] خطا نمی‌دهد و فقط تا آخر رشته را برمی‌گرداند. اگر بازه کاملاً بیرون رشته باشد، رشته خالی می‌گیرید.

۶. چسباندن و تکرار

# '+' glues two strings together.
first_name = 'Ali'
last_name = 'Rezaei'

full_name = first_name + ' ' + last_name
print(full_name)

# '*' repeats a string.
print('-' * 30)
print('ab' * 3)

# '+' only works between two strings. This line would raise a TypeError:
# print('Score: ' + 20)
# The fix is to convert the number to text first:
print('Score: ' + str(20))

چسباندن و تکرار: نمونه 06_concatenation.py

Ali Rezaei
------------------------------
ababab
Score: 20

شرح مثال

۷. متدهای رشته

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

# A "method" is a function that belongs to a value and is called with a dot.
text = '  Kadoos Institute, Rasht  '

print(text.upper())            # everything in capitals
print(text.lower())            # everything in small letters
print(text.title())            # First Letter Of Each Word In Capitals
print(text.strip())            # remove the spaces at both ends
print(text.strip().center(40, '.'))

print(text.replace('Rasht', 'Tehran'))

# split() cuts a string into a list of pieces.
words = text.strip().split(' ')
print(words)                   # ['Kadoos', 'Institute,', 'Rasht']

# join() does the opposite: it glues a list of strings together.
print('-'.join(['2026', '09', '08']))

# Useful checks that return True or False:
print('12345'.isdigit())       # True  -> only digits
print('Kadoos'.isalpha())      # True  -> only letters
print('kadoos'.islower())      # True

متدهای رشته: نمونه 07_string_methods.py

متدوظیفه آن
upper() lower()همه حروف بزرگ یا همه کوچک
title() capitalize()حرف اول هر کلمه بزرگ، یا فقط حرف اول جمله
strip()پاک کردن فاصله‌های اول و آخر
replace(a, b)جایگزینی همه a ها با b
split(sep)بریدن رشته و تبدیلش به لیست تکه‌ها
join(list)چسباندن اعضای یک لیست با یک جداکننده
center(n, ch)وسط‌چین کردن در عرض n کاراکتر
isdigit() isalpha()آیا فقط رقم است، آیا فقط حرف است

شرح مثال

۸. جست‌وجو در رشته

text = 'Kadoos Institute, Rasht'

# 'in' answers: does this piece exist inside the text?
print('Rasht' in text)          # True
print('Tehran' in text)         # False

# find() gives the index of the first occurrence, or -1 when it is not found.
print(text.find('Institute'))   # 7
print(text.find('Tehran'))      # -1

# count() says how many times a piece appears.
print(text.count('a'))

# startswith() / endswith() are used a lot when checking file names.
print(text.startswith('Kadoos'))   # True
print('app.py'.endswith('.py'))    # True

جست‌وجو: نمونه 08_search_in_string.py

True
False
7
-1
2
True
True

شرح مثال

۹. f-string

تا اینجا برای ساختن پیام یا از ویرگول در print استفاده کردیم یا از + با str(). هر دو زشت‌اند. راه درست و مدرن، f-string است: یک حرف f پیش از گیومه بگذارید و هر جای متن که مقدار می‌خواهید، آکولاد باز و بسته کنید.

# An f-string is a string with the letter f in front of it.
# Anything inside { } is evaluated and inserted into the text.
name = 'Noshad'
age = 20

print(f'{name} is {age} years old.')

# Any expression is allowed inside the braces.
print(f'Next year {name} will be {age + 1}.')

# It works with items of a list ...
numbers = [3, 5, 7, 18, -9]
print(f'My number: {numbers[2]}')

# ... and with items of a dictionary.
person = {
    'name': 'Mehrsa',
    'age': 15,
    'city': 'Rasht',
}
print(f"My name is {person['name']} and I live in {person['city']}.")

ساختن پیام با f-string: نمونه 09_fstrings.py

Noshad is 20 years old.
Next year Noshad will be 21.
My number: 7
My name is Mehrsa and I live in Rasht.

شرح مثال

۱۰. قالب‌بندی با f-string

f-string فقط مقدار را جای نمی‌گذارد، بلکه می‌تواند شکل نمایش آن را هم تعیین کند. بعد از دونقطه داخل آکولاد، دستور قالب‌بندی می‌آید.

# f-strings can also control HOW a value is displayed.
price = 1234.5678
name = 'Ali'

print(f'{price:.2f}')      # 1234.57   -> two digits after the point
print(f'{price:10.2f}')    # right aligned in a field of 10 characters
print(f'{price:,.2f}')     # 1,234.57  -> thousands separator

print(f'{name:>10}|')      # right aligned
print(f'{name:<10}|')      # left aligned
print(f'{name:^10}|')      # centred

# '=' prints the expression and its value - very useful while debugging.
total = 42
print(f'{total = }')

قالب‌بندی: نمونه 10_fstring_formatting.py

1234.57
   1234.57
1,234.57
       Ali|
Ali       |
   Ali    |
total = 42
قالبمعنی
:.2fدو رقم اعشار، با گرد کردن
:10.2fدو رقم اعشار، در عرض ۱۰ کاراکتر
:,جداکننده هزارگان
:>10 :<10 :^10راست‌چین، چپ‌چین، وسط‌چین در عرض ۱۰
{x = }چاپ نام متغیر همراه مقدارش، برای عیب‌یابی
همین یک قلم را یاد بگیرید

قالب {x = } بهترین دوست شما موقع پیدا کردن اشکال است. به جای اینکه بنویسید print('total is', total)، بنویسید print(f'{total = }') و هم نام و هم مقدار را با هم ببینید. وقتی ده متغیر را چاپ می‌کنید، دیگر قاطی نمی‌شوند.

۱۱. رشته تغییرناپذیر است

این یکی از مهم‌ترین مفاهیم پایتون است. رشته پس از ساخته شدن هرگز تغییر نمی‌کند. هر متدی که فکر می‌کنید رشته را عوض می‌کند، در عمل یک رشته تازه می‌سازد و برمی‌گرداند.

# Strings are IMMUTABLE: once created, a string can never be changed.
name = 'kadoos'

# This line would raise a TypeError:
# name[0] = 'K'

# Instead we build a NEW string and store it back in the variable.
name = 'K' + name[1:]
print(name)          # Kadoos

# The same idea with a method: capitalize() returns a new string,
# it does not modify the original one.
city = 'rasht'
print(city.capitalize())   # Rasht
print(city)                # rasht  -> unchanged!

تغییرناپذیری: نمونه 11_immutability.py

Kadoos
Rasht
rasht
دام بسیار رایج

خیلی‌ها می‌نویسند city.upper() و بعد تعجب می‌کنند که چرا city عوض نشده است. متد رشته، رشته را عوض نمی‌کند، بلکه یک رشته تازه برمی‌گرداند. اگر نتیجه را جایی ذخیره نکنید، از بین می‌رود. درستش این است: city = city.upper().

در فصل نهم می‌بینید که لیست برعکس رشته تغییرپذیر است، و همان‌جا معنی این تفاوت روشن‌تر می‌شود.

۱۲. برنامه: حروف اول نام

برنامه کوچکی که نام کامل را می‌گیرد و حروف اولش را چاپ می‌کند. این مثال یک حلقه for دارد که موضوع فصل ششم است؛ فعلاً فقط منطقش را دنبال کنید و بعد از فصل ششم دوباره به آن سر بزنید.

# Small program: read a full name and print the initials, e.g. "Ali Rezaei" -> "A.R."
full_name = input('Enter your full name: ')

parts = full_name.strip().split(' ')

initials = ''
for part in parts:
    if part != '':                       # skip the extra spaces
        initials = initials + part[0].upper() + '.'

print('Initials:', initials)

حروف اول نام: نمونه 12_initials.py

Enter your full name: ali rezaei
Initials: A.R.

شرح مثال

فایل‌های تمرینی این فصل

پوشه S03-strings شامل نمونه‌های 01_quotes.py تا 12_initials.py.

خلاصه فصل

ابزاروظیفه آن
'...' "..." '''...'''سه شکل نوشتن رشته، سومی چندخطی
\n \t \\خط جدید، تب، بک‌اسلش
r'...'رشته خام، مناسب مسیر ویندوز
len(s)تعداد کاراکترها
s[i]یک کاراکتر. شمارش از صفر، منفی یعنی از آخر
s[a:b:c]برش. a شامل است، b شامل نیست، c گام است
s[::-1]رشته برعکس
+ و *چسباندن و تکرار
upper strip replace split joinپرکاربردترین متدها
in find countجست‌وجو در متن
f'{x}'ساختن پیام. بهترین راه
تغییرناپذیریرشته عوض نمی‌شود، رشته تازه ساخته می‌شود

تمرین‌های فصل سه

  1. یک کلمه بگیرید و آن را برعکس چاپ کنید.
  2. یک نام بگیرید و بگویید چند کاراکتر دارد.
  3. یک جمله بگیرید و یک بار با حروف بزرگ و یک بار با حروف کوچک چاپش کنید.
  4. یک جمله بگیرید و بگویید چند کلمه دارد.
  5. یک نام بگیرید و Hello <Name>! را چاپ کنید، طوری که حرف اول همیشه بزرگ باشد، هر جور که کاربر تایپ کرده باشد.
  6. یک نشانی ایمیل بگیرید و بخش پیش از @ و بخش پس از آن را جدا چاپ کنید.
  7. یک کلمه بگیرید و بگویید متقارن هست یا نه، مثل radar.
  8. یک سطر فاکتور با f-string چاپ کنید که نام کالا چپ‌چین و قیمت راست‌چین با دو رقم اعشار باشد.
فصل قبل: عملگرها فصل بعد: شرط‌ها