قالببندی رشته با f-string در پایتون؛ format و نمایش اعداد

🗓 آخرین بهروزرسانی:
وقتی برنامهای مینویسیم که با کاربر حرف میزند، تقریباً همیشه باید متن ثابت را با مقدار متغیرها ترکیب کنیم: «سلام سارا، موجودی شما ۱۲۵۰۰ تومان است». اگر این کار را با چسباندن رشتهها و تبدیل دستی اعداد انجام دهیم، کد طولانی، ناخوانا و پر از خطا میشود. پایتون برای این مسئله ابزاری بسیار تمیز دارد: f-string.
این آموزش ادامه درس متدهای رشته در پایتون از دوره رایگان آموزش پایتون از صفر است. اگر هنوز با رشتهها در پایتون و تابع print آشنا نیستید، پیشنهاد میکنیم اول آن درسها را بخوانید.
مشکل روش قدیمی: چسباندن رشتهها
فرض کنید نام و سن کاربر را در متغیرها ذخیره کردهایم و میخواهیم یک جمله بسازیم:
name = "Sara"
age = 25
print("Name: " + name + ", Age: " + str(age))این کد کار میکند، اما باید عدد را با str() به رشته تبدیل کنیم؛ اگر فراموش کنیم با خطای TypeError: can only concatenate str (not "int") to str روبهرو میشویم. علاوه بر این، فاصلهها و علامتهای + خواندن کد را سخت میکنند.
f-string چیست؟
f-string (مخفف formatted string literal) از پایتون ۳.۶ به بعد در دسترس است. کافی است قبل از کوتیشن حرف f (یا F) بگذارید و هر عبارت پایتونی را داخل آکولاد {} بنویسید. پایتون مقدار آن عبارت را حساب میکند و خودش به رشته تبدیل میکند:
name = "Sara"
age = 25
print(f"Name: {name}, Age: {age}")
# Name: Sara, Age: 25دیگر نیازی به str() و + نیست و جمله دقیقاً همانطور که خوانده میشود نوشته شده است. f-string علاوه بر خوانایی، از روشهای قدیمی سریعتر هم اجرا میشود.
نوشتن عبارت و فراخوانی تابع داخل آکولاد
داخل {} فقط نام متغیر نمینویسیم؛ هر عبارت معتبر پایتون مجاز است: محاسبه، فراخوانی تابع یا متد، دسترسی به ایندکس و حتی عبارت شرطی.
price = 120000
count = 3
city = "tehran"
scores = [17, 19, 15]
print(f"Total: {price * count}") # Total: 360000
print(f"City: {city.title()}") # City: Tehran
print(f"First score: {scores[0]}") # First score: 17
print(f"Average: {sum(scores) / len(scores)}") # Average: 17.0
print(f"Status: {'passed' if min(scores) >= 10 else 'failed'}")در خط آخر از عبارت شرطی یکخطی استفاده کردهایم که در درس شرطها در پایتون با آن آشنا شدیم. دقت کنید چون کل رشته با کوتیشن دوتایی است، داخل آکولاد از کوتیشن تکی استفاده کردهایم.
نمایش اعشار و قالببندی اعداد
قدرت اصلی f-string در مشخصکننده قالب (format specifier) است که بعد از دو نقطه : داخل آکولاد میآید.
محدود کردن تعداد رقم اعشار
pi = 3.14159265
avg = 17.0
print(f"{pi:.2f}") # 3.14
print(f"{pi:.4f}") # 3.1416
print(f"{avg:.1f}") # 17.0
print(f"{10 / 3:.3f}") # 3.333عبارت .2f یعنی «عدد اعشاری (float) با دو رقم بعد از ممیز». پایتون عدد را گرد میکند، نه اینکه فقط ارقام اضافه را حذف کند.
جداکننده هزارگان
balance = 12500000
print(f"{balance:,}") # 12,500,000
print(f"{balance:_}") # 12_500_000
print(f"{1234567.891:,.2f}") # 1,234,567.89برای نمایش مبلغها، جداکننده , خوانایی را بسیار بیشتر میکند. میتوانید آن را با تعداد اعشار هم ترکیب کنید.
درصد، صفر پیشرو و مبناها
ratio = 0.8567
order = 7
n = 255
print(f"{ratio:.1%}") # 85.7%
print(f"{order:03}") # 007
print(f"{n:b}") # 11111111 (binary)
print(f"{n:x}") # ff (hex)مشخصکننده % عدد را در ۱۰۰ ضرب میکند و علامت درصد میگذارد. 03 یعنی عدد حداقل سه رقم داشته باشد و جای خالی با صفر پر شود؛ برای شماره سفارش و فاکتور بسیار کاربردی است.
تراز کردن و عرض ثابت؛ ساخت جدول در خروجی
با علامتهای < (چپچین)، > (راستچین) و ^ (وسطچین) و یک عدد برای عرض، میتوانیم خروجیهای مرتب و جدولمانند بسازیم:
items = [("Book", 2, 85000), ("Pen", 10, 12000), ("Notebook", 3, 45000)]
print(f"{'Item':<10}{'Qty':>5}{'Price':>12}")
print("-" * 27)
for name, qty, price in items:
print(f"{name:<10}{qty:>5}{price:>12,}")
print(f"{'END':*^27}")خروجی:
Item Qty Price
---------------------------
Book 2 85,000
Pen 10 12,000
Notebook 3 45,000
************END************در این مثال از حلقه for برای پیمایش لیست استفاده کردیم. در {'END':*^27} کاراکتر * برای پر کردن فضای خالی به کار رفته است.
ترفند اشکالزدایی: علامت = در f-string
از پایتون ۳.۸ میتوانید بعد از عبارت، علامت = بگذارید تا هم نام عبارت و هم مقدار آن چاپ شود. این ترفند هنگام پیدا کردن باگ وقت زیادی صرفهجویی میکند:
x = 10
y = 3
print(f"{x=}, {y=}") # x=10, y=3
print(f"{x / y = :.2f}") # x / y = 3.33f-string چندخطی و نمایش آکولاد
برای متنهای طولانی میتوانید از کوتیشن سهتایی استفاده کنید. اگر خود کاراکتر آکولاد را لازم دارید، آن را دوبار بنویسید:
name = "Ali"
total = 250000
receipt = f"""
Customer: {name}
Total: {total:,} Toman
"""
print(receipt)
print(f"{{name}} is written as-is, value is {name}")
# {name} is written as-is, value is Aliمقایسه با format() و عملگر %
در کدهای قدیمیتر دو روش دیگر را هم میبینید. خوب است آنها را بشناسید، اما برای کد جدید f-string را انتخاب کنید:
name, age = "Sara", 25
print("Name: %s, Age: %d" % (name, age)) # old % style
print("Name: {}, Age: {}".format(name, age)) # str.format
print(f"Name: {name}, Age: {age}") # f-string (recommended)متد format() هنوز در یک حالت کاربرد دارد: وقتی قالب متن از قبل در یک متغیر یا فایل ذخیره شده و مقدارها بعداً پر میشوند، مثل template.format(name=name).
مثال کاربردی: فاکتور فروشگاه
بیایید همه چیز را در یک برنامه کوچک ترکیب کنیم. این برنامه با تابع input اطلاعات را میگیرد و یک فاکتور مرتب چاپ میکند:
customer = input("Customer name: ")
price = float(input("Unit price: "))
qty = int(input("Quantity: "))
subtotal = price * qty
tax = subtotal * 0.10
total = subtotal + tax
print(f"\n{' INVOICE ':=^32}")
print(f"{'Customer:':<12}{customer.title():>20}")
print(f"{'Subtotal:':<12}{subtotal:>20,.0f}")
print(f"{'Tax (10%):':<12}{tax:>20,.0f}")
print(f"{'Total:':<12}{total:>20,.0f}")
print("=" * 32)اگر ورودیها sara، 85000 و 3 باشند، خروجی این است:
=========== INVOICE ============
Customer: Sara
Subtotal: 255,000
Tax (10%): 25,500
Total: 280,500
================================جدول خلاصه مشخصکنندههای قالب
| قالب | مثال | خروجی | کاربرد |
|---|---|---|---|
.2f | f"{3.14159:.2f}" | 3.14 | تعداد رقم اعشار |
, | f"{1500000:,}" | 1,500,000 | جداکننده هزارگان |
% | f"{0.25:.0%}" | 25% | نمایش درصد |
03 | f"{7:03}" | 007 | صفر پیشرو |
<10 | f"{'ab':<10}" | ab + ۸ فاصله | چپچین با عرض ثابت |
>10 | f"{'ab':>10}" | ۸ فاصله + ab | راستچین |
*^9 | f"{'ab':*^9}" | ****ab*** | وسطچین با کاراکتر پرکننده |
= | f"{x=}" | x=10 | اشکالزدایی |
اشتباهات رایج
- فراموش کردن حرف f:
"Hello {name}"بدون f، خود عبارت{name}را چاپ میکند. - کوتیشن یکسان داخل و بیرون: در نسخههای قبل از ۳.۱۲،
f"{d["key"]}"خطا میدهد؛ داخل آکولاد از کوتیشن متفاوت استفاده کنید. - استفاده از .2f برای رشته: مشخصکننده
fفقط برای عدد است؛ اگر ورودی را ازinput()گرفتهاید، اول آن را باfloat()تبدیل کنید. - گرد کردن واقعی:
:.2fفقط نمایش را تغییر میدهد و مقدار متغیر عوض نمیشود؛ برای تغییر مقدار ازround()استفاده کنید.
تمرین
- برنامهای بنویسید که نام و نمره سه درس را بگیرد و معدل را با دو رقم اعشار چاپ کند.
- جدول ضرب ۱ تا ۵ را با عرض ثابت ۵ کاراکتر برای هر ستون چاپ کنید.
- مبلغ وام و نرخ سود را بگیرید و سود سالانه را با جداکننده هزارگان و درصد نمایش دهید.
📌 همچنین بخوانید: بازار کار پایتون در ایران، نصب و تنظیم پایتون در VS Code و برنامهنویسی پایتون با گوشی
سؤالات متداول
f-string از کدام نسخه پایتون قابل استفاده است؟
از پایتون ۳.۶ به بعد. ترفند = برای اشکالزدایی از نسخه ۳.۸ اضافه شده است. امروزه تقریباً همه سیستمها نسخه جدیدتری دارند.
چطور در پایتون عدد را با دو رقم اعشار چاپ کنیم؟
از f"{number:.2f}" استفاده کنید. بهجای ۲ هر تعداد رقم که لازم دارید بنویسید.
آیا f-string با متن فارسی کار میکند؟
بله. پایتون ۳ از یونیکد پشتیبانی میکند و میتوانید متغیرها را بدون مشکل داخل جملههای فارسی قرار دهید؛ فقط دقت کنید تراز کردن با عرض ثابت در ترمینالهایی که از راستبهچپ پشتیبانی کامل ندارند ممکن است نامرتب به نظر برسد.
جمعبندی
f-string سادهترین، خواناترین و سریعترین روش قالببندی رشته در پایتون است. یاد گرفتیم متغیر و عبارت را داخل {} بنویسیم، تعداد اعشار را با .2f کنترل کنیم، جداکننده هزارگان و درصد اضافه کنیم، خروجی را با عرض ثابت تراز کنیم و با = سریعتر اشکالزدایی کنیم. خلاصه همه این قالبها را در چیتشیت رایگان پایتون هم آوردهایم.
درس قبلی: متدهای رشته در پایتون
درس بعدی: دستورهای break، continue و pass در پایتون
بازگشت به فهرست کامل دوره آموزش پایتون از صفر
برای ذخیره پیشرفت در همه دستگاهها و دریافت گواهی پایان مسیر، رایگان ثبتنام کن یا وارد شو.