فصل ۲: داده‌ها — متغیر، عدد، پول، متن فارسی و ورودی

f-string، input، تبدیل نوع و ارقام فارسی با str.translate

گرفتن ورودی و نمایش زیبای خروجی

تابع input متنی را از کاربر می‌گیرد و همیشه یک رشته برمی‌گرداند، حتی اگر کاربر عدد تایپ کند. پس برای محاسبه باید نوع را تبدیل کنید: int()، float() یا Decimal(). اگر تبدیل ممکن نباشد، خطای ValueError رخ می‌دهد (مدیریت آن را در فصل ۶ کامل یاد می‌گیریم).

width = int(input("عرض فرش (سانتی‌متر): "))
length = int(input("طول فرش (سانتی‌متر): "))
area = width * length / 10_000
print(f"مساحت: {area:.2f} متر مربع")

ارقام فارسی در ورودی

کاربر ایرانی اغلب با کیبورد فارسی «۲۵۰» تایپ می‌کند. خبر خوب: int("۲۵۰") در پایتون کار می‌کند، چون int هر رقم یونیکد را می‌شناسد. خبر بد: float("۱۲٫۵") با ممیز فارسی خطا می‌دهد، رشته‌ای مثل «۱۴۰۳/۰۵/۲۰» باید برای ذخیره یا مقایسه لاتین شود، و ارقام عربی (٤ ٥ ٦) هم از بعضی کیبوردها می‌آیند. راه‌حل تمیز، یک جدول تبدیل با str.maketrans و str.translate است:

FA_DIGITS = "۰۱۲۳۴۵۶۷۸۹"
AR_DIGITS = "٠١٢٣٤٥٦٧٨٩"
TO_LATIN = str.maketrans(FA_DIGITS + AR_DIGITS + "٫٬", "0123456789" * 2 + ".,")
TO_PERSIAN = str.maketrans("0123456789", FA_DIGITS)

def to_latin(text: str) -> str:
    return text.translate(TO_LATIN)

def to_persian(text: str) -> str:
    return text.translate(TO_PERSIAN)

print(float(to_latin("۱۲٫۵")))          # 12.5
print(to_latin("۱۴۰۳/۰۵/٢٠"))           # 1403/05/20
print(to_persian(f"{12500000:,}"))       # ۱۲,۵۰۰,۰۰۰

translate در یک عبور کل رشته را تبدیل می‌کند و از ده بار replace بسیار سریع‌تر و خواناتر است.

f-string: زبان کوچک قالب‌بندی

f-string (رشته‌ای که با f شروع می‌شود) هر عبارت داخل {} را ارزیابی می‌کند. بعد از دونقطه می‌توانید قالب را مشخص کنید:

قالبنتیجهکاربرد
f"{12500000:,}"12,500,000جداکننده‌ی هزارگان
f"{3.14159:.2f}"3.14دو رقم اعشار
f"{0.075:.1%}"7.5%درصد
f"{87:05}"00087شماره‌ی سفارش با صفر
f"{'کاشان':>10}"تراز راست در ۱۰ خانهجدول متنی
f"{total=}"total=13750000دیباگ سریع

برای جداکننده‌ی فارسی «٬» (U+066C) کافی است خروجی را جایگزین کنید: f"{price:,}".replace(",", "٬").

تبدیل نوع در یک نگاه

int("  42 ")        # 42 — فاصله‌های اطراف مشکلی ندارند
int(3.99)           # 3 — قطع می‌کند، گرد نمی‌کند
int(float("12.5"))  # 12
str(1403)           # '1403'
float("1e3")        # 1000.0

نکته‌هایی که کمتر کسی می‌داند

  • از Python 3.12 می‌توانید داخل f-string همان نوع کوتیشن بیرونی را به کار ببرید: f"{order["city"]}" دیگر خطا نیست.
  • "۲۵۰".isdigit() برابر True است؛ پس isdigit فقط ارقام لاتین را تأیید نمی‌کند. اگر فقط لاتین می‌خواهید، s.isascii() and s.isdigit() بنویسید.
  • int("12.0") خطا می‌دهد، در حالی که int(12.0) کار می‌کند؛ رشته‌ی اعشاری را اول با float تبدیل کنید.
  • f"{x!r}" نسخه‌ی repr را نشان می‌دهد و فاصله‌ها و کاراکترهای نامرئی (مثل ‌) را آشکار می‌کند؛ عالی برای پیدا کردن «چرا این دو رشته برابر نیستند».
  • برای جدا کردن ورودی چندتایی در یک خط: w, l = map(int, input("عرض و طول: ").split()).

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