آموزش

آموزش رشته‌های پایتون

در این آموزش، با رشته‌ها در پایتون به‌طور کامل آشنا می‌شی؛ از برش و گام‌بندی گرفته تا تغییر و قالب‌بندی رشته‌ها با کلاس Formatter، استفاده از f-stringها، قالب‌ها و موارد دیگه.

تاریخ انتشار:
24 تیر 1405
پایتون
10 دقیقه
علم داده
کاربرهای فینکا در چه شرکت‌هایی مشغول به کار هستند؟

رشته یا همون String مجموعه‌ای از حروف، کلمات یا بقیه کاراکترهاست. رشته یکی از ساختارهای داده پایه‌ایه و بلوک سازندهٔ تغییر داده‌ها به حساب میاد. پایتون یه کلاس رشته‌ای داخلی به اسم str داره. رشته‌ها تو پایتون غیرقابل تغییر (immutable) هستن؛ یعنی وقتی ساخته بشن دیگه نمی‌تونی تغییرشون بدی. به همین خاطر، برای اعمال تغییرات روی یه رشته، مجبوریم رشته‌های جدیدی بسازیم تا مقادیر محاسبه‌شدهٔ جدید رو تو اونا نگه داریم.

تو این آموزش، قراره خیلی عمیق وارد مبحث رشته‌ها بشیم و این موضوعات رو پوشش بدیم:

اگه دوست داری دربارهٔ ساختارهای داده تو پایتون بیشتر بدونی، حتماً یه نگاهی به دورهٔ دوبخشی «جعبه‌ابزار علم داده با پایتون فینکا» بنداز. این دوره خیلی عمیق‌تر به توابع، پیمایشگرها، لیست‌ها و چیزهای شبیه این می‌پردازه.

رشته‌ها

تو پایتون می‌تونی داده‌های متنی رو با استفاده از شیء str مدیریت کنی. رشته‌ها دنباله‌های غیرقابل تغییری از کاراکترهای یونیکد (unicode) هستن. یونیکد یه سیستمه که برای نشون دادن تمام کاراکترهای زبان‌های مختلف طراحی شده. تو این سیستم، هر حرف یا کاراکتر به‌صورت یه عدد ۴ بایتی نشون داده می‌شه و هر عدد، نمایندهٔ یه کاراکتر منحصربه‌فرده.

برای تعریف یه رشته، باید اون رو داخل علامت نقل‌قول ("") بذاری. برای این کار چند تا راه داری:

  • نقل‌قول تکی، مثل: 'Single quote allow you to embed "double" quotes in your string.'
  • نقل‌قول دوتایی، مثل: "Double quote allow you to embed 'single' quotes in your string."
  • نقل‌قول سه‌تایی، مثل: """Triple quotes using double quotes""", '''Triple quotes using single quotes.'''

استفاده از نقل‌قول سه‌تایی بهت این امکان رو می‌ده که رشته‌های چندخطی بسازی؛ تو این حالت، تمام فاصله‌های خالی هم دقیقاً تو رشته لحاظ می‌شن.

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

خروجی
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
خروجی
This is triple quoted string using 'single' quotes.

با استفاده از تابع داخلی len() می‌تونی طول یه رشته رو به دست بیاری:

خروجی
51

برش رشته در پایتون

از اونجا که رشته‌ها در واقع دنباله‌ای از کاراکترها هستن، می‌تونی مثل لیست‌ها یا تاپل‌ها تو پایتون، با استفاده از برش و اندیس‌گذاری به بخش‌های مختلفشون دسترسی داشته باشی. هر کاراکتر تو رشته یه اندیس داره که از ۰ هم شروع می‌شه:

