ویرگول
ورودثبت نام
Jewsus
Jewsus
خواندن ۴ دقیقه·۵ سال پیش

فسترینگ، غرور، تعصب و والروس!

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

مورد اول: s%

مثال‌های زیر رو ببینین:

sitting on a cornflake, waiting for the van to come
sitting on a cornflake, waiting for the van to come

تو خط اول سه تا متغیر تعریف کردیم که مقادیرشون به ترتیب 'I', Am The' و 'Walrus' هست. بعد برای چاپ کردنشون گفتیم بیا این رو چاپ کن:

What is <a> <b> <c> about?

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

اولین چیز a، دومی b و سومی c

که با توجه با مقادیری که به a, b و c دادیم، متن رو پر می‌کنه که نتیجه می‌شه خط زیر:

What is I Am The Walrus about?

مشکل این مورد اینه که تو مواردی که تعداد متغیرهامون از یه حدی بیشتره، خیلی پیچیده و ناخوانا می‌شه و داکیومنتیشن رسمی پیشنهاد کرده که ازش استفاده نکنید.

مورد دوم: ()srt.format

مثال زیر رو ببینین:

sitting in an English garden waiting for the sun
sitting in an English garden waiting for the sun

این روش خلاقانه و جالب‌تره. اگه {} ها رو خالی بذاریم همون ترتیب داخل پرانتز رو رعایت می‌کنه. یعنی اولین {} مقدار a رو می‌گیره و همینجوری تا آخر.

مواردی که جالب هستن:

می‌شه ترتیب رو عوض کرد. مثلا بگیم اولین {} باید مقدارِ دومین مورد موجود تو پرانتز رو بگیره. عملا بهش ایندکس می‌دیم:

pretty little policemen in a row
pretty little policemen in a row

مرحله به مرحله اینجوریه که می‌بینه اول کار باید دومین ورودی، یعنی a رو چاپ کنه و بعدش b. چون تو پرانتز اول b اومده و بعدش a.

مورد جالب بعدی اینه که می‌تونیم از متغیرها استفاده کنیم. مثلا:

don't you think that joker laughs at you?
don't you think that joker laughs at you?

اینجا گفتیم اولین جای خالی رو یه متغیر به اسم variable1 در نظر بگیر و دومین جای خالی رو هم یه متغیر دیگه به اسم variable2. و داخل پرانتز باید بگیم که مقادیر این متغیرها از کجا میاد؛ که گفتیم مقادیرشون به این شکل هست:

variable1 = name و variable2 = age

اگه نگیم برای متغیرهای موقتی که تعریف کردیم چه مقادیری در نظر بگیره، با ارور مواجه می‌شیم و هیچوقت نمی‌فهمیم تقی چند سالش بوده :)

مورد آخر دیکشنری‌ها هستن. مثال رو ببینید:

climbing the Eiffel tower
climbing the Eiffel tower

نیازی نیست مقداردهی‌هامون ترتیبی داشته باشه (ولی توصیه می‌شه داشته باشه تا خواناتر باشه)

تو عکس بالا یه دیکشنری تعریف کردیم که مشخصه چه مقادیری داره. تو خط دوم مثل موردجالب قبلی متغیر موقت تعریف کردیم و این دفعه بهشون مستقیم مقدار ندادیم بلکه از دیکشنری خوندیم. برای دوتا از متغیرهامون (job1, job2) این کار رو کردیم و برای دوتای دیگه مستقیم مقدار دادیم.

بدنه اصلی خروجی report هست و نتیجتا خروجی کد بالا به شکل زیره:


که یعنی می‌شه:

که چندان دور از حقیقت هم نیست.

نکته‌ای که نباید فراموش کنیم اینه که می‌شه تک تک مقادیر موجود توی دیشکنری رو ننوشت و بگیم بیا به ترتیب مقدار ها رو بخون. مشابه همون کاری که توی اول صفحه و اولین عکس کردیم. این کار رو با dicName** انجام می‌دیم که تقریبا معادل ()dicName.values هست . دیکشنری رو اصطلاحا unpack می‌کنه. اونوقت داریم:

i am here as you are here as you are me
i am here as you are here as you are me


این مورد با اینکه از s% بهتره ولی باز هم اگه تعداد متغیرها یا طول دیکشنری زیاد بشه خیلی ناخوانا و زشت می‌شه.

پس می‌ریم سراغ راه‌حل خوشگل و جدیدمون: فسترینگ!

مورد سوم: f-string

اول از همه فرقی نداره 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&quot{name}&quot f&quot&quot&quotname&quot&quot&quot

تو فسترینگ کار با دیکشنری‌ها هم راحت‌تره و اگه دقت کنین کلا یه خط کامل نیازی به نوشتن نداره. داریم:

دیگه از ** و اینا خبری نیست :دی
دیگه از ** و اینا خبری نیست :دی

فسترینگ تو پایتون ۳.۶ و تو سال ۲۰۱۵ معرفی شد و از دو مدل قبل سریع‌تر و کارآمدتره. ازش استفاده کنین چون یجورایی استانداردِ pep هم محسوب می‌شه.

۱۰۷ سال پیش تو چنین روزی، غرور و تعصب برای اولین بار منتشر شد.
۱۰۷ سال پیش تو چنین روزی، غرور و تعصب برای اولین بار منتشر شد.

تموم شد. خوش بگذره :)

پایتونtext formattingfeatureupdateبرنامه‌نویسی
توضیحات لازمه
شاید از این پست‌ها خوشتان بیاید