اگر برنامهنویس زبان پایتون باشید یا حتی به صورت مقدماتی با پایتون کار کرده باشید، حتماً با متد ()str.format و یا مفهوم f-stringها آشنا هستید. اما آیا میدانید که پشت این ابزارها که به صورت کلی برای فرمتبندی متنها در پایتون استفاده میشوند، یک زبان کوچک اما قدرتمند به نام Format Mini-Language قرار دارد که کنترل دقیق بر روی نمایش اعداد، رشتههای متنی و تاریخها را ممکن میسازد؟ در این مقاله همه چیز را درباره این زبان فرمتبندی یاد میگیرید.
فهرست مطالب:
فرمتبندی متنها در پایتون
وقتی با استرینگها یا همان رشتههای متنی کار میکنید، معمولاً نیاز دارید مقادیر و اشیاء را در رشتههای خود جاسازی یا درج کنید تا بتوانید رشتههای جدید را به صورت پویا بسازید. این کار معمولاً به عنوان درونیابی رشته یا string interpolation شناخته میشود.
راهنمای جامع استرینگ (str)
در مورد نوع داده استرینگ یا همان str در پایتون بیشتر بدانید: استرینگ (str)
هدف کلی از این کار، نمایش خوانا و منظم مقادیر مختلف است؛ مثلاً نمایش قیمت با دو رقم اعشار، تراز کردن متن در یک جدول یا نوشتن اعداد بزرگ با جداکننده هزارگان. در پایتون، سه ابزار کلی وجود دارد که برای شما درونیابی رشته را انجام میدهد:
- عملگر modulo یا
% - متد str.format
- f-stringها (از پایتون 3.6 به بعد)
عملگر modulo اولین و قدیمیترین ابزار برای انجام درونیابی رشتههاست و بسیاری از قابلیتهای مدرن برای فرمتبندی متنها در پایتون را ندارد. به همین دلیل، عمده تمرکز این نوشته بر دو ابزار دیگر است.
برای درونیابی رشتهها، زبان پایتون هم در متد ()str.format و هم در f-stringها از یک سیستم فرمتبندی داخلی استفاده میکند که به آن زبان کوچک مشخصات فرمت یا به صورت دقیقتر Format Specification Mini-Language میگویند. با تسلط بر این زبان کوچک، میتوانید خروجیهای بسیار دقیق و حرفهای در کدهای پایتونی خود بسازید.
توجه: به منظور سهولت اشاره به این زبان کوچک، در ادامه این نوشته از عبارت «زبانک فرمتبندی» استفاده میکنیم.
فیلدهای جایگزینی
قبل از پرداختن به زبانک فرمتبندی پایتون، باید با مفهوم فیلد جایگزینی یا Replacement Field آشنا شوید.
در رشتههای فرمتبندیشده، هر بخشی که داخل آکولاد {} قرار میگیرد یک فیلد جایگزینی است و پایتون مقدار آن را به شکلی که برایش تعریف کردهاید نمایش میدهد:
# using str.format()
>>> print("Hello, {}!".format("Ali"))
Hello, Ali!
# using f-string
>>> name = "Ali"
>>> print(f"Hello, {name}!")
Hello, Ali!
هر چیزی که خارج از فیلد جایگزینی باشد، از نظر پایتون یک متن است و به صورت متن ساده پرینت میشود.
۱) فیلدهای جایگزینی در متد format
همانطور که در بالا توضیح داده شد، یکی از راههای درونیابی رشتهها در پایتون استفاده از متد format روی استرینگ مدنظر است. به صورت ساده، آرگومانی که به متد format داده میشود مستقیماً درون فیلد جایگزینی قرار میگیرد:
>>> "Hello, {}!".format("Reza")
'Hello, Reza!'
این متد، هم از چندین آرگومان پشتیبانی میکند و هم از آرگومانهای کلیدواژهای:
>>> "Hello, {0}! Good {1}!".format("Reza", "morning")
'Hello, Reza! Good morning!'
>>> "Hello, {name}! Good {moment}!".format(name="Reza", moment="morning")
'Hello, Reza! Good morning!'
آرگومانهایی که در مثال بالا به متد format داده شدهاند میتوانند به ترتیب حضور یا بر اساس کلیدواژه نامشان در متن نهایی جاسازی شوند.
۲) فیلدهای جایگزینی در f-stringها
جدیدترین و انعطافپذیرترین ابزار برای فرمتبندی متنها در پایتون، f-stringها هستند که از نسخه 3.6 پایتون به این زبان اضافه شدند. مشابه متد format، این ابزار نیز از فیلدهای جایگزینی استفاده میکند:
>>> name = "Reza"
>>> moment = "evening"
>>> f"Hello, {name}! Good {moment}!"
'Hello, Reza! Good evening!'
سینتکس زبانک فرمتبندی
ساختار کامل یک فیلد جایگزینی طبق فرم نرمال باکوس به این شکل است:
"{"
[field_name]
["!" conversion]
[":" format_spec]
"}"
یعنی هر فیلد جایگزینی میتواند ۳ بخش داشته باشد:
- نام فیلد
- فلگ تبدیل (که بعد از
!میآید) - مشخصات فرمتبندی (که بعد از
:میآید)
بخش دوم در این سینتکس، الگوها یا فلگهای تبدیل است و ۳ مقدار میپذیرد:
s— اعمال تابعstrروی مقدار فیلدr— اعمال تابعreprروی مقدار فیلدa— اعمال تابعasciiروی مقدار فیلد
text = "پایتون"
print(f"{text!s}") # پایتون
print(f"{text!r}") # 'پایتون'
print(f"{text!a}") # '\u067e\u0627\u06cc\u062a\u0648\u0646'
بخش سوم یا format_spec همان جایی است که زبانک فرمتبندی وارد میشود و در آن مشخص میکنیم که مقدار مدنظر ما، چطور نمایش داده شود. ساختار کامل این قسمت به شکل زیر تعریف شده است:
[[fill]align][sign][z][#][0][width][grouping_option][.precision][type]
هر بخش اختیاری است و ترکیب آنها، انعطاف بسیار بالایی به شما میدهد. در ادامه هر بخش را با مثال توضیح میدهیم.
۱) تراز کردن و پُر کردن
با استفاده از align و fill میتوانید متن یا عدد را در یک عرض مشخص تراز کنید. بخش fill میتواند هر کاراکتری باشد اما گزینههای بخش align عبارتند از:
<— تراز چپ (پیشفرض برای رشتهها)>— تراز راست (پیشفرض برای اعداد)^— وسطچین=— پر کردن بعد از علامت عدد (فقط برای اعداد)
>>> f"{'python':<20}"
'python '
>>> f"{'python':>20}"
' python'
>>> f"{'python':^20}"
' python '
>>> f"{'python':*^20}"
'*******python*******'
عددی که بعد از بخش تراز آمده است، حداقل عرض نمایش را مشخص میکند. مثلاً در آخرین مورد، از پایتون خواسته شده است که کلمه پایتون را وسط یک رشته ۲۰ کاراکتری قرار دهد و فضاهای خالی باقیمانده را با کاراکتر ستاره پر کند.
۲) کنترل علامت اعداد
بخش sign تعیین میکند علامت مثبت و منفی چطور نمایش داده شود و کلاً ۳ گزینه دارد:
+— علامت را هم برای اعداد مثبت و هم منفی نشان میدهد-— علامت را فقط برای اعداد منفی نشان میدهد (پیشفرض)- فضای خالی — برای اعداد مثبت یک فاصله و برای اعداد منفی، علامت منفی را نشان میدهد
>>> f"{42:+}"
'+42'
>>> f"{-42:+}"
'-42'
>>> f"{42: }"
' 42'
۳) عرض و دقت اعشار
بخش width حداقل عرض کل خروجی را مشخص میکند و precision نیز تعداد ارقام اعشاری را تعیین میکند. این دو گزینه در نمایش اعداد اعشاری بسیار پرکاربردند:
>>> pi = 3.14159265
>>> f"{pi:.2f}" # '3.14'
>>> f"{pi:.5f}" # '3.14159'
>>> f"{pi:10.3f}" # ' 3.142'
۴) تعیین نوع نمایش
بخش آخر در format_spec، نوع نمایش را مشخص میکند. مهمترین انواع نمایش عبارتند از:
۴-۱) انواع اعداد صحیح
بخش نوع نمایش برای اعداد صحیح میتواند مبنای نمایش آنها را مشخص کند:
>>> n = 255
>>> f"{n:d}" # decimal: '255'
>>> f"{n:b}" # binary: '11111111'
>>> f"{n:o}" # octal : '377'
>>> f"{n:x}" # hexadecimal: 'ff'
>>> f"{n:X}" # hexadecimal (uppercase): 'FF'
>>> f"{n:#X}" # hexadecimal (uppercase) with prefix: '0XFF'
۴-۲) انواع اعداد اعشاری
بخش نوع نمایش برای اعداد اعشاری میتوانید تعداد ارقام بعد از ممیز یا شیوه نمایش آنها به صورت نماد علمی را مشخص کند:
>>> x = 1234567.89
>>> f"{x:f}" # float: '1234567.890000'
>>> f"{x:e}" # scientific (with e): '1.234568e+06'
>>> f"{x:E}" # scientific (with E): '1.234568E+06'
>>> f"{x:g}" # scientific (auto): '1.23457e+06'
>>> f"{x:.2f}" # float with 2 digit precision: '1234567.89'
۴-۳) نمایش درصد
با استفاده از نوع % میتوانید یک عدد اعشاری را به صورت درصد نمایش دهید. پایتون بهطور خودکار مقدار را در ۱۰۰ ضرب کرده و علامت % به آن اضافه میکند:
>>> ratio = 0.756
>>> f"{ratio:%}" # '75.600000%'
>>> f"{ratio:.1%}" # '75.6%'
>>> f"{ratio:.2%}" # '75.60%'
۵) جداکننده هزارگان
در بخش grouping_option برای نمایش اعداد بزرگ به شکل خوانا، میتوانید از جداکننده هزارگان استفاده کنید. پایتون به صورت پیشفرض دو گزینه در اختیار شما میگذارد: کاما , و زیرخط _
>>> amount = 1000000
>>> f"{amount:,}" # '1,000,000'
>>> f"{amount:_}" # '1_000_000'
>>> f"{amount:,.2f}" # '1,000,000.00'
فیلدهای فرمت پویا
یکی از قابلیتهای جالب زبانک فرمتبندی متنها در پایتون این است که میتوانید مقادیر عرض و دقت را بهصورت پویا از متغیرها بخوانید. این کار با قرار دادن آکولاد تو در تو انجام میشود:
>>> value = 3.14159
>>> width = 10
>>> precision = 3
# using str.format()
>>> print("{:{}.{}f}".format(value, width, precision))
3.142
# using f-string
>>> f"{value:{width}.{precision}f}"
' 3.142'
نکته: در صورتی که لازم بود خود کاراکتر آکولاد را داخل متن نهایی داشته باشید، باید از آکولاد تو در تو استفاده کنید.
جدول خلاصه زبانک فرمتبندی
| گزینه | عملکرد | گزینه | عملکرد |
|---|---|---|---|
| < | راستچین | b | نمایش در مبنای ۲ |
| > | چپچین | o | نمایش در مبنای ۸ |
| ^ | وسطچین | x | نمایش در مبنای ۱۶ |
| + | نمایش علامت برای همه | e/E | نمایش علمی |
| – | نمایش علامت فقط برای اعداد منفی | 3e. | نمایش علمی با ۳ رقم اعشار |
| % | نمایش درصد | f | نمایش اعشاری |
| , | جداکننده هزارگان با , | 2f. | نمایش با ۲ رقم اعشار |
| _ | جداکننده هزارگان با _ | 2f., | نمایش با ۲ رقم اعشار و جداکننده هزارگان |
زبانک فرمتبندی متنها در پایتون یا همان Format Mini-Language پایتون ابزاری بسیار قدرتمند و انعطافپذیر برای فرمتبندی دقیق خروجی است. با استفاده از این زبان کوچک میتوانید. این دانش، بهخصوص در ساخت گزارشها، جداول متنی، لاگهای برنامه و هر جایی که خروجی باید منظم و خوانا باشد بسیار ارزشمند است. توصیه میشود این مثالها را در REPL پایتون امتحان کنید تا کاملاً درک کنید هر گزینه چه تأثیری دارد.
سوالات متداول
-
تفاوت f-string و str.format برای فرمتبندی متنها در چیست؟
هر دو روش از همان سینتکس Format Mini-Language پشتیبانی میکنند و تفاوت اصلی در نحوه نوشتن است. f-string از پایتون 3.6 معرفی شده، خواناتر است و در اکثر موارد سریعتر اجرا میشود. برای کدهای جدید f-string توصیه میشود.
-
چطور میتوان اعداد اعشاری را با تعداد رقم مشخص نمایش داد؟
با استفاده از nf. که n تعداد ارقام اعشاری است. همچنین با g میتوان فرمت هوشمند انتخاب کرد که بین فرمت ثابت و نمایش علمی بهترین گزینه را برمیگزیند.
-
چگونه اعداد را در پایتون به صورت درصد نمایش دهم؟
با نوع % عدد در ۱۰۰ ضرب شده و علامت درصد به انتها اضافه میشود. نکته مهم این است که مقدار ورودی باید بین ۰ و ۱ باشد، نه خود عدد درصد. مثلاً
"f"{0.85:.1%}که به صورت 85.0% نمایش داده میشود. -
چگونه در پایتون اعداد را در مبناهای مختلف نمایش دهم؟
با توجه به توضیحات بالا و جدول خلاصه زبانک فرمتبندی متنها در پایتون میتوانید اعداد صحیح را در مبناهای ۲ و ۸ و ۱۶ نمایش دهید.