
سلام دوستان، توی این جلسه میخوایم با مفهوم استرینگ فرمتینگ (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 is15
و سپس ما میتوانستیم عدد 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%
این کاری بود که قبلا انجام میشد و از پایتون 3.6 به بعد مفهوم 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 های قابل استفاده، به این منبع مراجعه کنید.