تو رشتهٔ بالا، کاراکتر اول C هست که اندیسش 0 می‌شه. آخرین کاراکتر هم نقطه (.) هست که شانزدهمین کاراکتر این رشته‌ست. تو پایتون می‌تونی از آخر به اول هم اندیس‌گذاری کنی که از 1- شروع می‌شه؛ یعنی اگه بخوای به همون نقطه (.) برسی، می‌تونی از اندیس 1- استفاده کنی. فاصلهٔ خالی بین دو کلمه هم جزو رشته حساب می‌شه و اندیس خودش رو داره (اینجا اندیس نهم). می‌تونی این موضوع رو با استفاده از قابلیت برش امتحان کنی.

از اونجایی که هر کاراکتر یه اندیس مشخص داره، می‌تونی مثل بقیهٔ ساختارهای داده‌ای ترتیبی، با استفاده از تکنیک برش روی رشته‌ها کار کنی. این تکنیک بهت اجازه می‌ده تا بدون نیاز به نوشتن حلقه‌های طولانی، بخش خاصی از رشته (زیررشته) رو خیلی راحت جدا کنی.

خروجی
C

.

حالا فرض کن می‌خوای کلمهٔ cookie رو از این رشته بیاری بیرون. چطوری این کار رو می‌کنی؟

برای اینجور مواقع از برش بازه‌ای استفاده می‌کنیم.

ساختار برش بازه‌ای به این شکله:

[اندیس پایان (شامل نمی‌شه) : اندیس شروع (شامل می‌شه)]

خروجی
cookie

همین کار رو می‌تونی با استفاده از اندیس منفی برای نقطهٔ توقف هم انجام بدی:

خروجی
cookie

اگه تو برش دادن، اندیس توقف رو ننویسی، یعنی از اندیس شروع تا آخر رشته رو می‌خوای. برعکسش هم صادقه؛ اگه اندیس شروع رو ننویسی، یعنی از اول رشته تا اندیس توقف برات برش می‌خوره:

خروجی
Chocolate cookie.
Chocolate cookie
Chocolate cookie.

برش رشته‌ها تو پایتون می‌تونه یه پارامتر سوم به عنوان گام یا stride هم بگیره. این پارامتر مشخص می‌کنه که برای برداشتن کاراکتر بعدی، چند تا باید بپری جلو. مقدار پیش‌فرض گام روی ۱ تنظیم شده.

بیا تو عمل ببینیم چطور کار می‌کنه:

خروجی
12345

نکته: یه کار خیلی باحالی که می‌تونی با گام برداشتن بکنی، برعکس کردن کامل یه رشته‌ست:

خروجی
0504030201

مقدار 1- بهت اجازه می‌ده از آخر شروع کنی و یکی‌یکی بیای عقب.

حالا اگه مقدار رو 2- بدی، از آخر شروع می‌کنه ولی دوتا دوتا می‌پره عقب (یعنی کاراکترها رو از آخر، یکی‌درمیون نشون می‌ده):

خروجی
00000

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

کار با برش و اندیس‌ها، عملیات‌های رایجی هستن که روی رشته‌ها انجام می‌دیم. یکی دیگه از کارها، چسبوندن رشته‌ها به همه که به سادگی جمع کردن دو تا مقداره:

خروجی
Chocolate cookie

البته حواست باشه، اگه بخوای یه رشته رو با یه نوع دادهٔ دیگه (مثل عدد) جمع کنی، پایتون بهت خطا می‌ده.

خروجی
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str

این خطا به این خاطره که خواستی یه متن رو با یه عدد جمع کنی که تو پایتون مجاز نیست. مفسر پایتون نمی‌تونه خودش حدس بزنه که می‌خوای جمع ریاضی انجام بدی یا دو تا متن رو به هم بچسبونی. ولی حالا این یکی رو امتحان کن:

خروجی
The total in Euro is: 15

این کار جواب داد چون خودت صراحتاً عدد رو به متن تبدیل کردی و بعد عملگر جمع رو به کار بردی. برای اینکه دربارهٔ تبدیل انواع داده‌ها بیشتر بدونی، می‌تونی این آموزش رو بخونی.

