گرفتن ورودی و نمایش زیبای خروجی
تابع 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()).