ویژگی تصویر

آشنایی با کتابخانه fractions در پایتون

  /  پایتون   /  کتابخانه fractions در پایتون
بنر تبلیغاتی الف

ماژول fractions در پایتون ابزاری ساده و قدرتمند برای کار با اعداد گویای حقیقی (rational numbers) فراهم می‌کند. کلاس اصلی این ماژول، Fraction است که اعداد را به صورت «صورت/مخرج» (numerator/denominator) نگهداری و عملیات حسابی را با دقت صندوق‌دار انجام می‌دهد. در این مقاله کاربردها، نکات فنی، مثال‌های عملی و بهترین روش‌های استفاده از Fraction را بررسی می‌کنیم.

چرا از Fraction استفاده کنیم؟

  • نتایج دقیق‌تر: برای جلوگیری از خطاهای ناشی از نمایش اعشاریِ شناور (floating-point) مناسب است.
  • ساده‌سازی خودکار: کسرها به صورت اتوماتیک ساده (reduced) نگهداری می‌شوند.
  • خوانایی و نمایش ریاضیاتی بهتر برای نسبت‌ها، کسری‌ها و مقیاس‌ها.

نحوهٔ ایجاد Fraction

چند راه معمول برای ساختن یک Fraction:

  • از دو عدد صحیح: Fraction(3, 4)
  • از یک رشته: Fraction("0.75") یا Fraction("3/4")
  • از یک عدد اعشاری (float) — با احتیاط: Fraction(0.75)
  • از Decimal برای دقت پایه-10: Fraction(Decimal("0.1"))
from fractions import Fraction
from decimal import Decimal

a = Fraction(3, 4)            # 3/4
b = Fraction('0.75')          # از رشته: 3/4
c = Fraction(0.75)            # از float: 3/4 در این مورد خاص
d = Fraction(Decimal('0.1'))  # دقت پایه-10: 1/10

توضیح: کد بالا انواع متداول ساختن اشیاء Fraction را نشان می‌دهد. توجه کنید که ساختن از float ممکن است نتایج غیرمنتظره در حالت‌های دیگر (مثلاً 0.1) بدهد، چون نمایش داخلیِ float دقیقاً برابر 0.1 نیست.

نمونه‌ای از مشکل float و راه‌حل

from fractions import Fraction

f1 = Fraction(0.1)          # نتیجه دقیق float -> کسر بزرگ
f2 = Fraction('0.1')        # نتیجه دقیق مورد انتظار: 1/10

print(f1)  # مثلاً 3602879701896397/36028797018963968
print(f2)  # 1/10

توضیح: خروجی Fraction(0.1) با توجه به نمای داخلی شناور، یک کسری با صورت و مخرج بزرگ تولید می‌کند. برای نتایج ده‌دهی-پایه (base-10) و خواناتر از رشته یا Decimal استفاده کنید.

عملیات حسابی و خواص

کلاس Fraction عملیات جمع، تفریق، ضرب و تقسیم را پشتیبانی می‌کند و همیشه نتیجه را در شکلِ ساده‌شده برمی‌گرداند. همچنین ویژگی‌های مفیدی مانند numerator و denominator برای دسترسی مستقیم به صورت و مخرج وجود دارد.

from fractions import Fraction

x = Fraction(1, 3)
y = Fraction(2, 5)

print(x + y)        # جمع: 11/15
print(x * y)        # ضرب: 2/15
print(x - y)        # تفریق: -1/15
print(x / y)        # تقسیم: 5/6

print(x.numerator, x.denominator)  # 1 3

توضیح: این مثال معمولیِ عملیات بین دو کسر را نشان می‌دهد. نتایج همیشه به صورت ساده‌شده بازمی‌گردند.

approximation با limit_denominator

گاهی اوقات می‌خواهیم یک عدد اعشاری یا یک عدد گنگ (مانند π) را با یک کسر ساده تقریب بزنیم. متد limit_denominator(max_denominator) برای این کار بسیار مفید است.

import math
from fractions import Fraction

approx = Fraction(str(math.pi)).limit_denominator(1000)
# یا: Fraction(math.pi).limit_denominator(1000)

print(approx)  # مثلاً 355/113 معروف