برای تکرار کردن یه رشته هم می‌تونی از عملگر ضرب (*) استفاده کنی.

خروجی
hip hip hurray! hip hip hurray! hip hip hurray! 

با استفاده از کلمات کلیدی in و not in می‌تونی بررسی کنی که آیا یه عبارت خاص داخل یه رشته وجود داره یا نه:

خروجی
There is ice in ice cream
Phew! No glue in ice cream

پایتون کلی تابع و متد داخلی برای کار با رشته‌ها داره. جایگزین کردن یه کلمه، بزرگ کردن حروف خاص تو یه پاراگراف، پیدا کردن موقعیت یه کلمه داخل یه متن و کلی کار دیگه رو می‌تونی با این متدها انجام بدی.

بیا چند تا از مهم‌ترین‌هاشون رو دقیق‌تر بررسی کنیم:

  • str.capitalize(): یه کپی از رشته برمی‌گردونه که حرف اولش بزرگ شده.
خروجی
'Cookie'
  • str.islower(): اگه تمام حروف رشته کوچیک باشن مقدار True وگرنه False برمی‌گردونه.
خروجی
True
  • str.find(substring): اندیس اولین جایی که زیررشته پیدا بشه رو برمی‌گردونه. می‌تونی مشخص کنی که جستجو از کجا شروع بشه و کجا تموم بشه. اگه چیزی پیدا نکنه هم 1- برمی‌گردونه.
خروجی
12
  • str.count(substring): تعداد دفعاتی که یه زیررشته تو متن تکرار شده رو می‌شمره. برای این یکی هم می‌تونی اندیس شروع و پایان تعریف کنی.
خروجی
2
  • str.isspace(): اگه کل رشته فقط از فاصله‌های خالی تشکیل شده باشه True، وگرنه False برمی‌گردونه. فاصله‌های خالی شامل خودِ فاصله (Space)، تب (Tab)، رفتن به خط بعد و چیزهایی شبیه این می‌شن.

این متد موقع کار با دیتاست‌های واقعی خیلی به درد می‌خوره؛ چون ممکنه موقع تبدیل فرمت‌ها، فاصله‌گذاری‌ها همیشه درست تبدیل نشده باشن.

خروجی
True
خروجی
True
خروجی
True

نکته: به \t و \n تو مثال‌های بالا دقت کردی؟ به این‌ها کاراکترهای گریز (Escape Characters) می‌گن که با یه بک‌اسلش (\) شروع می‌شن. پایتون این‌ها رو به عنوان متن معمولی نمی‌شناسه، بلکه به عنوان کاراکترهای خاصی در نظر می‌گیره که معنی مشخصی دارن (مثلاً \t یعنی تب). کاراکترهای گریز خیلی زیادی داریم که می‌تونی تو آموزش عبارات باقاعده پایتون فینکا درباره‌شون بیشتر بخونی.

  • str.lstrip(): تمام فاصله‌های خالی اول رشته رو پاک می‌کنه. این هم یکی دیگه از اون توابعیه که موقع کار با دیتاست‌های واقعی خیلی به کارت میاد.
خروجی
I can't hear you. Are you alright? Yes, all is good.
  • str.isdigit(): اگه تو رشته فقط عدد وجود داشته باشه True برمی‌گردونه، در غیر این صورت False.
خروجی
Ture
  • str.replace(substring, new): تمام جاهایی که زیررشته پیدا بشه رو با متن جدید جایگزین می‌کنه. می‌تونی یه آرگومان سوم به اسم max هم بهش بدی که مشخص می‌کنه نهایتاً چند تا از این جایگزینی‌ها انجام بشه. یادت نره که این تغییرات روی خود رشته اصلی اعمال نمی‌شه (چون غیرقابل تغییره) و در واقع یه رشتهٔ جدید برات ساخته می‌شه.
