توی پایتون چند راه برای فرمت کردن متن داریم که به مرور زمان به وجود اومدن. قدیمیترین روش استفاده از % هست.
مثالهای زیر رو ببینین:
تو خط اول سه تا متغیر تعریف کردیم که مقادیرشون به ترتیب 'I', Am The' و 'Walrus' هست. بعد برای چاپ کردنشون گفتیم بیا این رو چاپ کن:
What is <a> <b> <c> about?
هر چیزی بعد از % هست، میگه مشخص کنندهی جاهای خالیمونه. میگه چیزهامون اینان:
اولین چیز a، دومی b و سومی c
که با توجه با مقادیری که به a, b و c دادیم، متن رو پر میکنه که نتیجه میشه خط زیر:
What is I Am The Walrus about?
مشکل این مورد اینه که تو مواردی که تعداد متغیرهامون از یه حدی بیشتره، خیلی پیچیده و ناخوانا میشه و داکیومنتیشن رسمی پیشنهاد کرده که ازش استفاده نکنید.
مثال زیر رو ببینین:
این روش خلاقانه و جالبتره. اگه {} ها رو خالی بذاریم همون ترتیب داخل پرانتز رو رعایت میکنه. یعنی اولین {} مقدار a رو میگیره و همینجوری تا آخر.
مواردی که جالب هستن:
میشه ترتیب رو عوض کرد. مثلا بگیم اولین {} باید مقدارِ دومین مورد موجود تو پرانتز رو بگیره. عملا بهش ایندکس میدیم:
مرحله به مرحله اینجوریه که میبینه اول کار باید دومین ورودی، یعنی a رو چاپ کنه و بعدش b. چون تو پرانتز اول b اومده و بعدش a.
مورد جالب بعدی اینه که میتونیم از متغیرها استفاده کنیم. مثلا:
اینجا گفتیم اولین جای خالی رو یه متغیر به اسم variable1 در نظر بگیر و دومین جای خالی رو هم یه متغیر دیگه به اسم variable2. و داخل پرانتز باید بگیم که مقادیر این متغیرها از کجا میاد؛ که گفتیم مقادیرشون به این شکل هست:
variable1 = name و variable2 = age
اگه نگیم برای متغیرهای موقتی که تعریف کردیم چه مقادیری در نظر بگیره، با ارور مواجه میشیم و هیچوقت نمیفهمیم تقی چند سالش بوده :)
مورد آخر دیکشنریها هستن. مثال رو ببینید:
نیازی نیست مقداردهیهامون ترتیبی داشته باشه (ولی توصیه میشه داشته باشه تا خواناتر باشه)
تو عکس بالا یه دیکشنری تعریف کردیم که مشخصه چه مقادیری داره. تو خط دوم مثل موردجالب قبلی متغیر موقت تعریف کردیم و این دفعه بهشون مستقیم مقدار ندادیم بلکه از دیکشنری خوندیم. برای دوتا از متغیرهامون (job1, job2) این کار رو کردیم و برای دوتای دیگه مستقیم مقدار دادیم.
بدنه اصلی خروجی report هست و نتیجتا خروجی کد بالا به شکل زیره:
که یعنی میشه:
که چندان دور از حقیقت هم نیست.
نکتهای که نباید فراموش کنیم اینه که میشه تک تک مقادیر موجود توی دیشکنری رو ننوشت و بگیم بیا به ترتیب مقدار ها رو بخون. مشابه همون کاری که توی اول صفحه و اولین عکس کردیم. این کار رو با dicName** انجام میدیم که تقریبا معادل ()dicName.values هست . دیکشنری رو اصطلاحا unpack میکنه. اونوقت داریم:
این مورد با اینکه از s% بهتره ولی باز هم اگه تعداد متغیرها یا طول دیکشنری زیاد بشه خیلی ناخوانا و زشت میشه.
پس میریم سراغ راهحل خوشگل و جدیدمون: فسترینگ!
اول از همه فرقی نداره f مینویسیم یا F؛ کارشون یکیه. دوم از همه(!) اینکه از اینجا بهشون میگم فسترینگ.
نکته جالب اول اینکه تموم کارهایی که با موارد قبل میکردیم رو با فسترینگ میتونیم انجام بدیم. مثلا:
که خروجیش مشخصه (اگه نیست شروع کنید و از اول بخونید :))
فسترینگ چیز عجیبیه و حقیقتش فقظ برای فرمت کردن متن و رشته نیست بلکه یه لیترال هست که تو رانتایم کارشو (که ارزیابی/evaluateکردن ورودیش هست) انجام میده. یعنی حتی میشه بهش جمع و ضرب هم بدیم و برامون انجام بده!
مورد قشنگ بعدی اینه که میشه تایع فراخونی کرد، از کلاس آبجکت ساخت و خیلی کارهای دیگه. مثالها رو ببینید:
حقه اینه که یه " " داریم که توش یه { } هست. قسمتی از رشته که قراره فرمت بشه رو توی { } و قسمتی که قراره عینا بره به خروجی رو بیرونش مینویسیم. خروجی عکس بالا هم اینه:
tool just won a grammy.
(p.s. not proud. grammy's sucks and it's totally about the stinky pop culture of the modern era :))
از فسترینگ میشه تو رشتههای چندخطی هم استفاده کرد. یادتون نره fاش رو بذارین :). مثلا:
همونطوری که تو خط آخر میشه دید، میشه رشتههای چندخطی رو هم به عنوان یک فسترینگ نوشت.
نکته بعدی اینه که دو خط پایین همارز هستن:
f"{name}" f"""name"""
تو فسترینگ کار با دیکشنریها هم راحتتره و اگه دقت کنین کلا یه خط کامل نیازی به نوشتن نداره. داریم:
فسترینگ تو پایتون ۳.۶ و تو سال ۲۰۱۵ معرفی شد و از دو مدل قبل سریعتر و کارآمدتره. ازش استفاده کنین چون یجورایی استانداردِ pep هم محسوب میشه.
تموم شد. خوش بگذره :)