۷

توابع در پایتون 📞

یاد می‌گیریم چطور کدهامون رو modular کنیم!

تعریف و فراخوانی توابع

توابع بلوک‌های کدی هستند که می‌تونیم چندین بار ازشون استفاده کنیم:

تعریف تابع ساده
# تعریف تابع
def greet():
    print("سلام!")
    print("خوش آمدید به دنیای پایتون")

# فراخوانی تابع
greet()
greet()

# تابع با پارامتر
def greet_name(name):
    print(f"سلام {name}!")
    print("خوش آمدید!")

greet_name("علی")
greet_name("سارا")

# تابع با چند پارامتر
def introduce(name, age):
    print(f"من {name} هستم و {age} سال دارم")

introduce("رضا", 25)

مقدار بازگشتی (return)

توابع می‌تونن مقادیری رو برگردونن که در محاسبات بعدی استفاده بشن:

توابع با مقدار بازگشتی
# تابع با return
def add(a, b):
    result = a + b
    return result

sum_result = add(5, 3)
print(sum_result)  # 8

# می‌توان مستقیم return کرد
def multiply(a, b):
    return a * b

product = multiply(4, 5)
print(product)  # 20

# توابع می‌توانند چندین مقدار برگردانند
def calculate(a, b):
    sum = a + b
    difference = a - b
    product = a * b
    return sum, difference, product

results = calculate(10, 5)
print(results)  # (15, 5, 50)

# unpacking نتیجه
s, d, p = calculate(10, 5)
print(f"جمع: {s}, تفاضل: {d}, ضرب: {p}")

پارامترهای پیش‌فرض و keyword

پایتون قابلیت‌های پیشرفته‌ای برای پارامترها داره:

پارامترهای پیشرفته
# پارامترهای پیش‌فرض
def greet(name, message="سلام"):
    print(f"{message} {name}!")

greet("علی")  # سلام علی!
greet("سارا", "درود")  # درود سارا!

# پارامترهای keyword
def create_person(name, age, city):
    print(f"نام: {name}, سن: {age}, شهر: {city}")

create_person(age=25, city="تهران", name="رضا")

# پارامترهای arbitrary (تعداد متغیر)
def sum_numbers(*args):
    total = 0
    for num in args:
        total += num
    return total

print(sum_numbers(1, 2, 3))  # 6
print(sum_numbers(1, 2, 3, 4, 5))  # 15

# پارامترهای keyword arbitrary
def print_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_info(name="سارا", age=22, city="مشهد")

Scope (حوزه دید) متغیرها

متغیرها بسته به جایی که تعریف می‌شن، scope مختلفی دارن:

انواع scope
# Global scope
x = 10

def test_scope():
    # Local scope
    y = 20
    print("Inside function:", x, y)  # می‌تواند به global دسترسی داشته باشد
    
    # تغییر global با استفاده از global
    global z
    z = 30

test_scope()
print("Outside function:", x, z)  # 10, 30
# print(y)  # Error! y فقط در تابع وجود دارد

# nonlocal برای nested functions
def outer():
    count = 0
    
    def inner():
        nonlocal count  # به متغیر outer function دسترسی دارد
        count += 1
        return count
    
    return inner

counter = outer()
print(counter())  # 1
print(counter())  # 2

تمرین! 🧠

تابعی بنویسید که یک عدد بگیرد و بررسی کند که آیا عدد اول است یا نه. سپس از این تابع استفاده کنید و تمام اعداد اول بین 1 تا 100 را پیدا کنید.

جواب تمرین

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

# پیدا کردن اعداد اول بین 1 تا 100
prime_numbers = []
for num in range(1, 101):
    if is_prime(num):
        prime_numbers.append(num)

print("اعداد اول بین 1 تا 100:")
print(prime_numbers)