خروجی
hip hip hurray! hip hip hurray! hip hip hurray!
Hip Hip hurray! Hip Hip hurray! Hip Hip hurray!
خروجی
'Hip Hip hurray! hip hip hurray! hip hip hurray!'
  • str.split(delimiter=""): رشته رو بر اساس یه جداکننده بخش بخش می‌کنه و لیست اون بخش‌ها رو برمی‌گردونه. اگه جداکننده‌ای مشخص نکنی، به صورت پیش‌فرض فاصله‌های خالی رو مبنای جداسازی قرار می‌ده.
خروجی
['Cake', ' Cookie', ' Icecream']

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

فرمت‌دهی رشته‌ها

پایتون برای فرمت‌دهی (قالب‌بندی) رشته‌ها روش‌های مختلفی داره. تو این بخش با این روش‌ها بیشتر آشنا می‌شی!

فرمت‌دهی با %

عملگر باقیمانده % تو پایتون یه عملگر داخلیه که برای درون‌یابی (Interpolation) رشته‌ها استفاده می‌شه. باید از علامت % همراه با نوع داده‌ای که می‌خوای فرمت کنی استفاده کنی. پایتون میاد عبارتی که با % شروع شده رو پیدا می‌کنه و مقادیری که بهش دادی رو جایگزینش می‌کنه:

خروجی
I bought 200 Euro worth of cookies!

دیدی که %d برای اعداد صحیح و %s برای رشته‌هاست. گزینه‌های دیگه‌ای هم داریم؛ مثلاً o برای اعداد اکتال (هشت‌هشتی)، x برای هگزادسیمال، f برای اعداد اعشاری و c برای گرفتن یه کاراکتر تک.

کلاس formatter

کلاس formatter یکی از کلاس‌های داخلی برای کار با رشته‌هاست. این کلاس با استفاده از متد format() بهت اجازه می‌ده که متغیرها رو خیلی راحت جاگذاری کنی و مقادیر رو فرمت بدی.

می‌تونی با بازنویسی متدهای این کلاس (مثل format() و vformat())، رفتارهای فرمت‌دهی خاص خودت رو بسازی.

این کلاس متدهایی هم داره که برای جایگزینی توسط زیرکلاس‌ها در نظر گرفته شدن، مثل: parse()، get_field()، get_value()، check_unused_args()، format_field() و convert_field().

اما برای اینکه خیلی قضیه پیچیده نشه، اینجا فقط پرکاربردترین تابعش یعنی همون format() رو تو عمل بررسی می‌کنیم.

خروجی
I bought 200 Euro worth of cookies!
خروجی
I bought 200 Euro worth of cookies!
خروجی
'Cake######'
خروجی
'###Cake###'
خروجی
'######Cake'
خروجی
    1     2     3     4     5     6     7     8     9

رشته‌های قالب

به جای روش جاگذاری با %، قالب‌ها (Templates) از علامت دلار ($) برای جاگذاری استفاده می‌کنن.

دلیل اصلی اضافه شدن قالب‌ها به پایتون ۲.۴ این بود که فرمت‌دهی با % با وجود قدرت زیادش، خیلی مستعد خطاست و قوانین سفت و سختی داره.

یه اشتباه رایج اینه که کاراکتر فرمت رو آخرش فراموش کنی، مثلاً: e در %(variabl)e.

قالب‌ها دو تا متد اصلی دارن: substitute() و safe_substitute(). بیا ببینیم چطور باید ازشون استفاده کرد:

خروجی
'You owe the baker a total of $100'

متوجه $$ تو مثال بالا شدی؟

تو قالب‌ها، $$ یه کاراکتر گریزه که باعث می‌شه یه علامت دلار چاپ بشه. یکی دیگه از قوانین قالب‌ها اینه که برای متغیرها می‌تونی به جای $identifier از ساختار ${identifier} هم استفاده کنی.

این دو تا هیچ فرقی با هم ندارن، ولی نوع آکولاددار تو یه سری سناریوهای خاص (مثل مثال زیر) خیلی به درد می‌خوره:

