
سلام دوستان، در این قسمت قصد داریم با مفهوم String Formatting یا قالببندی رشتهها در پایتون آشنا شویم، کاربرد آن را بررسی کنیم و ببینیم چگونه میتوان آن را پیادهسازی کرد.
همانطور که به خاطر دارید، در گذشته زمانی که قصد داشتیم متنی تولید کنیم که شامل مقادیر متغیر باشد، معمولاً ناچار بودیم رشتهها را بهصورت دستی به یکدیگر متصل کنیم. این روش که به آن رشتهسازی دستی (Concatenation) گفته میشود، هم زمانبر بود و هم منجر به تولید کدی با خوانایی و قابلیت نگهداری پایین میشد.
برای مثال، فرض کنید متغیری به نام my_text داریم که حاوی متنی برای نمایش نمرهی یک فرد است. اگر بخواهیم مقدار عددی مانند «۱۵» را بهصورت داینامیک درون این متن قرار دهیم یعنی بهگونهای که در آینده قابل تغییر باشد و بهصورت مقدار ثابت (هاردکد) نباشد ناچار بودیم ابتدا مقدار عددی را به رشته تبدیل کرده و سپس آن را به متن اصلی اضافه کنیم تا در خروجی ظاهر شود:
grade = 15
my_text = "Your Grade is"
در گذشته، یکی از روشهای رایج برای چاپ پیام این بود که از تابع ()print
استفاده میکردیم و بهجای نوشتن کل جمله بهصورت یکپارچه، آن را به بخشهای مختلف تقسیم میکردیم. به این صورت که ابتدا بخش ابتدایی متن، سپس مقدار عددی، و در نهایت ادامهی جمله را بهصورت جداگانه در تابع ()print
قرار میدادیم:
print(my_text, grade)
در این حالت، پایتون ابتدا متن اول را چاپ میکرد، بعد مقدار عددی را، و سپس ادامهی جمله را. در ظاهر، نتیجهی نهایی قابل قبول به نظر میرسید.
در برخی موارد نیز تلاش میکردیم متنی را بهعنوان قالب نگهداری کنیم و سپس مقدار متغیر (مانند ۱۵) را بهصورت دستی به آن اضافه نماییم. این رویکرد موجب میشد که ناچار باشیم بهطور مکرر بین متغیرها جابهجا شویم و در نتیجه، کدی تولید شود که خوانایی و نگهداری آن دشوار باشد.
print(my_text + str(grade))
اما این شیوههای نگارش چندان مناسب نیستند و ما جایگزینی به مراتب بهتر به نام f-string در اختیار داریم.
تابع ()format در پایتون
از نسخههای قبل از پایتون ۳.۶، روشی بود که با استفاده از تابع ()format
معرفی شد. این روش به ما امکان میدهد تا مقادیر دلخواه را دقیقاً در محلهایی مشخص داخل رشته قرار دهیم، بدون اینکه مجبور به اتصال دستی متون و متغیرها باشیم.
در این روش، کافی بود در متن اصلی، در جایی که قرار است مقدار متغیر درج شود، از یک جفت آکولاد باز و بسته {} استفاده کنیم. به این علامتها placeholder یا جاینگهدار گفته میشود. سپس با فراخوانی متد ()format
روی رشته، مقدار مورد نظر را به آن منتقل میکردیم.
print("Your Grade is {}")
پایتون بهصورت خودکار مقدار دادهشده را در محل {} قرار میداد. این باعث میشد متن نهایی هم دقیقتر و هم خواناتر باشد. بهعنوان مثال:
print("Your Grade is {}".format(grade))
خروجی:
Your Grade is 15
و سپس ما میتوانستیم عدد 15 را فرمت کنیم:
grade = 15
print("Your Grade is {:.2f}".format(grade))
عدد 15 با دو رقم اعشار نمایش داده میشود. خروجی:
Your Grade is 15.00
یا اگر درصد بگذاریم و عدد 15 را به صورت اعشار بنویسیم:
grade = 0.15
print("Your Grade is {:%}".format(grade))
خروجی میشود:
Your Grade is 15.000000%
این روشی بود که در گذشته مورد استفاده قرار میگرفت، اما از نسخهی ۳.۶ پایتون به بعد، معرفی مفهوم f-string باعث شد که انجام این کار بسیار سادهتر و کارآمدتر شود.
معرفی f-string در پایتون
برای استفاده از f-string در پایتون، کافی است قبل از یک رشتهی متنی (string literal) حرف f را قرار دهیم. به این ترتیب، میتوانیم مستقیماً درون رشته از متغیرها یا حتی عبارات محاسباتی استفاده کنیم، بدون آنکه نیاز باشد از متد ()format
استفاده کنیم:
my_str = f"Your Grade is {grade:%}"
برای جایگذاری متغیرها در یک رشته، از پیشوند f در ابتدای رشتهی متنی استفاده میکنیم.
نتیجه میشود:
my_str = f"Your Grade is {grade}"
print(my_str)
خروجی:
Your Grade is 15
در یک f-string میتوان از چندین جاینگهدار (Placeholder) بهصورت همزمان استفاده کرد و بهاینترتیب، چند مقدار مختلف را بهصورت پویا در متن جای داد. همچنین، درون این جاینگهدارها، صرفاً نام متغیرها قرار نمیگیرد؛ بلکه میتوان از عبارتهای ترکیبی شامل متغیرها، عملگرها، توابع و حتی فیلترها یا مبدلهای قالببندی نیز استفاده کرد.
به عنوان مثال:
my_str = f"Your Grade is {grade}, {grade/2:.2f}"
print(my_str)
و خروجی:
Your Grade is 15, 7.50
ما میتوانیم از توابع نیز استفاده کنیم؛ این تابع میتواند یک تابع داخلی در پایتون باشد یا تابعی که خودمان تعریف کردهایم.
my_str = f"Your Grade is {grade}, {grade/2:.4f}, {int('20')}"
print(my_str)
و خروجی:
Your Grade is 15, 7.5000, 20
انواع فرمتدهی در f-string
در ادامه بحث f-string، میخواهیم با برخی از فرمتهای رایج برای نوع دادهها (type formatting) در پایتون آشنا شویم. این فرمتها به ما کمک میکنند تا نحوهی نمایش خروجی را دقیقتر کنترل کنیم. در اینجا چند نمونه از مهمترین و پرکاربردترین مدیاهای فرمتدهی را معرفی میکنم. سایر موارد را میتوانید از طریق منابع رسمی یا جستجوی ساده بهراحتی بیابید و بررسی کنید.
یکی دیگر از انواع قالببندیها، نمایش عدد به صورت نوشتار علمی (Scientific Notation) است. برای مثال، وقتی میگوییم 5e2، منظور عدد ۵ ضربدر ۱۰ به توان ۲ است. اگر بخواهیم عددی را در رشتهی خود به این شکل نمایش دهیم، باید از یک placeholder استفاده کنیم و داخل آن، پس از علامت دو نقطه (:)، حرف e کوچک را قرار دهیم. این کار باعث میشود عدد به صورت نمایی و با نماد e کوچک نمایش داده شود:
print(f"{5000:e}")
و خروجی:
5.000000e+03
حال اگر عدد ما مقدار بزرگی مانند پنج هزار یا بیشتر داشته باشد و بخواهیم برای خوانایی بهتر، ارقام را هر سه رقم از یکدیگر جدا کنیم، میتوانیم از جداساز استفاده کنیم. برای این منظور، در قالببندی رشتهای، میتوان از , (کاما) برای جداسازی هزارگان استفاده کرد. در این حالت، عدد بهصورت سهرقم سهرقم از سمت راست، با کاما از هم جدا میشود بهطور مشابه، اگر بهجای کاما از
_ (آندرلاین) استفاده کنیم، سیستم هزارگان با آندرلاین اعمال میشود. مثلاً اگر عددی مانند 5000 را با فرمت مناسب پرینت کنیم:
print(f"{5000:,}")
print(f"{5000:_}")
و خروجی:
5,000
5_000
قالببندیهای دیگری نیز وجود دارند که شما میتوانید با جستجوی کلیدواژههایی مانند "Python String Formatting" به تمام مباحثی که در اینجا توضیح دادهایم دسترسی پیدا کنید و در انتهای مقاله به موضوع "modifier" خواهید رسید.
خلاصه و جمعبندی
اگر بخواهید داخل رشتهای که نوشتهاید، برخی مقادیر را از متغیرها جایگزین کنید، چه راهکارهایی دارید؟
پیشتر در برخی مثالها به این سوال برخوردید؛ مثلا وقتی میخواستید یک مقدار رشتهای را از یک متغیر با رشته نوشته شده خودمان ترکیب کنید، از عملگر + استفاده کرده و آن دو را Concatenate میکردید. برای ترکیب مقادیر عددی با رشتهها باید راه طولانیتری را طی میکردید.
در این قسمت میخواهیم مفهوم String Formatting را به شما آموزش دهیم که امروزه در پایتون با F-string شناخته میشود. تا پیش از پایتون نسخه 3.6 برای جانمایی مقدار یک متغیر داخل یک رشته، از متد ()format
استفاده میشد، اما بعد از آن ساختار F-string معرفی شد که به مراتب کار را سادهتر کرد و اجازه داد برخی Expression های پایتونی را داخل Placeholder های این ساختار بگنجانید؛ نظیر متغیرها، عملگرها و صدا کردن توابع. در مثال زیر شکل ساده استفاده از این دو روش و مقایسه آنها را می بینید:
1. grade = 20
2. # شکل قدیم
3. my_string = “Your grade is {}”.format(grade)
4. # شیوه جدید
5. new_string = f”Your grade is {grade}”
# output: Your grade is 20
در این قسمت به طور کامل با نحوه نوشتن F-string آشنا میشوید؛ اما برای آشنایی کامل با شیوه فرمتدهی سنتی رشتهها یعنی استفاده از متد ()format
و دیدن لیست انواع format type های قابل استفاده، به این منبع مراجعه کنید.