توضیح: این کد مقدار عدد پی را به نزدیک‌ترین کسری با مخرج حداکثر 1000 تقریب می‌زند؛ خروجی معمولاً 355/113 یا کسری مشابه خواهد بود. توجه کنید که تبدیل مستقیم از float ممکن است دقیق نباشد، بهتر است از رشته یا Decimal استفاده کنید.

استفادهٔ ترکیبی با Decimal و float

اگر از Decimal استفاده می‌کنید و می‌خواهید دقت پایه-10 را حفظ کنید، مستقیماً یک Fraction از Decimal بسازید. از طرف دیگر، ترکیب Fraction با float در عملیات ممکن است به تبدیل‌های ناخواسته منجر شود.

from decimal import Decimal
from fractions import Fraction

dec = Decimal('0.3')
f_from_dec = Fraction(dec)    # 3/10

f = Fraction(1, 3)
res = f + dec                 # نتیجه: Decimal + Fraction -> نوع Decimal یا خطا؟
# بهتر: تبدیل صریح
res_correct = f + Fraction(dec)

توضیح: برای اجتناب از رفتارهای غیرمنتظره، بهتر است قبل از جمع یا دیگر عملیات، نوع‌ها را یکسان کنید (مثلاً Decimal را به Fraction تبدیل کنید).

متدها و ویژگی‌های مهم — جدول خلاصه

متد / ویژگیتوضیحات
Fraction(numerator, denominator)ایجاد کسر از دو عدد صحیح
Fraction(string)ایجاد از رشته مانند “3/4” یا “0.75”
numerator, denominatorدسترسی به صورت و مخرج
limit_denominator(max_denominator)تقریب به ساده‌ترین کسر با مخرج محدود
float(fraction)تبدیل به float (با از دست رفتنِ دقت ممکن)

نکات کارشناسـی و بهترین شیوه‌ها

  • برای ورودی‌های پایه-10 (مانند ورودی کاربر، فایل CSV) از رشته‌ها یا Decimal برای ساخت Fraction استفاده کنید تا از خطاهای float جلوگیری شود.
  • در کارهای مالی معمولاً از Decimal استفاده کنید، زیرا نمایش و قوانین گرد کردنِ پایه-10 با حساب‌های پولی سازگارتر است. Fraction برای نسبت‌ها و محاسبات دقیقِ کسری مناسب است.
  • Fractionها مقدارِ تغییرناپذیر (immutable) دارند و برای نگهداری به عنوان کلید در دیکشنری یا آیتم در مجموعه (set) مناسب هستند.
  • برای تقریب اعداد اعشاری یا گنگ از limit_denominator استفاده کنید، ولی اگر دقت بالایی نیاز دارید، محدودیت مخرج را متناسب انتخاب کنید.
  • عملیات روی کسرها ممکن است موجب افزایش اندازهٔ صورت و مخرج شود؛ در محاسبات تکراری یا با اعداد بزرگ، مراقب مصرف حافظه و زمان باشید.

مثال عملی: محاسبهٔ مقیاس‌ها و نسبت‌ها

from fractions import Fraction

# تبدیل یک لیست نسبت‌ها به شکل ساده و جمع آنها
ratios = [Fraction('1/3'), Fraction('2/5'), Fraction(0.25)]  # توجه به float در مورد آخر
total = sum(ratios, Fraction(0, 1))
print(total)                # جمعِ دقیق به صورت کسری
parts = [r / total for r in ratios]
print(parts)                # سهم نسبی هر کسر

توضیح: این قطعه نشان می‌دهد چگونه می‌توان نسبت‌ها را بصورت دقیق جمع و سهم نسبی هر مورد را محاسبه کرد. اگر از float استفاده می‌کنید، مثل مورد سوم بهتر است آن را به صورت رشته یا Decimal بسازید.

نتیجه‌گیری کوتاه

ماژول fractions ابزار ساده و مفیدی برای محاسبات کسری دقیق در پایتون فراهم می‌آورد. با درک رفتارهای ورودی‌ها (به‌ویژه float) و استفاده از متدهایی مانند limit_denominator و ساخت از رشته/Decimal می‌توانید از دقت و خوانایی بالای کسرها بهره‌مند شوید. در پروژه‌هایی که دقت ریاضی و نسبت‌ها مهم است — مثل هندسه، الگوریتم‌های عددی کوچک و برخی کاربردهای علمی — استفاده از Fraction می‌تواند خطاهای ناشی از اعشار شناور را به‌طور چشمگیری کاهش دهد.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: