آموزش پایتون, پایتون مقدماتی

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

قالب‌بندی رشته با 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.33

f-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
================================

جدول خلاصه مشخص‌کننده‌های قالب

قالبمثالخروجیکاربرد
.2ff"{3.14159:.2f}"3.14تعداد رقم اعشار
,f"{1500000:,}"1,500,000جداکننده هزارگان
%f"{0.25:.0%}"25%نمایش درصد
03f"{7:03}"007صفر پیشرو
<10f"{'ab':<10}"ab + ۸ فاصلهچپ‌چین با عرض ثابت
>10f"{'ab':>10}"۸ فاصله + abراست‌چین
*^9f"{'ab':*^9}"****ab***وسط‌چین با کاراکتر پرکننده
=f"{x=}"x=10اشکال‌زدایی

اشتباهات رایج

  • فراموش کردن حرف f: "Hello {name}" بدون f، خود عبارت {name} را چاپ می‌کند.
  • کوتیشن یکسان داخل و بیرون: در نسخه‌های قبل از ۳.۱۲، f"{d["key"]}" خطا می‌دهد؛ داخل آکولاد از کوتیشن متفاوت استفاده کنید.
  • استفاده از .2f برای رشته: مشخص‌کننده f فقط برای عدد است؛ اگر ورودی را از input() گرفته‌اید، اول آن را با float() تبدیل کنید.
  • گرد کردن واقعی: :.2f فقط نمایش را تغییر می‌دهد و مقدار متغیر عوض نمی‌شود؛ برای تغییر مقدار از round() استفاده کنید.

تمرین

  1. برنامه‌ای بنویسید که نام و نمره سه درس را بگیرد و معدل را با دو رقم اعشار چاپ کند.
  2. جدول ضرب ۱ تا ۵ را با عرض ثابت ۵ کاراکتر برای هر ستون چاپ کنید.
  3. مبلغ وام و نرخ سود را بگیرید و سود سالانه را با جداکننده هزارگان و درصد نمایش دهید.

📌 همچنین بخوانید: بازار کار پایتون در ایران، نصب و تنظیم پایتون در VS Code و برنامه‌نویسی پایتون با گوشی

سؤالات متداول

f-string از کدام نسخه پایتون قابل استفاده است؟

از پایتون ۳.۶ به بعد. ترفند = برای اشکال‌زدایی از نسخه ۳.۸ اضافه شده است. امروزه تقریباً همه سیستم‌ها نسخه جدیدتری دارند.

چطور در پایتون عدد را با دو رقم اعشار چاپ کنیم؟

از f"{number:.2f}" استفاده کنید. به‌جای ۲ هر تعداد رقم که لازم دارید بنویسید.

آیا f-string با متن فارسی کار می‌کند؟

بله. پایتون ۳ از یونیکد پشتیبانی می‌کند و می‌توانید متغیرها را بدون مشکل داخل جمله‌های فارسی قرار دهید؛ فقط دقت کنید تراز کردن با عرض ثابت در ترمینال‌هایی که از راست‌به‌چپ پشتیبانی کامل ندارند ممکن است نامرتب به نظر برسد.

جمع‌بندی

f-string ساده‌ترین، خواناترین و سریع‌ترین روش قالب‌بندی رشته در پایتون است. یاد گرفتیم متغیر و عبارت را داخل {} بنویسیم، تعداد اعشار را با .2f کنترل کنیم، جداکننده هزارگان و درصد اضافه کنیم، خروجی را با عرض ثابت تراز کنیم و با = سریع‌تر اشکال‌زدایی کنیم. خلاصه همه این قالب‌ها را در چیت‌شیت رایگان پایتون هم آورده‌ایم.

درس قبلی: متدهای رشته در پایتون

درس بعدی: دستورهای break، continue و pass در پایتون

بازگشت به فهرست کامل دوره آموزش پایتون از صفر

می‌خواهی پیشرفتت ذخیره شود؟با ورود یا ثبت‌نام رایگان، درس‌های تمام‌شده را علامت بزن و درصد پیشرفتت را در حساب کاربری ببین.ورود / ثبت‌نام برای ذخیره پیشرفت
درس بعدی · دوره رایگان پایتون (مقدماتی) (16 از 16)پروژه ساخت ماشین‌حساب ساده با پایتون؛ آموزش مرحله‌به‌مرحله ←
آموزش‌های تازه، کد آماده و رفع خطاهر هفته در کانال Dev Source؛ رایگان.
🧭 مسیر یادگیری پایتون از صفر
ماژول 4: رشته‌ها و لیست‌ها — درس 16 از 44

برای ذخیره پیشرفت در همه دستگاه‌ها و دریافت گواهی پایان مسیر، رایگان ثبت‌نام کن یا وارد شو.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *