آموزش توان در پایتون | operator ** و تابع pow به زبان ساده (بههمراه ریشه و نکات پیشرفته)

اگر دنبال «توان در پایتون» هستید، معمولاً یا میخواهید سریع توان یک عدد را حساب کنید، یا در پروژهتان به ریشهگیری، توان منفی، یا حتی محاسبات بزرگ (مثل کارهای رمزنگاری یا تولید کد) رسیدهاید. در پایتون دو ابزار اصلی دارید: عملگر ** و تابع pow. در کلاسها و پروژههایی که برای اسکریپتهای اتوماسیون، گزارشگیری، یا ابزارهای کوچک مالی نوشتهام، همین دو ابزار بارها استفاده میشوند—از محاسبه رشد مرکب گرفته تا نرمالسازی دادهها. این درس را طوری جلو میبریم که هم برای شروع راحت باشد و هم نکات حرفهای مثل pow با modulus و دامهای رایج را پوشش بدهد.
۱) توان در پایتون با عملگر **
سادهترین راه برای محاسبه توان، استفاده از عملگر ** است. کافی است عدد پایه را در سمت چپ و توان را در سمت راست قرار دهید.
۲) توان صفر و توان منفی
در پایتون، توان صفر معمولاً نتیجه ۱ میدهد و توان منفی خروجی اعشاری تولید میکند. این رفتار طبیعی است و باید در طراحی مسئله (خصوصاً اگر خروجی صحیح میخواهید) به آن توجه کنید.
۳) تقدم عملگرها و راستبهچپ بودن **
عملگر ** از راست به چپ محاسبه میشود. یعنی عبارت 2 ** 3 ** 2 به شکل 2 ** (3 ** 2) تفسیر میشود، نه (2 ** 3) ** 2. برای جلوگیری از برداشت اشتباه، از پرانتز استفاده کنید.
۴) تابع pow در پایتون (دو آرگومان)
تابع pow(a, b) همان مفهوم a ** b را دارد و خوانایی کد را در بعضی سناریوها بهتر میکند.
۵) pow با سه آرگومان: توان ماژولار (mod)
وقتی به محاسبه (a ** b) % mod نیاز دارید—خصوصاً با اعداد بزرگ—استفاده از pow(a, b, mod) انتخاب حرفهایتری است، چون هم دقیقاً همان محاسبه را انجام میدهد و هم بهینهتر اجرا میشود.
۶) ریشهگیری در پایتون
برای ریشه دوم میتوانید از math.sqrt استفاده کنید. برای ریشه nام هم میتوانید از توان کسری (x ** (1/n)) کمک بگیرید.
۷) ریشه عدد منفی و عدد مختلط (complex)
اگر واقعاً به ریشهگیری عدد منفی نیاز دارید، نتیجه در فضای اعداد مختلط معنی پیدا میکند. در این حالت میتوانید از توان کسری روی عدد منفی استفاده کنید تا خروجی مختلط دریافت شود.
۸) یک سناریوی واقعی: رشد مرکب (مالی)
توان در مسائل مالی مثل رشد مرکب کاربرد زیادی دارد. در این سناریو مقدار آینده با فرمول principal * ((1 + rate) ** years) محاسبه میشود.
۹) دقت اعشاری و استفاده از Decimal
در محاسبات حساس (مثل مالی)، خطای float میتواند اثرگذار باشد. برای کنترل بهتر دقت، میتوانید از Decimal استفاده کنید و دقت محاسبات را با context تنظیم کنید.
print('--- LearnLimoo | توان و pow ---')
# 1) توان با **
learnlimoo_a = 2
learnlimoo_b = 5
print('2 ** 5 =', learnlimoo_a ** learnlimoo_b)
# 2) توان صفر و توان منفی
print('5 ** 0 =', 5 ** 0)
print('2 ** -3 =', 2 ** -3)
# 3) تقدم و راستبهچپ بودن **
print('2 ** 3 ** 2 =', 2 ** 3 ** 2) # 2 ** (3 ** 2)
print('(2 ** 3) ** 2 =', (2 ** 3) ** 2)
# 4) pow با دو آرگومان
print('pow(3, 4) =', pow(3, 4))
# 5) pow با سه آرگومان (ماژولار) - بسیار کاربردی برای اعداد بزرگ
# (a ** b) % mod اما بهینهتر
print('pow(7, 128, 13) =', pow(7, 128, 13))
# 6) ریشهگیری
import math
x = 81
print('sqrt(81) =', math.sqrt(x))
# ریشه nام با توان کسری
n = 4
print('ریشه چهارم 81 =', x ** (1 / n))
# 7) ریشه عدد منفی با complex (وقتی واقعاً به عدد مختلط نیاز دارید)
z = -16
print('(-16) ** 0.5 =', z ** 0.5)
# 8) مثال رشد مرکب (سناریوی مالی)
principal = 50_000_000 # ریال
rate = 0.28 # 28 درصد
years = 3
future_value = principal * ((1 + rate) ** years)
print('LearnLimoo | Future Value =', round(future_value))
# 9) Decimal برای دقت بهتر در سناریوهای حساس
from decimal import Decimal, getcontext
getcontext().prec = 28
principal_d = Decimal('50000000')
rate_d = Decimal('0.28')
years_d = 3
future_value_d = principal_d * ((Decimal('1') + rate_d) ** years_d)
print('LearnLimoo | Future Value (Decimal) =', future_value_d)
۱) تمرین (مبتدی):
یک تابع بنویسید که برای ورودیهای a و b مقدار a به توان b را برگرداند و نتیجه را چاپ کند. ورودیها میتوانند منفی هم باشند.
راهحل:
def learnlimoo_power(a, b):
return a ** b
print(learnlimoo_power(3, 4)) # 81
print(learnlimoo_power(2, -3)) # 0.125
۲) تمرین (متوسط):
عدد x و n را بگیرید و ریشه nام x را حساب کنید. اگر n صفر بود پیام خطای مناسب چاپ کنید.
راهحل:
def nth_root(x, n):
if n == 0:
raise ValueError('n نمیتواند صفر باشد')
return x ** (1 / n)
print(nth_root(81, 4))
print(nth_root(27, 3))
۳) تمرین (نزدیک به پروژه / چالشی):
یک تابع بنویسید که با گرفتن base، exp و mod مقدار (base ** exp) % mod را محاسبه کند. سپس با اعداد بزرگ تست کنید تا مطمئن شوید سریع اجرا میشود.
راهحل:
def mod_power(base, exp, mod):
if mod <= 0:
raise ValueError('mod باید عددی مثبت باشد')
return pow(base, exp, mod)
print(mod_power(7, 128, 13))
print(mod_power(123456789, 987654321, 97))
- اشتباه در تقدم عملگرها: فکر میکنیم 2 ** 3 ** 2 یعنی (2 ** 3) ** 2؛ درحالیکه راستبهچپ است. راهحل: پرانتز بگذارید.
- استفاده اشتباه از // به جای / در ریشهگیری: x ** (1//2) میشود x ** 0 و خروجی 1 میدهد. راهحل: برای توان کسری همیشه از / استفاده کنید.
- انتظار خروجی int از توان منفی: 2 ** -3 ذاتاً اعشاری است. راهحل: اگر خروجی صحیح میخواهید، مسئله را بازتعریف کنید (مثلاً توان را غیرمنفی بگیرید).
- ریشه گرفتن با math.sqrt از عدد منفی: math.sqrt(-1) خطا میدهد. راهحل: اگر منظور شما عدد مختلط است از (-1) ** 0.5 یا cmath.sqrt استفاده کنید.
- مقایسه اعشاریها بعد از توان: بهخاطر خطای float ممکن است (0.1 ** 2) دقیقاً چیزی که انتظار دارید نباشد. راهحل: برای مالی/حساس از Decimal یا گرد کردن کنترلشده استفاده کنید.
برای جمعبندی: «توان در پایتون» را در کارهای روزمره با ** خیلی راحت انجام میدهید، اما وقتی پای محاسبات ماژولار و اعداد بزرگ وسط است pow(a, b, mod) انتخاب حرفهایتری است. برای ریشهگیری هم یا از math.sqrt استفاده کنید یا از توان کسری، با این دقت که عدد منفی و دقت اعشاری (float) میتواند نتیجه را حساس کند. اگر این مفاهیم را با چند تمرین و یک سناریوی واقعی مثل رشد مرکب جا بیندازید، در بسیاری از محاسبات ریاضی در پایتون دستتان بازتر میشود.
آموزش های رایگان ویدیویی همراه با سورس کد پایتون در لرن لیمو مرجع پایتون ایران، همراه با دوره جامع پایتون 3.