۵ عملیات پیشرفته مدیریت اعداد در پایتون | راهنمای کاربردی

۵۸۶۷ بازدید
آخرین به‌روزرسانی: ۲۱ اسفند ۱۴۰۲
زمان مطالعه: ۸ دقیقه
۵ عملیات پیشرفته مدیریت اعداد در پایتون | راهنمای کاربردی

اعداد در همه وجوه زندگی روزمره ما رسوخ کرده و نقش دارند. برای نمونه به طور روزمره با شماره‌های تلفن، تاریخ‌های تولد، سن افراد و دیگر شناسه‌های متنوع از قبیل شماره کارت ملی یا کد پستی سروکار داریم. در این مقاله با روش کار با 5 عملیات پیشرفته مدیریت اعداد در پایتون آشنا خواهیم شد.

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

عملگرهای کم‌کاربرد

همچنان که همه می‌دانیم، جمع، تفریق، ضرب و تقسیم، بنیادی‌ترین عملگرهای ریاضیاتی هستند. با این حال، عملگرهای دیگری نیز وجود دارند که گرچه کاربرد کمتری دارند، اما بسیار کارآمد هستند.

  • عملگر پیمانه (%) باقیمانده را پس از تقسیم یک عدد بر عدد دیگر بازگشت می‌دهد.
  • عملگر نمایی یا توان در پایتون (**) نتیجه را پس از به توان رساندن عدد به نمای عدد دیگر بازگشت می‌دهد.
  • عملگر تقسیم صحیح (//) جزء صحیح باقیمانده تقسیم دو عدد بر همدیگر را بازگشت می‌دهد.

در قطعه کدی که در ادامه می‌بینید، برخی نمونه‌های کاربرد عملگرهای فوق را می‌بینید. نکته قالب توجه این است که لزومی به استفاده از اعداد صحیح در این عملیات وجود ندارد، زیرا این عملگرها روی اعداد اعشاری نیز کار می‌کنند.

1>>> print("***  Modulus Operator %")
2... for i in range(3, 6):
3...     print(f"* {i} % 3 =", i % 3)
4... 
5... print("\n###  Exponentiation Operator **")
6... for i in range(2, 5):
7...     print(f"# {i} ** {i} =", i ** i)
8... 
9... print("\n$$$  Floor Division //")
10... for i in range(9, 20, 4):
11...     print(f"$ {i} // 5 =", i // 5)
12... 
13***  Modulus Operator %
14* 3 % 3 = 0
15* 4 % 3 = 1
16* 5 % 3 = 2
17
18###  Exponentiation Operator **
19# 2 ** 2 = 4
20# 3 ** 3 = 27
21# 4 ** 4 = 256
22
23$$$  Floor Division //
24$ 9 // 5 = 1
25$ 13 // 5 = 2
26$ 17 // 5 = 3

در میان این عملگرها دو کاربرد خاص وجود دارند که ممکن است آن‌ها را مفید بپندارید:

  • برای یافتن این که یک عدد صحیح فرد یا زوج است، می‌توانید باقیمانده تقسیم آن بر 2 را بررسی کنید و نتیجه را با 0 یا 1 بررسی کنید. بدین ترتیب در صورتی که x% 2 == 1 مقدار صحیح بازگشت دهد، عدد فرد است.
  • در مورد عملیات تقسیم صحیح، یک کاربرد در زمان پردازش ‌داده‌ها برای یافتن تعداد نقاط داده‌ای نمونه‌گیری شده از داده‌های سری زمانی وجود دارد. بدین ترتیب x // 4 موجب کاهش حجم نمونه به یک‌چهارم می‌شود.

عملگرهای انتساب

همه می‌دانیم که عملگر برابری = برای انتساب مقادیر به متغیرها مورد استفاده قرار می‌گیرد و از این رو به نام عملگر انتساب (Assignment) شناخته می‌شود. همانند بسیاری از زبان‌های دیگر برنامه‌نویسی در پایتون نیز عملگرهای حسابی می‌توانند همراه با عملگر انتساب برای ایجاد میانبر دست‌کاری مقادیر یک متغیر موجود استفاده شوند. برای نمونه x += 5 معادل x = x+5 است و x *= 3 نیز معادل x = x*3 است. این عملگرها به طور معمول کاملاً سرراست هستند. قطعه کد زیر برخی مثال‌های کاملاً ساده ارائه کرده است:

1>>> x = 10
2... x *= 5
3... print(f"* x was 10, and x *= 5 making x =", x)
4... y = 22
5... y //= 4
6... print(f"* y was 22, and y //= 4 making y =", y)
7... z = 30
8... z **= 2
9... print(f"* z was 30, and z **=2 making z =", z)
10... 
11* x was 10, and x *= 5 making x = 50
12* y was 22, and y //= 4 making y = 5
13* z was 30, and z **=2 making z = 900

مثال فوق برخی نمونه‌های استفاده از عملگرهای انتساب به همراه عملگرهای کم‌کاربرد دیگر که در بخش قبل معرفی کردیم را نمایش می‌دهد. البته که در زمان پیاده‌سازی کدهای مربوط به محاسبات عددی باید به اولویت عملگرها در پایتون نیز دقت کنید اما توجه داشته باشید که برخی عملگرهای انتساب می‌توانند با داده‌های دنباله‌ای نیز کار کنند. این عملگرها در پاره‌ای موارد کاملاً مفید هستند:

1>>> x = [1, 2, 3]
2... x *= 3
3... print(x)
4... 
5[1, 2, 3, 1, 2, 3, 1, 2, 3]

دقت اعداد اعشاری

فرض کنید مشغول حل یک معادله جمع کاملاً ساده هستیم. دو متغیر با مقادیر 2.2 و 1.1 تعریف می‌کنیم. اینک مجموع این دو عدد چیست؟ آیا مجموع آن‌ها برابر با 3.3 است؟ احتمالاً شما با اعتماد به نفس بالایی این پاسخ را تأیید می‌کنید، اما اگر از پایتون برای حل این معادله استفاده کنیم نتیجه زیر حاصل می‌شود:

1>>> a = 2.2
2... b = 1.1
3... c = a + b
4... print("The value of c is", c)
5... print("Is c equal to 3.3?", c == 3.3)
6... 
7The value of c is 3.3000000000000003
8Is c equal to 3.3? False

شاید از دیدن نتیجه فوق شگفت‌زده شوید. اگر به صحت اجرای کد فوق شک دارید، آن را روی سیستم خود امتحان کنید.

در واقع شما نباید با دیدن چنین نتایجی شگفت‌زده شوید، زیرا این‌ها اعداد اعشاری هستند که با دقت کافی در حافظه ذخیره نشده‌اند. بررسی دقیق مفاهیم و سازوکارهای بنیادی این مسئله خارج از حیطه این مقاله است، اما اگر علاقه‌مند باشید می‌توانید این صفحه استک‌اورفلو (+)‌ را مطالعه کنید.

خوشبختانه پایتون یک ماژول خاص به نام decimal دارد که از اجرای یک چنین عملیاتی با دقت مطلوب پشتیبانی می‌کند. این عملیات دقیق می‌تواند به طور خاص در مواردی که دقت ریاضی حائز اهمیت بالایی است مانند فیزیک و محاسبات مالی مورد استفاده قرار گیرد. در ادامه با بررسی چند مثال ساده با طرز کار آن بیشتر آشنا می‌شویم:

1>>> from decimal import Decimal
2... 
3... a_Decimal = Decimal('2.2')
4... b_Decimal = Decimal('1.1')
5... c_Decimal = a_Decimal + b_Decimal
6... print("The value of c_Decimal is", c_Decimal)
7... print("Is c_Decimal to 3.3?", c_Decimal == 3.3)
8... print("Is c_Decimal to Decimal('3.3')?", c_Decimal == Decimal('3.3'))
9... 
10The value of c_Decimal is 3.3
11Is c_Decimal to 3.3? False
12Is c_Decimal to Decimal('3.3')? True

چنان که در قطعه کد فوق می‌بینید، اعداد اعشاری را با استفاده از کلاس Decimal ایجاد کرده‌ایم. نکته مهم‌تر این است که از رشته‌ها برای وهله‌سازی اشیای Decimal بهره گرفته‌ایم. اگر مقدار c_Decimal را بررسی کنید، متوجه خواهید شد که مقدار صحیح یعنی 3.3 را نمایش می‌دهد. با این حال اگر آن را مستقیماً با 3.3 مقایسه کنید، می‌بینید که با هم برابر نیستند.

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

همچنین کد فوق به ما نشان می‌دهد که می‌توانیم از عملیات جمع به همراه دو وهله از Decimal استفاده کنیم. در واقع عملیات رایج دیگر مانند تفریق و تقسیم نیز می‌توانند مورد استفاده قرار گیرند.

5 عملیات پیشرفته مدیریت اعداد در پایتون

کسرها

ما در اغلب موارد از اعداد اعشاری برای نمایش یک مقدار با دقت کافی بهره می‌گیریم. برای نمونه اگر 1 را بر 9 تقسیم کنیم، عدد 0.1111111111111111 به دست می‌آید که یک دقت 16 رقمی به دست می‌دهد. با این که این سطح از دقت که به کمک کلاس Decimal به دست آمده است، از دیدگاه ریاضیاتی برای مقاصد مختلف کفایت می‌کند، اما در هر حال دقیق نیست.

خوشبختانه پایتون یک پکیج خاص به نام Fraction دارد که با استفاده از آن می‌توان این عملیات مرتبط با اعداد کسری را اجرا کرد. در مجموع، کاربرد آن مشابه کلاس Decimal است. در ادامه مثال‌هایی از کاربردهای این پکیج را می‌بینید:

1>>> from fractions import Fraction
2... 
3... one_ninth = Fraction(1, 9)
4... one_seventh = Fraction(1, 7)
5... ninth_plus_seventh = one_ninth + one_seventh
6... ninth_multiply_seventh = one_ninth * one_seventh
7... print("one_ninth's value is:", one_ninth)
8... print("one_seventh's value is:", one_seventh)
9... print("addition of the two:", ninth_plus_seventh)
10... print("multiplication of the two:", ninth_multiply_seventh)
11... 
12one_ninth's value is: 1/9
13one_seventh's value is: 1/7
14addition of the two: 16/63
15multiplication of the two: 1/63

چنان که در قطعه کد فوق دیده می‌شود، برای ایجاد یک تابع باید شیء Fraction را وهله‌سازی کرده و صورت و مخرج کسر را تعیین کنید. این کلاس از عملیات حسابی که قبلاً اشاره کردیم مانند جمع و ضرب پشتیبانی می‌کند. علاوه بر این کاربردهای ابتدایی می‌توان همانند قطعه کد زیر عملیات‌های دیگری که غالباً مورد نیاز هستند را نیز اجرا کرد:

1>>> print("*** You can choose whether to normalize the fraction. By default, it's normalized.")
2... print('Normalize: 3/9 is', Fraction(3, 9, _normalize=True))
3... print('non-normalized: 3/9 is', Fraction(3, 9, _normalize=False))
4... 
5... print("*** You can access a fraction's numerator and denominator.")
6... two_seventh = Fraction(2, 7)
7... print(f"{two_seventh}'s numerator:", two_seventh.numerator)
8... print(f"{two_seventh}'s denominator:", two_seventh.denominator)
9... 
10... print("*** Convertions between floats and fractions")
11... print(f"{two_seventh} expressed as floats:", float(two_seventh))
12... print(f"0.5 expressed as fraction:", Fraction(*0.5.as_integer_ratio()))
13... 
14*** You can choose whether to normalize the fraction. By default, it's normalized.
15Normalize: 3/9 is 1/3
16non-normalized: 3/9 is 3/9
17*** You can access a fraction's numerator and denominator.
182/7's numerator: 2
192/7's denominator: 7
20*** Convertions between floats and fractions
212/7 expressed as floats: 0.2857142857142857
220.5 expressed as fraction: 1/2

در کد فوق چند نکته وجود دارد که باید مورد اشاره قرار دهیم:

  • ساده‌سازی به وسیله تعیین پارامتر ‎_normalize در طی وهله‌سازی کنترل می‌شود. به این ترتیب کسر به صورت پیش‌فرض تا کمترین مقدار ممکن مخرج ساده‌سازی می‌شود.
  • برای تبدیل یک عدد اعشاری به یک کسر، اگر از تابع ()as_integer_ratio روی مقدار اعشاری استفاده کنیم، یک چندتایی بازگشت می‌یابد. در این حالت از ستاره برای باز کردن چندتایی استفاده می‌کنیم که عناصر چندتایی برای ایجاد یک کسر جدید مورد استفاده قرار می‌گیرند.

فرمت اعداد برای رشته‌ها

در زمان کار روی کدهای پایتون در موارد زیادی لازم می‌شود که یک عدد را به صورت یک رشته (String) نمایش دهیم. در اغلب موارد ما می‌خواهیم این کار را طوری انجام دهیم که خوانایی اعداد آسان‌تر باشد. برای نمونه اگر یک عدد بسیار بزرگ که شامل چند رقم است را نمایش می‌دهیم، ممکن است بخواهیم از جداکننده استفاده کنیم تا عدد مانند مثال زیر بهتر نمایش یابد.

1>>> large_number = 7323843829343
2... print("Formatted: {:_d}".format(large_number))
3... print("Formatted: {:,d}".format(large_number))
4... 
5Formatted: 7_323_843_829_343
6Formatted: 7,323,843,829,343

فرض کنید می‌خواهیم اعداد اعشاری را با دقت دو رقم اعشار نمایش دهیم، به طوری که معدل نمرات یک دانش‌آموز به دست آید. مثال ساده زیر را در نظر بگیرید:

  1. در مثال آخر از متد ()format استفاده شده است؛ در حالی که در مثال زیر از f-strings بهره گرفته‌ایم تا نشان دهیم که روش‌های مختلفی برای فرمت‌بندی رشته‌ها وجود دارد.
  2. روش دیگر برای فرمت‌بندی اعداد اعشاری این است که از متد ()round استفاده کنیم که یک عدد اعشاری جدید با دقت مطلوب ایجاد می‌کند. توجه داشته باشید که ()round از فرمت‌بندی رشته متفاوت است و یک عدد اعشاری جدید ایجاد نمی‌شود.
1>>> scores = [95, 97, 94, 97, 95, 93]
2... mean_score = sum(scores) / len(scores)
3... print("Raw Score:", mean_score)
4... print(f"Formatted: {mean_score:.2f}")
5... print(f"Formatted from rounding: {round(mean_score, 2)}")
6... 
7Raw Score: 95.16666666666667
8Formatted: 95.17
9Formatted from rounding: 95.17

در یک پروژه محاسبات علمی، اعداد ممکن است بسیار بزرگ یا بسیار کوچک باشند. در این موارد معمولاً از تکنیک نمادگذاری علمی مانند مثال زیر استفاده می‌شود:

1>>> large_number = 2834000000000
2... small_number = 0.00000003213
3... print(f"Formatted large number: {large_number:e}")
4... print(f"Formatted small number: {small_number:e}")
5... 
6Formatted large number: 2.834000e+12
7Formatted small number: 3.213000e-08

همچنین معمول است که اعداد به صورت درصد مانند نرخ بهره و دیگر مقادیر کوچک مانند نرخ تخفیف برای یک رویداد فروش تبلیغاتی نمایش می‌یابند. برخی مثال‌های ساده در ادامه نمایش یافته‌اند. توجه کنید که ما می‌توانیم دقت را با تعیین مقدار پیش از علامت درصد مشخص سازیم:

1>>> current_apr = 0.03792343
2... discount_rate = 0.333333
3... print(f"Current APR: {current_apr:.2%}")
4... print(f"Discount Rate: {discount_rate:.4%}")
5... 
6Current APR: 3.79%
7Discount Rate: 33.3333%

سخن پایانی

در این مقاله پنج تکنیک پیشرفته مدیریت در پایتون را مشاهده کردیم. در ادامه این موارد را جمع‌بندی کرده‌ایم.

  • علاوه بر عملگرهای ابتدایی (+, -, *, /) می‌توانیم از عملگر پیمانه (%) برای محاسبه همنهشتی، از ** برای محاسبه توان و از // برای محاسبه تقسیم صحیح استفاده کنیم.
  • این عملگرهای حسابی می‌توانند به همراه عملگرهای انتساب نیز استفاده شوند تا در نوشتن کد صرفه‌جویی شود.
  • اگر نیاز به محاسبات دقیق باشد، می‌توانید از کلاس Decimal استفاده کنید که بخشی از ماژول decimal در کتابخانه استاندارد است.
  • کلاس Fraction در ماژول fractions به طور خاص برای کار با کسرها اختصاص یافته است.
  • متد ()format برای رشته‌ها و f-strings دو ابزار کارآمد برای قالب‌بندی اعداد به روش مطلوب مانند درصد و نمادگذاری علمی هستند.
بر اساس رای ۹ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
better-programming
۴ دیدگاه برای «۵ عملیات پیشرفته مدیریت اعداد در پایتون | راهنمای کاربردی»

سلام
چجوری باید جزء صحیح و تابع جزء صحیح رو توی پایتون تعریف کنیم؟

سلام ما یه عددی داریم که مساوی با n هست که ۵ رقم هست
حالا مثلا می خواییم یه وردی دیگه داشته باشیم مثلا ۲
حلا چطوری دو رقم آخر n رو پاک کنیم ؟

متغیری داری به نام n اگر بخوای جزئ صحیح شو جدا کنی باید بنویسی int(n) و حالا اگه بخوای جزئ صحیحشو تو خودش بریزی باید بنویسی n = int(n)

سلام
قبل از اینکه عددی و وارد کنی قبلش پسوند intبزار
بعد از این کار جواب به صورت جزء صحیح داده میشه

نظر شما چیست؟

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