توابع در پایتون: بلوکهای کد قابل استفاده مجدد
تابع در پایتون قطعهای از کد است که یک کار مشخص را انجام میدهد و میتوان آن را بارها در برنامه فراخوانی کرد. این کار باعث میشود کد شما سازمانیافتهتر، قابل فهمتر و قابل نگهداریتر شود. همچنین از تکرار کد جلوگیری میکند و به شما اجازه میدهد تا کد خود را به بخشهای کوچکتر و قابل مدیریتتر تقسیم کنید.
چرا از توابع استفاده میکنیم؟
- سازماندهی کد: توابع به شما کمک میکنند تا کد خود را به بخشهای منطقی تقسیم کنید.
- استفاده مجدد از کد: یک تابع را میتوان بارها در برنامه فراخوانی کرد، بنابراین نیازی به نوشتن مجدد کد مشابه نیست.
- افزایش خوانایی کد: توابع با نامهای توصیفی میتوانند کد شما را بسیار خواناتر کنند.
- تست آسانتر کد: توابع را میتوان به صورت جداگانه تست کرد.
- کاهش خطا: با تقسیم کردن کد به توابع کوچکتر، پیدا کردن و رفع خطاها آسانتر میشود.
نحوه تعریف یک تابع در پایتون
برای تعریف یک تابع در پایتون، از کلمه کلیدی def
استفاده میشود. پس از آن نام تابع و پرانتزهایی قرار میگیرد که در صورت نیاز پارامترهای تابع را در خود جای میدهند. بدنه تابع با یک تب تورفتگی شروع میشود.
def نام_تابع(پارامتر۱, پارامتر۲, ...):
# بدنه تابع
# دستورات داخل تابع
return مقدار_بازگشتی # اختیاری
-
def function_name(parameters): """Optional docstring.""" # Code block return value # Optional
def
: کلمه کلیدی برای تعریف تابعنام_تابع
: نامی که برای تابع انتخاب میکنید. بهتر است نامی توصیفی و مرتبط با کار تابع انتخاب شود.پارامترها
: متغیرهایی هستند که به عنوان ورودی به تابع داده میشوند.بدنه تابع
: مجموعهای از دستورات که توسط تابع اجرا میشوند.return
: (اختیاری) مقداری را که تابع برمیگرداند مشخص میکند. اگر عبارتی پس ازreturn
نوشته نشود، تابع مقدارNone
را برمیگرداند.
مثال
def سلام_بگو(نام):
print(f"سلام {نام}!")
سلام_بگو("علی") # خروجی: سلام علی!
در این مثال، تابعی به نام سلام_بگو
تعریف شده است که یک پارامتر به نام نام
میگیرد و یک پیام سلام را چاپ میکند.
فراخوانی تابع
برای اجرای یک تابع، کافی است نام آن را به همراه آرگومانهای آن (در صورت وجود) درون پرانتز بنویسیم.
انواع پارامترها
-
انواع پارامترها در توابع پایتون
در پایتون، توابع میتوانند انواع مختلفی از پارامترها را بپذیرند. هر نوع پارامتر، نحوهی ارسال آرگومانها به تابع و رفتار تابع را به گونهای متفاوت تعریف میکند. در ادامه به بررسی انواع اصلی پارامترها در پایتون میپردازیم:
۱. پارامترهای ضروری (Positional Arguments)- تعریف: این پارامترها باید به ترتیب هنگام فراخوانی تابع مشخص شوند.
- مثال: Python
def جمع(a, b): return a + b نتیجه = جمع(۳, ۵) # a=3, b=5
۲. پارامترهای پیشفرض (Default Arguments)- تعریف: برای این پارامترها، یک مقدار پیشفرض مشخص میشود. اگر هنگام فراخوانی تابع، مقداری برای این پارامترها داده نشود، از مقدار پیشفرض استفاده میشود.
- مثال: Python
def سلام_بگو(نام="مهمان"): print(f"سلام {نام}!") سلام_بگو() # خروجی: سلام مهمان! سلام_بگو("علی") # خروجی: سلام علی!
۳. پارامترهای متغیر موقعیتی (*args)- تعریف: با استفاده از
*args
میتوان تعداد نامحدودی آرگومان موقعیتی را به تابع ارسال کرد. این آرگومانها به صورت یک تاپل در داخل تابع قابل دسترسی هستند. - مثال: Python
def جمع_همه(*اعداد): نتیجه = ۰ for عدد in اعداد: نتیجه += عدد return نتیجه نتیجه = جمع_همه(۱, ۲, ۳, ۴) # خروجی: ۱۰
۴. پارامترهای متغیر کلیدی (**kwargs)- تعریف: با استفاده از
**kwargs
میتوان تعداد نامحدودی آرگومان کلیدی را به تابع ارسال کرد. این آرگومانها به صورت یک دیکشنری در داخل تابع قابل دسترسی هستند. - مثال: Python
def چاپ_اطلاعات(**اطلاعات): for کلید, مقدار in اطلاعات.items(): print(f"{کلید}: {مقدار}") چاپ_اطلاعات(نام="علی", سن=۳۰, شهر="تهران")
۵. پارامترهای کیوردی (Keyword Arguments)- تعریف: پارامترهایی هستند که هنگام فراخوانی تابع با نامشان مشخص میشوند. ترتیب آنها اهمیتی ندارد.
- مثال: Python
def تقسیم(عدد_تقیسم_شونده, مخرج): return عدد_تقیسم_شونده // مخرج نتیجه = تقسیم(مخرج=۳, عدد_تقیسم_شونده=۱۷)
نکات مهم:
- پارامترهای ضروری باید قبل از پارامترهای پیشفرض قرار بگیرند.
- پارامترهای
*args
باید قبل از**kwargs
قرار بگیرند. - ترکیب این انواع پارامترها در تعریف توابع امکانپذیر است.
- ترتیب پارامترهای کیوردی هنگام فراخوانی تابع مهم نیست، اما ترتیب پارامترهای موقعیتی مهم است.
مثال ترکیب انواع پارامترها:
Pythondef تابع_نمونه(a, b=۲, *args, **kwargs): print(a, b, args, kwargs) تابع_نمونه(۱, c=۳, d=۴, x=۵, y=۶)
در این مثال:
a
یک پارامتر ضروری است.b
یک پارامتر پیشفرض با مقدار ۲ است.*args
یک پارامتر متغیر موقعیتی است که مقادیر(۳, ۴)
را دریافت میکند.**kwargs
یک پارامتر متغیر کلیدی است که دیکشنری{'c': 3, 'd': 4, 'x': 5, 'y': 6}
را دریافت میکند.
با درک این انواع پارامترها، میتوانید توابع منعطف و قدرتمندی در پایتون تعریف کنید.
مثالهای بیشتر
def جمع(a, b):
return a + b
نتیجه = جمع(۳, ۵)
print(نتیجه) # خروجی: ۸
def محاسبه_مساحت_دایره(شعاع):
pi = ۳.۱۴۱۵۹
مساحت = pi * شعاع * شعاع
return مساحت
توابع با چندین مقدار بازگشتی
در پایتون، یک تابع میتواند چندین مقدار را به عنوان خروجی بازگرداند. این کار با استفاده از ویژگیهای Tuple (یک نوع داده در پایتون که میتواند چندین مقدار را در خود نگه دارد) به راحتی انجام میشود. هنگامی که یک تابع چند مقدار را برمیگرداند، در واقع یک Tuple برگردانده میشود که میتوانید آن را به متغیرهای مختلف اختصاص دهید.
۱. بازگرداندن چند مقدار در یک تابع
برای بازگرداندن چندین مقدار از یک تابع، به سادگی مقادیر را به صورت جدا شده با کاما ,
پس از دستور return
قرار دهید.
مثال ۱: تابعی که دو مقدار را بازمیگرداند
def get_coordinates(): x = 10 y = 20 return x, y # دریافت مقادیر بازگشتی x_coord, y_coord = get_coordinates() print(f"x: {x_coord}, y: {y_coord}") # خروجی: x: 10, y: 20
در این مثال، تابع get_coordinates
دو مقدار x
و y
را بازمیگرداند. هنگام فراخوانی تابع، این مقادیر به دو متغیر x_coord
و y_coord
اختصاص داده میشوند.
۲. بازگرداندن چندین مقدار به صورت Tuple
اگر نیاز به استفاده از تمامی مقادیر بازگشتی به صورت یکجا دارید، میتوانید به صورت مستقیم یک Tuple را دریافت کنید.
مثال ۲: دریافت مقادیر به صورت Tuple
def get_user_info(): name = "Ali" age = 30 city = "Tehran" return name, age, city user_info = get_user_info() print(user_info) # خروجی: ('Ali', 30, 'Tehran') # دسترسی به هر مقدار با استفاده از اندیس print(user_info[0]) # خروجی: Ali print(user_info[1]) # خروجی: ۳۰ print(user_info[2]) # خروجی: Tehran
۳. تخصیص چندین مقدار بازگشتی به متغیرها
میتوانید چندین مقدار بازگشتی را به متغیرهای جداگانه اختصاص دهید.
مثال ۳: تخصیص مقادیر به متغیرهای جداگانه
def get_statistics(numbers): mean = sum(numbers) / len(numbers) maximum = max(numbers) minimum = min(numbers) return mean, maximum, minimum numbers = [1, 2, 3, 4, 5] mean_val, max_val, min_val = get_statistics(numbers) print(f"Mean: {mean_val}, Max: {max_val}, Min: {min_val}") # خروجی: Mean: 3.0, Max: 5, Min: 1
۴. بازگرداندن چندین مقدار به صورت دیکشنری (اختیاری)
گاهی اوقات، ممکن است بخواهید مقادیر بازگشتی با نامهای مشخصی برگردانده شوند. در این صورت میتوانید از دیکشنری استفاده کنید.
مثال ۴: بازگرداندن چندین مقدار با استفاده از دیکشنری
def get_student_details(): student = { "name": "Sara", "age": 22, "major": "Computer Science" } return student details = get_student_details() print(details) # خروجی: {'name': 'Sara', 'age': 22, 'major': 'Computer Science'} print(details['name']) # خروجی: Sara
توابع بازگشتی
توابع بازگشتی توابعی هستند که خودشان را فراخوانی میکنند. این نوع توابع برای حل مسائل بازگشتی بسیار مفید هستند.
def فاکتوریل(n):
if n == ۰:
return ۱
else:
return n * فاکتوریل(n-۱)
تابع با تعداد نامشخص آرگومانها
در پایتون، *args
(که میتواند هر نام دلخواهی داشته باشد، اما به طور معمول args
نامیده میشود) به شما این امکان را میدهد که تعداد متغیری از آرگومانها را به یک تابع ارسال کنید. این ویژگی زمانی مفید است که نمیدانید تابع شما چند آرگومان دریافت خواهد کرد، یا وقتی که میخواهید توابعی انعطافپذیر داشته باشید.
۱. تعریف تابع با *args
هنگامی که از *args
در تعریف یک تابع استفاده میکنید، همه آرگومانهای اضافی که به تابع ارسال میشوند به عنوان یک Tuple در args
جمعآوری میشوند.
مثال ۱: تابعی که جمع تمامی آرگومانها را محاسبه میکند
def add_numbers(*args): return sum(args) result = add_numbers(1, 2, 3, 4) print(result) # خروجی: ۱۰
در این مثال، تابع add_numbers
میتواند هر تعداد آرگومان عددی را دریافت کند و جمع آنها را محاسبه کند.
۲. استفاده از *args همراه با آرگومانهای دیگر
میتوانید *args
را همراه با سایر آرگومانهای ثابت در یک تابع استفاده کنید. فقط باید دقت کنید که *args
باید بعد از سایر آرگومانها بیاید.
مثال ۲: ترکیب آرگومانهای ثابت و *args
def greet(greeting, *names): for name in names: print(f"{greeting}, {name}!") greet("Hello", "Ali", "Sara", "John") # خروجی: # Hello, Ali! # Hello, Sara! # Hello, John!
در این مثال، آرگومان greeting
به صورت ثابت است و *names
یک Tuple از اسامی است که به تابع ارسال شدهاند.
۳. استفاده از *args برای ارسال لیست/تاپل به عنوان آرگومانها
اگر میخواهید یک لیست یا Tuple را به صورت آرگومانهای جداگانه به یک تابع ارسال کنید، میتوانید از *
استفاده کنید.
مثال ۳: ارسال لیست به عنوان آرگومانهای جداگانه
def multiply(*args): result = 1 for num in args: result *= num return result numbers = [2, 3, 4] print(multiply(*numbers)) # خروجی: ۲۴
۴. کاربردهای رایج *args
مثال ۴: تابعی که مقدار بیشترین آرگومان را پیدا میکند
def find_max(*args): return max(args) print(find_max(1, 3, 5, 7, 9)) # خروجی: ۹
مثال ۵: تابعی که رشتهها را با هم ترکیب میکند
def concatenate_strings(*args): return ' '.join(args) print(concatenate_strings("Python", "is", "awesome!")) # خروجی: "Python is awesome!"
نکات مهم
- نام توابع باید توصیفی و با حروف کوچک نوشته شوند.
- از استفاده از کاراکترهای خاص در نام توابع خودداری کنید.
- سعی کنید توابعی با عملکرد مشخص و محدود تعریف کنید.
- از توابع بازگشتی با احتیاط استفاده کنید تا از ایجاد حلقههای بینهایت جلوگیری شود.
با استفاده از توابع، کدهای خود را سازماندهی کرده، خوانایی آنها را افزایش داده و از قابلیت استفاده مجدد آنها بهرهمند شوید.