خروجی
"Please don't stop feeding me"

حالا بیا تفاوت substitute() و safe_substitute() رو تو عمل ببینیم.

خروجی
'Bruce Banner is weak but wait till he transforms to Hulk!'
خروجی
Traceback (most recent call last):
  File "main.py", line 7, in <module>
    fact.substitute(hero)
  File "/usr/lib/python3.12/string.py", line 121, in substitute
    return self.pattern.sub(convert, self.template)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/string.py", line 114, in convert
    return str(mapping[named])
               ~~~~~~~^^^^^^^
KeyError: 'superhero'
خروجی
'Peter Parker is weak but wait till he transforms to $superhero!'

جلوگیری از خطا یکی از بزرگ‌ترین مزیت‌های safe_substitute() و قالب‌هاست.

شاید با خودت بپرسی چرا این‌همه روش برای فرمت‌دهی داریم؟

راستش بیشتر به سلیقه و راحتی برنامه‌نویس برمی‌گرده. مثلاً کسایی که قبلاً با زبان C کار کردن، خیلی راحت‌ترن که از عملگر % استفاده کنن. قالب‌ها برای کارای ساده و ایمن عالین، و استفاده از format() با اینکه ممکنه یکم طولانی‌تر باشه، ولی امکانات خیلی بیشتری بهت می‌ده.

f-string

این یکی تو پایتون ۳.۶ اضافه شده و واقعاً عالیه. f-string در واقع یه رشته‌ست که با حرف f یا F شروع می‌شه. با این قابلیت، می‌تونی خیلی راحت متغیرهات رو داخل آکولاد { } مستقیماً وسط رشته بنویسی.

چرا یه روش دیگه؟ چون ساده‌ست و خوندنش خیلی راحته!

مثال‌های پایین رو ببین تا متوجه بشی چرا f-string بهترین و سرراست‌ترین راه فرمت‌دهی تو پایتونه.

خروجی
Peter Parker is weak but wait till he transforms to spiderman!

رشته‌های f-string موقع اجرای برنامه ارزیابی می‌شن؛ این یعنی می‌تونی هر عبارت معتبری تو پایتون رو مستقیماً بذاری داخل آکولادها. این یکی از بزرگ‌ترین مزیت‌های f-string به حساب میاد.

خروجی
Peter Parker is weak but wait till he transforms to Spiderman!

می‌بینی چقدر f-string خفنه؟ ولی تازه کجاشو دیدی! f-string از همهٔ روش‌های قبلی سریع‌تره؛ چون قبل از اجرا پردازش می‌شه و به بایت‌کدهای خیلی بهینه‌ای تبدیل می‌شه که سرعت اجرای برنامه رو بالا می‌بره.

رشته‌های درست رو انتخاب کن!

خب، به پایان این آموزش رسیدیم. با هم دیدیم که رشته‌ها چی هستن، چطور می‌شه اون‌ها رو برش داد و چه کارهایی می‌شه روشون انجام داد. همین‌طور با روش‌های مختلف فرمت‌دهی متون هم آشنا شدیم. اما یادت نره، برای تسلط به هر چیزی باید حسابی تمرین کنی!

رشته‌ها فقط یکی از انواع داده تو پایتون هستن. برای اینکه با لیست‌ها، دیکشنری‌ها، تاپل‌ها و مجموعه‌ها بیشتر آشنا بشی، حتماً یه سر به دورهٔ انواع داده برای علم داده فینکا بزن. تو اون دوره می‌تونی چیزهایی که یاد گرفتی رو رو داده‌های واقعی (مثل داده‌های حمل‌ونقل شیکاگو) پیاده کنی.

اشتراک‌گذاری
فهرست مطالب
  • رشته‌ها
  • برش رشته در پایتون
  • عملیات رایج روی رشته‌ها
  • فرمت‌دهی رشته‌ها
  • رشته‌های درست رو انتخاب کن!

دریافت اپلیکیشن فینکا

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