توابع (Functions) در پایتون
جلسه ششم - توابع (Functions) در پایتون
مرجع کامل: تعریف، پارامترها، return، Default و Keyword Arguments، توابع بازگشتی - کدها قابل کپی هستند.
تعریف Function
تابع (Function) یک بلوک از کدهای قابل استفادهی مجدد است که وظیفهی خاصی را انجام میدهد و فقط در صورت فراخوانی (call) اجرا میشود.
در واقع تابع مثل یک «ماشین کوچک» است که ورودی میگیرد، عملیاتی انجام میدهد و در نهایت خروجی برمیگرداند.
def function_name(parameters):
# Function body (statements to be executed)
return result
- اجزای تابع:
def- کلیدواژهای برای تعریف تابعfunction_name- نام تابعParameters- ورودیهای تابع (اختیاری)return- خروجی تابع (اختیاری، در صورت نبود مقدار None برمیگرداند)
مزایای استفاده از تابع
1. کاهش تکرار کد (Code Reusability)
فقط یک بار تعریف میکنی، هرچند بار بخوای اجراش میکنی.
2. افزایش خوانایی (Readability)
برنامهات تمیزتر و بخشبخش میشه.
3. نگهداری راحتتر (Maintainability)
اگه یه تغییر لازم باشه، فقط در همون تابع تغییر میدی نه در کل کد.
4. تقسیم وظایف (Modularity)
برنامه به چند بخش کوچیکتر تقسیم میشه، هرکدوم مسئول کاری خاص.
5. امکان تست آسانتر (Testability)
هر تابع رو جداگانه میتونی تست و دیباگ کنی.
مثالهای پایه
مثال: تابعی بنویسید به نام add_numbers که دو عدد را به عنوان ورودی دریافت کرده و حاصل جمع آنها را برگرداند
def add_numbers(a, b):
result = a + b
return result
print(add_numbers(5, 3))
# output:
# 8
🧠 روش فراخوانی تابع (Function Call)
برای اجرای تابع، فقط نام تابع را مینویسیم و در ادامه داخل پرانتز، مقادیر ورودی (arguments) را قرار میدهیم.
function_name(arguments)
مثال: تابعی بنویسید که نام کاربر را بهعنوان ورودی دریافت کرده و پیام خوشآمدگویی برای او چاپ کند
def welcome(name):
print(f"Hello {name}! Welcome 💫")
user_name = input("Enter your name: ")
welcome(user_name)
# output:
# Enter your name: hamid
# Hello hamid! Welcome 💫
مثال: تابعی بنویسید که یک عدد از کاربر دریافت کند و مشخص کند که آن عدد زوج است یا فرد
def check_number(num):
if num % 2 == 0:
print("The number is even.")
else:
print("The number is odd.")
number = int(input("Enter a number: "))
check_number(number)
# output:
# Enter a number: 7
# The number is odd.
نکته: فرآیند ورودی گرفتن را میتوان داخل تابع هم انجام داد، اما بهتر است اینکار را انجام نداد. چون تابع ما باید کوچکترین جز غیر قابل تجزیه باشد پس اگر ورودی داخل تابع گرفته شود در صورتی که ورودی داده نشود تابع کار نمیکند. اما در حالت دیگر میتوان از لیست یا کاربر یا range ورودی گرفت و تابع ما دیگر یک بار مصرف نیست و از آن میتوان در جاهای دیگر هم استفاده کرد.
نکته: در پایتون، میتوان در یک تابع چندین return داشت.
این یعنی تابع میتواند در مسیرهای مختلف (بر اساس شرطها یا تصمیمها) مقادیر متفاوتی را برگرداند.
زمانی که برنامه به اولین دستور return برسد، اجرای تابع بلافاصله متوقف میشود و همان مقدار به عنوان
خروجی تابع بازگردانده میشود.
مثال: تابعی بنویسید که عددی را از کاربر دریافت کند. اگر عدد زوج بود مقدار True و اگر فرد بود مقدار False برگرداند
def is_even(num):
if num % 2 == 0:
return True
else:
return False
number = int(input("Enter a number: "))
print(is_even(number))
# output:
# Enter a number: 7
# False
مثال: تابعی بنویسید که اعداد اول بین ۱ تا ۱۰۰ را پیدا کرده و نمایش دهد
def prime_numbers():
primes = []
for num in range(2, 101):
is_prime = True
for i in range(2, int(num ** 0.5) + 1):
if num % i == 0:
is_prime = False
break
if is_prime:
primes.append(num)
return primes
print(prime_numbers())
# output:
# [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
پیشفرض گرفتن مقادیر در تابع (Default Arguments)
در پایتون میتوان هنگام تعریف تابع به پارامترها مقدار پیشفرض (default value) اختصاص داد.
این یعنی اگر کاربر هنگام فراخوانی تابع مقداری برای آن پارامتر ارسال نکرد، تابع از مقدار پیشفرض استفاده میکند.
اگر مقدار فرستاده شود، مقدار فرستاده شده جایگزین مقدار پیشفرض میشود.
مزایا:
- انعطافپذیری بالا: میتوان تابع را با یا بدون ورودی فراخوانی کرد.
- کاهش خطا: نیاز نیست همیشه همه ورودیها داده شوند.
- خوانایی بهتر: تابع واضح و ساده میماند و مقادیر پیشفرض مشخص میکنند که در صورت عدم ارسال، چه رفتاری داشته باشد.
def function_name(param1=default1, param2=default2):
# Function body
return result
مثال: تابعی بنویسید به نام greet که یک نام (name) به عنوان ورودی دریافت کند و پیام خوشآمدگویی چاپ کند
اگر نام وارد نشد، پیام باید از مقدار پیشفرض "Guest" استفاده کند.
def greet(name="Guest"):
print(f"Hello {name}!")
greet("Fatima") # output: Hello Fatima!
greet() # output: Hello Guest!
نکات مهم:
1. پارامترهای پیشفرض باید آخر پارامترها قرار گیرند.
# اشتباه:
def func(a=5, b): # Error
pass
# درست:
def func(a, b=5):
pass
2. میتوان چندین پارامتر پیشفرض داشت.
3. مقادیر پیشفرض میتوانند هر نوع دادهای باشند: عدد، رشته، لیست، دیکشنری و …
Positional و Keyword Arguments در پایتون
در پایتون وقتی تابعی را فراخوانی میکنیم، میتوانیم مقادیر ورودی را به دو روش بدهیم:
1. آرگومانهای ترتیبی (Positional Arguments)
مقادیر را به ترتیب پارامترهای تابع میدهیم. یعنی ترتیب ارسال ورودیها مهم است.
2. آرگومانهای کلیدی (Keyword Arguments)
مقادیر را با نام پارامتر مشخص میدهیم. ترتیب اهمیتی ندارد و به نام پارامترها وابسته است.
مزایا:
- Positional: سریع و کوتاه، مناسب وقتی تعداد پارامترها کم است.
- Keyword: خواناتر، جلوگیری از اشتباه در ترتیب، مناسب برای پارامترهای زیاد یا اختیاری.
مثال Positional Arguments: تابعی بنویسید به نام greet که دو پارامتر name و age بگیرد و پیام خوشآمدگویی چاپ کند
def greet(name, age):
print(f"Hello {name}, you are {age} years old.")
greet("Fatima", 20)
# output:
# Hello Fatima, you are 20 years old.
مقدار "Fatima" به name و مقدار 20 به age اختصاص یافت. ترتیب اهمیت دارد؛ اگر برعکس میدادیم نتیجه اشتباه میشد.
مثال Keyword Arguments: تابعی بنویسید به نام greet که دو پارامتر name و age بگیرد و پیام خوشآمدگویی چاپ کند
def greet(name, age):
print(f"Hello {name}, you are {age} years old.")
greet(age=20, name="Fatima")
# output:
# Hello Fatima, you are 20 years old.
مقادیر بر اساس نام پارامتر اختصاص داده شدند. ترتیب ارسال اهمیتی ندارد. خوانایی کد بهتر میشود و خطر اشتباه کاهش مییابد.
توابع بازگشتی (Recursive Functions)
تابع بازگشتی (Recursive Function) تابعی است که خودش را فراخوانی میکند تا مسئلهای را حل کند.
بازگشت معمولاً برای مسائلی استفاده میشود که میتوان آنها را به زیرمسائل کوچکتر تقسیم کرد.
ساختار تابع بازگشتی:
یک تابع بازگشتی معمولاً دو بخش دارد:
1. Base Case (حالت پایه)
شرطی که هنگام تحقق آن تابع دیگر خودش را فراخوانی نمیکند و اجرای تابع متوقف میشود.
جلوگیری میکند از بینهایت حلقه شدن.
2. Recursive Case (حالت بازگشتی)
بخشی که تابع خودش را فراخوانی میکند با دادههای کوچکتر یا سادهتر.
مزایای توابع بازگشتی:
- حل مسائل پیچیده با تقسیم به زیرمسائل سادهتر.
- کد خواناتر و کوتاهتر نسبت به برخی حلقهها.
- مناسب برای ساختارهای دادهای بازگشتی مثل لیستهای تو در تو، درختها و گرافها.
نکات مهم:
- همیشه Base Case داشته باشید تا از حلقه بینهایت جلوگیری شود.
- بازگشت زیاد میتواند باعث Stack Overflow شود (پر شدن حافظه Call Stack).
- بازگشت مناسب برای مسائل تقسیم و حل (Divide and Conquer) است.
مثال: محاسبه فاکتوریل عدد n
def factorial(n):
if n == 0 or n == 1: # Base Case
return 1
else:
return n * factorial(n-1) # Recursive Case
print(factorial(5))
# output:
# 120
مثال: جمع اعداد از 1 تا n
def sum_to_n(n):
if n == 0: # Base Case
return 0
else:
return n + sum_to_n(n-1) # Recursive Case
print(sum_to_n(10))
# output:
# 55
جمعبندی:
- توابع بازگشتی ابزار قدرتمندی برای حل مسائل تقسیم و حل هستند.
- Base Case ضروری است.
- مناسب برای مسائل فاکتوریل، فیبوناچی، پیمایش درخت و گراف، و کار با لیستهای تو در تو.
💡 تمرینها و سوالات
سوال 1: تابع خوشآمدگویی
تابعی بنویسید که نام کاربر را دریافت کند و پیام خوشآمدگویی چاپ کند.
# ورودی: Ali
# خروجی: Welcome Ali!
# راه حل:
def welcome(name):
print(f"Welcome {name}!")
welcome("Ali")
سوال 2: تابع جمع دو عدد
تابعی بنویسید که دو عدد دریافت کند و مجموع آنها را برگرداند.
# ورودی: 5, 3
# خروجی: 8
# راه حل:
def add(a, b):
return a + b
result = add(5, 3)
print(result)
سوال 3: تابع بررسی زوج یا فرد
تابعی بنویسید که عددی دریافت کند و True برگرداند اگر زوج باشد و False اگر فرد باشد.
# ورودی: 4
# خروجی: True
# راه حل:
def is_even(num):
return num % 2 == 0
print(is_even(4)) # True
print(is_even(7)) # False
سوال 4: تابع محاسبه مساحت مستطیل
تابعی بنویسید که طول و عرض مستطیل را دریافت کند و مساحت آن را برگرداند.
# ورودی: 5, 3
# خروجی: 15
# راه حل:
def rectangle_area(length, width):
return length * width
area = rectangle_area(5, 3)
print(area)
سوال 5: تابع بزرگترین عدد
تابعی بنویسید که سه عدد دریافت کند و بزرگترین آنها را برگرداند.
# ورودی: 12, 45, 23
# خروجی: 45
# راه حل:
def find_max(a, b, c):
return max(a, b, c)
# یا بدون استفاده از max:
def find_max(a, b, c):
if a >= b and a >= c:
return a
elif b >= a and b >= c:
return b
else:
return c
print(find_max(12, 45, 23))
سوال 6: تابع با مقدار پیشفرض
تابعی بنویسید که یک عدد دریافت کند و آن را به توان 2 برساند. توان باید مقدار پیشفرض 2 داشته باشد.
# ورودی: 3
# خروجی: 9
# ورودی: 2, 3
# خروجی: 8
# راه حل:
def power(base, exponent=2):
return base ** exponent
print(power(3)) # 9
print(power(2, 3)) # 8
سوال 7: تابع تبدیل سانتیگراد به فارنهایت
تابعی بنویسید که دما را از سانتیگراد به فارنهایت تبدیل کند.
# فرمول: F = C × 9/5 + 32
# ورودی: 0
# خروجی: 32.0
# راه حل:
def celsius_to_fahrenheit(celsius):
return celsius * 9/5 + 32
temp = celsius_to_fahrenheit(0)
print(temp)
سوال 8: تابع شمارش حروف صدادار
تابعی بنویسید که رشتهای دریافت کند و تعداد حروف صدادار (a, e, i, o, u) را برگرداند.
# ورودی: "hello world"
# خروجی: 3
# راه حل:
def count_vowels(text):
vowels = "aeiouAEIOU"
count = 0
for char in text:
if char in vowels:
count += 1
return count
result = count_vowels("hello world")
print(result)
سوال 9: تابع بررسی عدد اول
تابعی بنویسید که عددی دریافت کند و True برگرداند اگر عدد اول باشد.
# ورودی: 7
# خروجی: True
# راه حل:
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
print(is_prime(7)) # True
print(is_prime(10)) # False
سوال 10: تابع فاکتوریل
تابعی بنویسید که فاکتوریل یک عدد را محاسبه کند.
# ورودی: 5
# خروجی: 120
# راه حل:
def factorial(n):
result = 1
for i in range(1, n + 1):
result *= i
return result
print(factorial(5))
سوال 11: تابع فاکتوریل بازگشتی
تابع فاکتوریل را با استفاده از Recursion بنویسید.
# ورودی: 5
# خروجی: 120
# راه حل:
def factorial(n):
if n == 0 or n == 1:
return 1
else:
return n * factorial(n - 1)
print(factorial(5))
سوال 12: تابع فیبوناچی بازگشتی
تابعی بنویسید که n امین عدد فیبوناچی را با Recursion محاسبه کند.
# ورودی: 6
# خروجی: 8 (دنباله: 0, 1, 1, 2, 3, 5, 8)
# راه حل:
def fibonacci(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(6))
سوال 13: تابع جمع لیست
تابعی بنویسید که لیستی از اعداد دریافت کند و مجموع آنها را برگرداند.
# ورودی: [1, 2, 3, 4, 5]
# خروجی: 15
# راه حل:
def sum_list(numbers):
total = 0
for num in numbers:
total += num
return total
result = sum_list([1, 2, 3, 4, 5])
print(result)
سوال 14: تابع معکوس رشته
تابعی بنویسید که رشتهای دریافت کند و آن را معکوس برگرداند.
# ورودی: "hello"
# خروجی: "olleh"
# راه حل:
def reverse_string(text):
return text[::-1]
result = reverse_string("hello")
print(result)
سوال 15: تابع پالیندروم
تابعی بنویسید که بررسی کند آیا رشته پالیندروم است یا خیر.
# ورودی: "radar"
# خروجی: True
# راه حل:
def is_palindrome(text):
return text == text[::-1]
print(is_palindrome("radar")) # True
print(is_palindrome("hello")) # False
سوال 16: تابع با چند مقدار برگشتی
تابعی بنویسید که لیستی از اعداد دریافت کند و کوچکترین و بزرگترین عدد را برگرداند.
# ورودی: [3, 7, 2, 9, 1]
# خروجی: (1, 9)
# راه حل:
def min_max(numbers):
return min(numbers), max(numbers)
minimum, maximum = min_max([3, 7, 2, 9, 1])
print(f"Min: {minimum}, Max: {maximum}")
سوال 17: تابع با Keyword Arguments
تابعی بنویسید که اطلاعات یک کاربر (نام، سن، شهر) را دریافت کند و چاپ کند.
# فراخوانی: user_info(name="Ali", age=25, city="Tehran")
# خروجی: Name: Ali, Age: 25, City: Tehran
# راه حل:
def user_info(name, age, city):
print(f"Name: {name}, Age: {age}, City: {city}")
user_info(name="Ali", age=25, city="Tehran")
user_info(city="Tehran", name="Ali", age=25) # ترتیب مهم نیست
سوال 18: تابع محاسبه توان بازگشتی
تابعی بنویسید که به صورت بازگشتی توان یک عدد را محاسبه کند.
# ورودی: base=2, exp=3
# خروجی: 8
# راه حل:
def power(base, exp):
if exp == 0:
return 1
else:
return base * power(base, exp - 1)
print(power(2, 3))
سوال 19: تابع جمع ارقام بازگشتی
تابعی بنویسید که به صورت بازگشتی مجموع ارقام یک عدد را محاسبه کند.
# ورودی: 123
# خروجی: 6
# راه حل:
def sum_digits(n):
if n == 0:
return 0
else:
return n % 10 + sum_digits(n // 10)
print(sum_digits(123))
سوال 20: تابع فیلتر اعداد زوج
تابعی بنویسید که لیستی از اعداد دریافت کند و لیست جدیدی از اعداد زوج برگرداند.
# ورودی: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# خروجی: [2, 4, 6, 8, 10]
# راه حل:
def filter_even(numbers):
even_numbers = []
for num in numbers:
if num % 2 == 0:
even_numbers.append(num)
return even_numbers
result = filter_even([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(result)
دیدگاهتان را بنویسید