Functools در پایتون و تابع def در پایتون (آموزش به زبان ساده)
پایتون به عنوان یکی از زبانهای برنامهنویسی پویا و پرکاربرد، ابزارها و کتابخانههای متنوعی را برای توسعهدهندگان فراهم میکند.دو مورد از این ابزارها که بسیار مهم و کاربردی هستند، ماژول functools و تعریف توابع با استفاده از def میباشند.در این مقاله به بررسی این دو موضوع خواهیم پرداخت و کاربردهای آنها را مورد بحث قرار خواهیم داد.
بخش اول: تابع def در پایتون
توابع در پایتون از مهمترین اجزای ساختاری این زبان برنامهنویسی هستند.توابع امکان تفکیک و دستهبندی کدها را فراهم میکنند، که این امر باعث بهبود خوانایی و نگهداری کدها میشود.در پایتون، برای تعریف یک تابع از کلمه کلیدی def استفاده میشود.
1.1.تعریف توابع
برای تعریف یک تابع در پایتون، ابتدا باید از کلمه کلیدی def استفاده کرده و سپس نام تابع را تعیین کنید.به دنبال آن، پرانتزهایی قرار میگیرند که میتوانند شامل پارامترهای ورودی باشند.بعد از پرانتزها، یک علامت دونقطه (:) قرار داده میشود و در خطوط بعد، بلوک کد تابع نوشته میشود که باید با یک تورفتگی (indentation) همراه باشد.
def greet(name):
print(f"Hello, {name}!")
در مثال بالا، تابعی به نام greet تعریف شده است که یک پارامتر ورودی به نام name میپذیرد و پیام خوشامدگویی را چاپ میکند.
تمرین های برنامه نویسی پایتون+ مثال برنامه نویسی پایتون
1.2.بازگشت مقادیر
توابع میتوانند مقداری را به عنوان خروجی بازگردانند.برای این کار از کلمه کلیدی return استفاده میشود.
def add(a, b):
return a + b
در مثال بالا، تابع add دو پارامتر a و b را به عنوان ورودی میپذیرد و مجموع آنها را به عنوان خروجی باز میگرداند.
1.3.پارامترهای پیشفرض
در پایتون، میتوان برای پارامترهای توابع مقادیر پیشفرض تعیین کرد.این کار با قرار دادن مقدار پیشفرض پس از علامت = در تعریف پارامترها انجام میشود.
def greet(name="World"):
print(f"Hello, {name}!")
در این مثال، اگر تابع greet بدون ورودی فراخوانی شود، به طور پیشفرض پیام "!Hello, World" چاپ خواهد شد.
1.4.پارامترهای نامحدود
پایتون امکان تعریف توابعی را فراهم میکند که تعداد نامحدودی از پارامترها را بپذیرند.این کار با استفاده از args و kwargs انجام میشود.
def sum_all(args):
return sum(args)
def print_info(kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
در مثال اول، تابع sum_all تعداد نامحدودی از اعداد را به عنوان ورودی پذیرفته و مجموع آنها را باز میگرداند.در مثال دوم، تابع print_info تعداد نامحدودی از پارامترهای کلید-مقدار (key-value) را پذیرفته و آنها را چاپ میکند.
آموزش کامل هوش مصنوعی: آموزش هوش مصنوعی از صفر تا صد با 14 درس+ جزوه
بخش دوم: ماژول functools در پایتون
ماژول functools مجموعهای از ابزارهای کاربردی برای کار با توابع و callable ها در پایتون فراهم میکند.این ماژول شامل تعدادی تابع و دکوریتور است که به توسعهدهندگان کمک میکنند تا با توابع به شکلی مؤثرتر و کارآمدتر کار کنند.
2.1.دکوریتور functools.lru_cache@
یکی از کاربردیترین دکوریتورهای موجود در functools، دکوریتور functools.lru_cache@ است که برای بهینهسازی و افزایش سرعت اجرای توابع از طریق ذخیرهسازی نتایج قبلی (caching) استفاده میشود.
import functools
@functools.lru_cache(maxsize=128)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
در این مثال، تابع fibonacci با استفاده از دکوریتور functools.lru_cache@ بهینهسازی شده است.این دکوریتور نتایج محاسبات قبلی را ذخیره میکند و در صورت نیاز به همان نتیجه، از حافظه بازیابی میکند به جای محاسبه مجدد.
2.2.دکوریتور functools.wraps@
هنگام تعریف دکوریتورهای سفارشی، استفاده از دکوریتور functools.wraps@ میتواند کمک کند تا اطلاعات تابع اصلی مانند نام، داکیومنت و غیره حفظ شوند.
import functools
def my_decorator(func):
@functools.wraps(func)
def wrapper(args, kwargs):
print("Before the function call")
result = func(args, kwargs)
print("After the function call")
return result
return wrapper
@my_decorator
def say_hello(name):
print(f"Hello, {name}!")
در این مثال، دکوریتور my_decorator با استفاده از functools.wraps@ تعریف شده است تا اطلاعات تابع say_hello حفظ شود.
پایتون برای چه سنی مناسب است؟ چقدر طول می کشد؟
2.3.تابع functools.partial
تابع functools.partial به شما امکان میدهد تا نسخههای جدیدی از توابع ایجاد کنید که برخی از پارامترهای آنها از پیش تنظیم شدهاند.
import functools
def power(base, exponent):
return base exponent
square = functools.partial(power, exponent=2)
cube = functools.partial(power, exponent=3)
print(square(5)) # Output: 25
print(cube(5)) # Output: 125
در این مثال، دو تابع جدید square و cube از تابع اصلی power ایجاد شدهاند که به ترتیب مقادیر 2 و 3 را به عنوان پارامتر exponent از پیش تنظیم کردهاند.
2.4.تابع functools.reduce
تابع functools.reduce برای اعمال یک تابع به ترتیبی از مقادیر (iterable) و کاهش آنها به یک مقدار واحد استفاده میشود.این تابع به عنوان یک ابزار قوی برای ترکیب مقادیر در یک ترتیب استفاده میشود.
import functools
numbers = [1, 2, 3, 4, 5]
result = functools.reduce(lambda x, y: x + y, numbers)
print(result) # Output: 15
در این مثال، تابع reduce از functools استفاده شده تا مجموع تمام اعداد در لیست numbers محاسبه شود.
دانلود کنید: ۴ جزوه عالی pdf آموزش پایتون
2.5. دکوریتور functools.cache@
دکوریتور functools.cache@ به عنوان یک دکوریتور استفاده میشود و قادر است مقادیر بازگشتی یک تابع را بر اساس ورودیها ذخیره کند. این دکوریتور در پایتون نسخه 3.9 و بالاتر در دسترس است.
اندازه حافظه کش نامحدود است و به همین دلیل، دیکشنری ذخیره شده میتواند به اندازههای بسیار بزرگ رشد کند.
from functools import cache
@cache
def fibonacci(n):
if n in [0, 1]:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(4)) # called 5 times
print(fibonacci(11)) # called 7 times rather than 12 times
حتما دانلود کنید: فیلم های صفر تا صد پایتون
نتیجهگیری
ماژول functools و کلمه کلیدی def در پایتون دو ابزار قدرتمند هستند که به توسعهدهندگان کمک میکنند کدهای خود را به شکل بهینهتر و کارآمدتری بنویسند.توابع با استفاده از def به شما امکان میدهند کدهای خود را تفکیک و سازماندهی کنید، در حالی که functools ابزارهای پیشرفتهتری برای کار با توابع ارائه میدهد که میتوانند بهینهسازی و توسعه کدها را بهبود بخشند.با استفاده مناسب از این ابزارها، میتوانید کدهای پایتون خود را سادهتر، خواناتر و کارآمدتر کنید.