رشتهها
بیشتر دادههایی که یک برنامه با آنها سر و کار دارد متن است: نام، آدرس، پیام، محتوای فایل. این فصل درباره این است که چطور متن را اندازه بگیریم، ببُریم، عوض کنیم و از تکههایش پیام بسازیم.
۱. سه شکل نوشتن رشته
رشته یعنی متن. سه راه برای نوشتنش وجود دارد و هر کدام جای خودش را دارد.
# 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
شرح مثال
- کاراکتر اول
name[0]است، نهname[1]. این را چند بار در ذهنتان تکرار کنید، چون منبع بسیاری از خطاهای هفته اول است. - اندیس منفی از انتها میشمارد.
name[-1]همیشه آخرین کاراکتر است، بدون اینکه لازم باشد طول رشته را بدانید. - اندیسی که وجود ندارد خطای
IndexErrorمیدهد. اگر روی ورودی کاربر کار میکنید، همیشه احتمال بدهید که کاربر چیزی وارد نکرده باشد و رشته خالی باشد.
۵. برش
اندیس یک کاراکتر میدهد، برش یک تکه میدهد. شکلش این است:
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
شرح مثال
name[1:4]کاراکترهای ۱ و ۲ و ۳ را میدهد. کاراکتر ۴ داخل نیست. اگر این را عجیب میدانید، به این فکر کنید که4 - 1برابر ۳ است و دقیقاً سه کاراکتر گرفتهایم.- اگر عدد اول را ننویسید یعنی «از اول»، اگر عدد دوم را ننویسید یعنی «تا آخر».
- عدد سوم گام است.
[::2]یعنی یکی در میان. [::-1]معروفترین ترفند پایتون است: گام منفی یعنی از آخر به اول، یعنی رشته برعکس. برای تشخیص کلمه متقارن دقیقاً همین را لازم دارید.
برخلاف اندیس، برش هیچوقت 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
شرح مثال
- عملگر
+بین دو رشته یعنی «به هم بچسبان». دقت کنید که فاصله خودکار اضافه نمیشود؛ اگر فاصله میخواهید باید خودتان' 'را وسط بگذارید. - عملگر
*بین رشته و عدد یعنی تکرار.'-' * 30یک خط جداکننده تمیز میسازد و در برنامههای متنی خیلی به کار میآید. - نمیشود رشته را با عدد جمع زد.
'Score: ' + 20خطایTypeErrorمیدهد. یا باید عدد را باstrبه متن تبدیل کنید، یا بهتر از آن، از f-string استفاده کنید که چند بخش جلوتر میآید.
۷. متدهای رشته
متد تابعی است که متعلق به یک مقدار است و با نقطه صدا زده میشود. رشتهها دهها متد دارند. این موارد پرکاربردترینهایشان هستند.
# 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.strip().split(' ')یعنی اول فاصلهها را بگیر، بعد نتیجه را ببُر. از چپ به راست خوانده میشود. strip()پرکاربردترین متد در کار با ورودی کاربر است. کاربرها دائم فاصله اضافه تایپ میکنند و'ali 'با'ali'برابر نیست.splitخروجیاش لیست است. لیست را در فصل نهم میبینید؛ فعلاً همینقدر که بدانید مجموعهای از مقدارهاست کافی است.joinبرعکسsplitاست و شکل نوشتنش کمی عجیب است: جداکننده جلو میآید و لیست داخل پرانتز.isdigit()راه سادهای است برای اینکه پیش ازint()مطمئن شویم کاربر واقعاً عدد وارد کرده است.
۸. جستوجو در رشته
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
شرح مثال
- عملگر
inجواب بله یا خیر میدهد، یعنیTrueیاFalse. این همان نوعboolفصل قبل است و در فصل بعد قلب دستور شرط میشود. findجای اولین تطابق را میدهد و اگر پیدا نکند منفی یک برمیگرداند. مراقب باشید: منفی یک خودش یک اندیس معتبر است، پس همیشه نتیجه را با-1مقایسه کنید و بیفکر به وظیفه آن نبرید.endswith('.py')دقیقاً همان چیزی است که در فصل هجدهم برای پیدا کردن فایلهای پایتونی در یک پوشه لازم میشود.
۹. 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.
شرح مثال
- داخل آکولاد هر عبارتی مجاز است، نه فقط نام متغیر.
{age + 1}کاملاً درست است. - تبدیل نوع خودکار انجام میشود. ضرورتی ندارد
str()بنویسید. - در خط آخر، بیرون f-string جفتگیومه به کار رفته و داخل آکولاد تکگیومه. اگر هر دو یکی باشند، در نسخههای پایتون پیش از ۳٫۱۲ خطای نگارشی میگیرید. عادت کنید نوع گیومه بیرون و داخل را متفاوت بگذارید.
- لیست و دیکشنری در این مثال آمدهاند؛ آنها را در فصلهای نهم و چهاردهم کامل یاد میگیرید.
۱۰. قالببندی با 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.
شرح مثال
strip()فاصلههای اول و آخر را میگیرد وsplit(' ')نام را به تکهها میشکند.- متغیر
initialsبا رشته خالی شروع میشود و در هر دور یک حرف به آن اضافه میشود. این همان الگوی انباره است که در فصل ششم کامل توضیح داده میشود، فقط اینجا انباره متنی است نه عددی. - شرط
if part != ''برای این است که اگر کاربر دو فاصله پشت سر هم زده باشد، یک تکه خالی تولید میشود وpart[0]روی رشته خالی خطایIndexErrorمیدهد. این دقیقاً همان باگی است که در نسخه اصلی این فایل وجود داشت و اصلاح شده است. part[0].upper()یعنی حرف اول تکه را بگیر و بزرگش کن.
پوشه 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}' | ساختن پیام. بهترین راه |
| تغییرناپذیری | رشته عوض نمیشود، رشته تازه ساخته میشود |
تمرینهای فصل سه
- یک کلمه بگیرید و آن را برعکس چاپ کنید.
- یک نام بگیرید و بگویید چند کاراکتر دارد.
- یک جمله بگیرید و یک بار با حروف بزرگ و یک بار با حروف کوچک چاپش کنید.
- یک جمله بگیرید و بگویید چند کلمه دارد.
- یک نام بگیرید و
Hello <Name>!را چاپ کنید، طوری که حرف اول همیشه بزرگ باشد، هر جور که کاربر تایپ کرده باشد. - یک نشانی ایمیل بگیرید و بخش پیش از
@و بخش پس از آن را جدا چاپ کنید. - یک کلمه بگیرید و بگویید متقارن هست یا نه، مثل
radar. - یک سطر فاکتور با f-string چاپ کنید که نام کالا چپچین و قیمت راستچین با دو رقم اعشار باشد.