توابع ریاضی پایتون: به توان رساندن (pow)، قدر مطلق (abs) و روند کردن (round) با مثال و تمرین

اگر در پایتون با عدد و محاسبه سروکار داشته باشید (از ساخت گزارش مالی و تحلیل داده تا اتوماسیون قیمتگذاری و ابزارهای کوچک)، خیلی زود به «توابع ریاضی پایتون» میرسید.
من سید علیرضا میرحبیبی هستم و در این جلسه از آموزش رایگان پایتون میخواهم سه تابع پرکاربرد و پایه را دقیق و کاربردی یاد بدهم: abs برای قدر مطلق، pow برای به توان رساندن، و round برای روند کردن/گرد کردن. نکته مهم اینجاست که این سه تابع ساده به نظر میآیند، اما در پروژه واقعی—خصوصاً وقتی پای اعداد اعشاری و پول وسط باشد—اگر رفتارشان را درست نشناسید، نتیجهها میتوانند غافلگیرکننده شوند. این درس دقیقاً در بخش «مبانی کار با عددها» در مسیر یادگیری پایتون قرار میگیرد و برای کسی مناسب است که تازه با نوعهای عددی و ورودی/خروجی آشنا شده و حالا میخواهد محاسبات عددی در پایتون را قابل اعتماد انجام دهد.
۱) تحلیل نیاز و جایگاه درس در مسیر یادگیری
هدف این درس، یادگیری و حل مسئله با سه مورد از مهمترین توابع ریاضی پایتون در کار روزمره است: abs، pow و round. این سه ابزار جزو مبانی محاسبات عددی هستند چون تقریباً در هر سناریویی که با اختلافها، رشد/توان، یا گرد کردن خروجی سروکار دارید به آنها میرسید. از نظر سطح، این درس برای زمانی مناسب است که مفاهیم پایهای عددها (int و float) و ورودی/خروجی را میدانید و حالا میخواهید خروجیهای عددی را دقیقتر و قابل اتکا تولید کنید.
۲) مدل ذهنی: عدد صحیح، اعشاری و خطای نمایش اعشاری
در پایتون، عددهای صحیح (int) دقیقاند، اما عددهای اعشاری (float) بهخاطر شیوه نمایش دودویی، همیشه دقیق ذخیره نمیشوند. به همین دلیل ممکن است عبارتی مثل 0.1+0.2 دقیقاً 0.3 نشود. این «خطای نمایش اعشاری» مستقیماً روی گرد کردن اثر میگذارد؛ یعنی گاهی round نتیجهای میدهد که با انتظار ذهنی شما متفاوت است، چون عددی که واقعاً در حافظه ذخیره شده کمی با مقدار ظاهری فرق دارد.
۳) تابع abs در پایتون (قدر مطلق) با کاربردهای واقعی
تابع abs مقدار قدر مطلق را برمیگرداند؛ یعنی اگر عدد منفی باشد علامت آن را حذف میکند. رایجترین کاربرد آن در پروژههای واقعی، محاسبه اختلاف بدون علامت است: فاصله روی محور عددی، اختلاف قیمت، اختلاف مقدار پیشبینی با مقدار واقعی، کنترل میزان خطا، یا نرمالسازی ساده وقتی فقط بزرگی تغییر برایتان مهم است.
۴) تابع pow در پایتون (به توان رساندن) و تفاوت با عملگر **
برای توان معمولی، pow(a, b) و a**b معمولاً نتیجه یکسانی دارند. تفاوت مهم زمانی است که به توان پیمانهای نیاز دارید: pow(a, b, mod) میتواند (a به توان b) را به صورت پیمانهای و بسیار بهینه محاسبه کند. این روش هم سریعتر است و هم جلوی ساخت عددهای بسیار بزرگ را میگیرد؛ بنابراین در مسائل الگوریتمی و محاسباتی اهمیت زیادی دارد.
۵) تابع round در پایتون (روند کردن/گرد کردن) + ndigits
تابع round برای گرد کردن استفاده میشود: round(x) عدد را به نزدیکترین عدد صحیح گرد میکند و round(x, ndigits) تا تعداد رقم اعشار مشخص (یا حتی با ndigits منفی برای گرد کردن سمت چپ ممیز) انجام میشود. نکته مهم این است که round در پایتون از قانون «نیمبهزوج» (round half to even) استفاده میکند؛ یعنی در حالتهای دقیقاً نیم (مثل 2.5) همیشه رو به بالا نمیرود و به نزدیکترین عدد زوج گرد میکند.
۶) نکته مهم پول و قیمت: چرا round همیشه کافی نیست؟
در سناریوهای مالی مثل فاکتور، تخفیف و مالیات، اگر محاسبات را با float انجام دهید، ممکن است به خاطر خطای نمایش اعشاری و سپس گرد کردن، نتیجه نهایی با انتظار یا قوانین مالی شما یکسان نباشد. round فقط گرد میکند و مشکل پایهای float را «حل» نمیکند. در چنین مواردی، راه استاندارد استفاده از Decimal یا نگهداشتن مقادیر از ابتدا به واحد صحیح (مثل تومان/ریال) است تا اعشار وارد محاسبه نشود.
۷) الگوهای ترکیبی: استفاده همزمان از abs/pow/round در یک مسئله واقعی
در پروژههای واقعی معمولاً این توابع را ترکیبی استفاده میکنید. مثلاً در یک مدل امتیازدهی ساده میتوان خطا را به صورت predicted – real محاسبه کرد، بزرگی خطا را با abs گرفت، جریمه را با توان (مثلاً مربع خطا) سنگینتر کرد و در نهایت امتیاز را با round مرتب نمایش داد. این الگو در تحلیل خطا، امتیازدهی، و پایش کیفیت پیشبینیها کاربردی است.
۸) تمرینهای مرحلهای با حل کامل
در انتهای درس، تمرینها از سطح مبتدی تا چالشی طراحی شدهاند تا هم abs و round را در سناریوهای روزمره ببینید و هم با pow (بهخصوص حالت پیمانهای) آشنا شوید. پاسخ کامل هر تمرین هم ارائه شده است.
۹) اشتباهات رایج و راهحل سریع
بخش اشتباهات رایج، روی چند خطای پرتکرار تمرکز دارد: انتظار گرد کردن متفاوت از سیاست پایتون (خصوصاً در .5)، تکیه بیش از حد روی round برای پوشاندن خطای float، استفاده اشتباه از ndigits، کند کردن برنامه با محاسبات توان بزرگ و سپس گرفتن پیمانه، و همچنین فراموش کردن تبدیل نوع ورودیها از رشته به عدد.
۱۰) FAQ به سبک جستوجوی واقعی + جمعبندی
در پایان، چند سؤال پرتکرار به سبک جستوجوی واقعی را مرور میکنیم تا ابهامهای رایج (مثل round نیمبهزوج، تفاوت pow و **، و مشکل round با float) سریع و روشن پاسخ داده شوند.
Code Examples
# Example 1: abs برای اختلاف قیمت (سناریوی ساده فروش)
learnlimoo_old_price = 485_000
learnlimoo_new_price = 459_000
price_change = learnlimoo_new_price - learnlimoo_old_price
print("Raw change:", price_change)
print("Absolute change:", abs(price_change))
# Example 2: فاصله روی محور عددی (اختلاف بدون علامت)
a = -12
b = 7
distance = abs(a - b)
print("Distance:", distance)
# Example 3: pow و ** (توان معمولی)
views_day1 = 120
growth_factor = 1.15
views_day7_est = views_day1 * (growth_factor ** 6)
print("Estimated views day7:", round(views_day7_est, 2))
# Example 4: pow با mod (پیمانهای) - مفید برای محاسبات عددی/الگوریتمی
# مثلا: (7^222) mod 13
print(pow(7, 222, 13))
# Example 5: round با ndigits مثبت و منفی
print(round(3.14159, 2)) # 3.14
print(round(1234, -2)) # 1200
# Example 6: نکته round نیمبهزوج
print(round(2.5)) # 2
print(round(3.5)) # 4
# Example 7: ترکیب abs/pow/round برای امتیازدهی بر اساس خطا
# امتیاز = 100 - (abs(error) ** 2) * 10 (فقط یک مدل ساده)
real_value = 42
predicted_value = 39
error = predicted_value - real_value
penalty = (abs(error) ** 2) * 10
score = max(0, 100 - penalty)
print("error:", error, "score:", round(score, 2))
Practical Exercises
تمرین ۱ (مبتدی): اختلاف بدون علامت
یک عدد ورودی به نام delta دارید که ممکن است منفی یا مثبت باشد (مثلاً تغییر موجودی). مقدار «بزرگی تغییر» را چاپ کنید.
راهحل:
delta = -27
magnitude = abs(delta)
print(magnitude)
تمرین ۲ (متوسط): گرد کردن قیمت با تخفیف
قیمت یک محصول 275000 تومان است. 12.5٪ تخفیف میخورد. مبلغ نهایی را تا 0 رقم اعشار (عدد صحیح تومان) گرد کنید و چاپ کنید. (فقط از float و round استفاده کنید.)
راهحل:
price_toman = 275_000
discount_percent = 12.5
final_price = price_toman * (1 - discount_percent / 100)
print(round(final_price))
تمرین ۳ (چالشی): امتیازدهی خطا با توان و نمایش مرتب
دو لیست دارید: real و predicted. برای هر آیتم، خطا را حساب کنید، جریمه را برابر مربع قدر مطلق خطا در نظر بگیرید (abs(error)**2)، و میانگین جریمه را تا 2 رقم اعشار نمایش دهید.
راهحل:
real = [10, 15, 20, 18, 25]
predicted = [12, 14, 19, 22, 24]
penalties = []
for r, p in zip(real, predicted):
error = p - r
penalty = abs(error) ** 2
penalties.append(penalty)
avg_penalty = sum(penalties) / len(penalties)
print(round(avg_penalty, 2))
تمرین ۴ (تکمیلی/الگوریتمی): پیمانهای سریع با pow
مقدار (5^123456) mod 97 را محاسبه و چاپ کنید (بدون اینکه 5**123456 را بسازید).
راهحل:
print(pow(5, 123456, 97))
Common Mistakes
- فکر کردن به اینکه round همیشه .5 را رو به بالا میبرد: در پایتون round(2.5)=2 و round(3.5)=4 است. اگر سیاست متفاوت میخواهید، باید صریح انتخاب کنید (مثلاً Decimal با حالت rounding مناسب).
- تکیه روی round برای درستکردن خطای float: round فقط نمایش/گرد کردن را عوض میکند؛ خود خطای نمایش اعشاری را «حل» نمیکند.
- استفاده اشتباه از ndigits: ndigits منفی یعنی گرد کردن سمت چپ ممیز. مثال: round(987, -1)=990.
- کند کردن برنامه با a**b و سپس %mod: برای پیمانهای از pow(a,b,mod) استفاده کنید تا هم سریعتر باشد هم از عددهای خیلی بزرگ جلوگیری شود.
- عدم تبدیل نوع: اگر ورودی از کاربر رشته است، قبل از abs/pow/round باید به int/float تبدیل شود.
FAQ
چرا round(2.5) در پایتون 2 میشود نه 3؟
چون round در پایتون از قانون «نیمبهزوج» (round half to even) استفاده میکند و 2.5 را به نزدیکترین عدد زوج یعنی 2 گرد میکند. این رفتار برای کاهش خطای تجمعی در گرد کردنهای زیاد طراحی شده است. برای سیاستهای دیگر باید از Decimal یا منطق گرد کردن سفارشی استفاده کنید.
فرق pow با ** در پایتون چیه؟
در اکثر استفادههای معمولی pow(a, b) و a**b نتیجه یکسان میدهند. تفاوت مهم این است که pow(a, b, mod) میتواند توان را به صورت پیمانهای و بسیار بهینه حساب کند. این قابلیت برای محاسبات الگوریتمی و عددهای خیلی بزرگ کاربردی است.
تابع abs در پایتون دقیقاً چه کاری میکند؟
abs مقدار قدر مطلق را برمیگرداند و علامت منفی را حذف میکند. رایجترین استفادهاش محاسبه اختلاف بدون علامت است، مثل abs(a-b). اگر ورودی رشته باشد باید قبلش به عدد تبدیل شود.
چرا round(1.005, 2) بعضی وقتها 1.0 میدهد؟
چون 1.005 در float معمولاً دقیق ذخیره نمیشود و ممکن است مقدار واقعی در حافظه کمی کمتر از 1.005 باشد. در این حالت گرد کردن تا 2 رقم اعشار میتواند به 1.00 برسد. برای محاسبات مالی بهتر است از Decimal یا محاسبه با واحد صحیح استفاده شود.
برای گرد کردن قیمت تومان در پایتون از round استفاده کنم یا راه بهتر هست؟
اگر فقط نمایش ساده است، round میتواند کافی باشد، اما برای محاسبات مالی قابل اتکا معمولاً Decimal انتخاب بهتری است. راه دیگر این است که مبلغ را از ابتدا به واحد صحیح (مثلاً ریال یا تومان) نگه دارید و اعشار را وارد محاسبه نکنید. انتخاب درست به حساسیت پروژه و قوانین گرد کردن شما بستگی دارد.
در پایان
در این درس، سه ابزار کلیدی از توابع ریاضی پایتون را به شکل پروژهمحور یاد گرفتیم: abs برای اندازه اختلاف، pow برای توان (و حالت پیمانهای)، و round برای گرد کردن با قوانین مشخص پایتون. اگر روی رفتار round و محدودیت float حساس باشید، خروجیهای عددیتان هم در اسکریپتهای ساده و هم در ابزارهای واقعی قابل اعتمادتر میشود. قدم بعدی این است که همین مفاهیم را داخل چند پروژه کوچک تمرین کنید و بهمرور سراغ ماژول math و Decimal بروید.
همچنین می توانید به دوره جامع آموزش پایتون از 0 تا 100 لرن لیمو هم یه سری بزنید.
همچنین نظرات شما باعث دلگرمی ماست.