fractions --- اعداد گویا¶
کد منبع: Lib/fractions.py
ماژول fractions از حساب اعداد گویا پشتیبانی میکند.
یک نمونه از Fraction میتواند از یک جفت عدد گویا، از یک عدد، یا از یک رشته ساخته شود.
- class fractions.Fraction(numerator=0, denominator=1)¶
- class fractions.Fraction(number)
- class fractions.Fraction(string)
اولین نسخه نیاز دارد که numerator و denominator نمونههایی از
numbers.Rationalباشند و یک نمونه جدید ازFractionرا با مقداری برابر باnumerator/denominatorبرمیگرداند. اگر denominator صفر باشد،ZeroDivisionErrorرا پرتاب میکند.نسخه دوم مستلزم آن است که number نمونهای از
numbers.Rationalباشد یا دارای متدas_integer_ratio()باشد (این شاملfloatوdecimal.Decimalمیشود). این نسخه یک نمونهFractionبا دقیقاً همان مقدار برمیگرداند. فرض میشود که متدas_integer_ratio()جفتی از اعداد صحیح اول نسبت به هم برمیگرداند و دومی مثبت است. توجه داشته باشید که به دلیل مسائل معمول ممیز دودویی (به حساب ممیز شناور: مشکلات و محدودیتها مراجعه کنید)، آرگومانFraction(1.1)دقیقاً برابر با ۱۱/۱۰ نیست، و بنابراینFraction(1.1)،Fraction(11, 10)را آنگونه که ممکن است انتظار رود برنمیگرداند. (اما مستندات متدlimit_denominator()را در زیر ببینید.)آخرین نسخهی سازنده انتظار یک رشته را دارد. شکل معمول برای این نمونه به این صورت است:
[علامت] صورت ['/' مخرج]
که در آن
signاختیاری میتواند '+' یا '-' باشد وnumeratorوdenominator(در صورت وجود) رشتههایی از ارقام دهدهی هستند (میتوان از زیرسطرها برای جدا کردن ارقام استفاده کرد، همانطور که در لفظهای عدد صحیح در کد استفاده میشود). علاوه بر این، هر رشتهای که نشاندهندهی یک مقدار متناهی باشد و توسط سازندهیfloatپذیرفته شود، توسط سازندهیFractionنیز پذیرفته میشود. در هر یک از این قالبها، رشتهی ورودی همچنین میتواند در ابتدا و/یا انتها دارای فضای خالی باشد. در اینجا چند مثال آمده است:>>> from fractions import Fraction >>> Fraction(16, -10) Fraction(-8, 5) >>> Fraction(123) Fraction(123, 1) >>> Fraction() Fraction(0, 1) >>> Fraction('3/7') Fraction(3, 7) >>> Fraction(' -3/7 ') Fraction(-3, 7) >>> Fraction('1.414213 \t\n') Fraction(1414213, 1000000) >>> Fraction('-.125') Fraction(-1, 8) >>> Fraction('7e-6') Fraction(7, 1000000) >>> Fraction(2.25) Fraction(9, 4) >>> Fraction(1.1) Fraction(2476979795053773, 2251799813685248) >>> from decimal import Decimal >>> Fraction(Decimal('1.1')) Fraction(11, 10)
کلاس
Fractionاز کلاس پایه انتزاعیnumbers.Rationalارث میبرد و تمام متدها و عملیاتهای آن کلاس را پیادهسازی میکند. نمونههایFraction، hashable هستند و باید بهعنوان تغییرناپذیر در نظر گرفته شوند. علاوه بر این،Fractionدارای ویژگیها و متدهای زیر است:تغییر یافته در نسخهی 3.2: سازندهی
Fractionاکنون نمونههایfloatوdecimal.Decimalرا میپذیرد.تغییر یافته در نسخهی 3.9: اکنون از تابع
math.gcd()برای بههنجار کردن numerator و denominator استفاده میشود.math.gcd()همیشه مقداری از نوعintبرمیگرداند. پیش از این، نوع ب.م.م به numerator و denominator بستگی داشت.تغییر یافته در نسخهی 3.11: اکنون استفاده از زیرسطرها هنگام ایجاد یک نمونه از
Fractionاز روی یک رشته، مطابق قوانین PEP 515 مجاز است.تغییر یافته در نسخهی 3.11:
Fractionاکنون__int__را پیادهسازی میکند تا بررسیهای نمونه ازtyping.SupportsIntبرآورده شوند.تغییر یافته در نسخهی 3.12: برای ورودیهای رشتهای، وجود فاصله در اطراف اسلش مجاز است:
Fraction('2 / 3').تغییر یافته در نسخهی 3.12: نمونههای
Fractionاکنون از قالببندی بهسبک float با انواع نمایش"e"،"E"،"f"،"F"،"g"،"G"و"%""پشتیبانی میکنند.تغییر یافته در نسخهی 3.13: قالببندی نمونههای
Fractionبدون نوع نمایش، اکنون از پرکننده، تراز، مدیریت علامت، حداقل عرض و گروهبندی پشتیبانی میکند.تغییر یافته در نسخهی 3.14: سازندهی
Fractionاکنون هر شیء دارای متدas_integer_ratio()را میپذیرد.- numerator¶
صورت کسر در سادهترین شکل.
- denominator¶
مخرج کسر در سادهترین شکل. تضمین میشود که مثبت باشد.
- as_integer_ratio()¶
یک تاپل از دو عدد صحیح برمیگرداند، که نسبت آنها برابر با Fraction اصلی است. این نسبت در سادهترین شکل است و مخرج آن مثبت است.
اضافه شده در نسخهی 3.8.
- is_integer()¶
اگر Fraction یک عدد صحیح باشد،
Trueبرمیگرداند.اضافه شده در نسخهی 3.12.
- classmethod from_float(f)¶
سازنده جایگزین که فقط نمونههای
floatیاnumbers.Integralرا میپذیرد. توجه داشته باشید که مقدارFraction.from_float(0.3)با مقدارFraction(3, 10)یکسان نیست.
- classmethod from_decimal(dec)¶
سازنده جایگزینی که فقط نمونههای
decimal.Decimalیاnumbers.Integralرا میپذیرد.توجه
از پایتون 3.2 به بعد، همچنین میتوانید یک نمونه
Fractionرا مستقیماً از یک نمونهdecimal.Decimalایجاد کنید.
- classmethod from_number(number)¶
سازنده جایگزینی که فقط نمونههای
numbers.Integral،numbers.Rational،floatیاdecimal.Decimalو اشیایی که متدas_integer_ratio()دارند را میپذیرد، اما رشتهها را نمیپذیرد.اضافه شده در نسخهی 3.14.
- limit_denominator(max_denominator=1000000)¶
نزدیکترین
Fractionبهselfرا که مخرج آن حداکثر max_denominator باشد، پیدا میکند و برمیگرداند. این متد برای یافتن تقریبهای گویای یک عدد ممیز شناور دادهشده مفید است:>>> from fractions import Fraction >>> Fraction('3.1415926535897932').limit_denominator(1000) Fraction(355, 113)
یا برای بازیابی عدد گویایی که بهصورت یک شناور نمایش داده شده است:
>>> from math import pi, cos >>> Fraction(cos(pi/3)) Fraction(4503599627370497, 9007199254740992) >>> Fraction(cos(pi/3)).limit_denominator() Fraction(1, 2) >>> Fraction(1.1).limit_denominator() Fraction(11, 10)
- __floor__()¶
بزرگترین
int<= selfرا برمیگرداند. این متد همچنین از طریق تابعmath.floor()نیز قابل دسترسی است:>>> from math import floor >>> floor(Fraction(355, 113)) 3
- __ceil__()¶
کوچکترین
intکه>= selfباشد را برمیگرداند. همچنین میتوان از طریق تابعmath.ceil()به این متد دسترسی داشت.
- __round__()¶
- __round__(ndigits)
نسخهی نخست نزدیکترین
intبهselfرا بازمیگرداند، با گرد کردن نیمه به سمت زوج. نسخهی دومselfرا به نزدیکترین مضربFraction(1, 10**ndigits)گرد میکند (از نظر منطقی، اگرndigitsمنفی باشد)، باز هم با گرد کردن نیمه به سمت زوج. میتوان به این متد از طریق تابعround()نیز دسترسی داشت.
- __format__(format_spec, /)¶
پشتیبانی از قالببندی نمونههای
Fractionرا از طریق متدstr.format()، تابع توکارformat()، یا رشتههای قالببندیشده فراهم میکند.اگر رشته مشخصات قالببندی
format_specبه یکی از انواع نمایش'e'،'E'،'f'،'F'،'g'،'G'یا'%'ختم نشود، قالببندی از قواعد عمومی مربوط به پر کردن، ترازبندی، مدیریت علامت، حداقل عرض و گروهبندی پیروی میکند، همانطور که در زبان کوچک مشخصات قالببندی توضیح داده شده است. پرچم «شکل جایگزین» (alternate form)'#'پشتیبانی میشود: در صورت وجود، رشته خروجی را وادار میکند که همیشه شامل یک مخرج صریح باشد، حتی وقتی که مقدار مورد قالببندی یک عدد صحیح دقیق باشد. از پرچم پرکننده با صفر'0'پشتیبانی نمیشود.اگر رشته مشخصات قالب
format_specبه یکی از انواع نمایش'e'،'E'،'f'،'F'،'g'،'G'یا'%'ختم شود، قالببندی از قواعدی پیروی میکند که برای نوعfloatدر بخش زبان کوچک مشخصات قالببندی شرح داده شده است.در ادامه چند مثال آمده است:
>>> from fractions import Fraction >>> format(Fraction(103993, 33102), '_') '103_993/33_102' >>> format(Fraction(1, 7), '.^+10') '...+1/7...' >>> format(Fraction(3, 1), '') '3' >>> format(Fraction(3, 1), '#') '3/1' >>> format(Fraction(1, 7), '.40g') '0.1428571428571428571428571428571428571429' >>> format(Fraction('1234567.855'), '_.2f') '1_234_567.86' >>> f"{Fraction(355, 113):*>20.6e}" '********3.141593e+00' >>> old_price, new_price = 499, 672 >>> "{:.2%} price increase".format(Fraction(new_price, old_price) - 1) '34.67% price increase'
همچنین ملاحظه نمائید
- ماژول
numbers کلاسهای پایه انتزاعی که برج عددی (numeric tower) را تشکیل میدهند.