30-Days-Of-Python/Persain/11_functions.md

22 KiB
Raw Permalink Blame History

۳۰ روز پایتون: روز ۱۱ - توابع

Twitter Follow

نویسنده: Asabeneh Yetayeh
ویرایش دوم: ژوئیه، ۲۰۲۱

<< روز ۱۰ | روز ۱۲ >>

30DaysOfPython

📘 روز ۱۱

توابع

تاکنون بسیاری از توابع داخلی پایتون را دیده‌ایم. در این بخش، بر روی توابع سفارشی تمرکز خواهیم کرد. تابع چیست؟ قبل از اینکه شروع به ساخت توابع کنیم، بیایید یاد بگیریم که تابع چیست و چرا به آنها نیاز داریم؟

تعریف یک تابع

تابع یک بلوک کد قابل استفاده مجدد یا دستورات برنامه‌نویسی است که برای انجام یک وظیفه خاص طراحی شده است. برای تعریف یا اعلام یک تابع، پایتون کلمه کلیدی def را فراهم می‌کند. در ادامه نحو تعریف یک تابع آمده است. بلوک کد تابع تنها زمانی اجرا می‌شود که تابع فراخوانی یا احضار شود.

اعلام و فراخوانی یک تابع

وقتی یک تابع می‌سازیم، به آن اعلام تابع می‌گوییم. وقتی شروع به استفاده از آن می‌کنیم، به آن فراخوانی یا احضار تابع می‌گوییم. تابع می‌تواند با یا بدون پارامتر اعلام شود.

# نحو
# اعلام یک تابع
def function_name():
    کدها
    کدها
# فراخوانی یک تابع
function_name()

تابع بدون پارامتر

تابع می‌تواند بدون پارامتر اعلام شود.

مثال:

def generate_full_name ():
    first_name = 'Asabeneh'
    last_name = 'Yetayeh'
    space = ' '
    full_name = first_name + space + last_name
    print(full_name)
generate_full_name () # فراخوانی یک تابع

def add_two_numbers ():
    num_one = 2
    num_two = 3
    total = num_one + num_two
    print(total)
add_two_numbers()

تابع بازگشت‌دهنده مقدار - بخش ۱

توابع با استفاده از دستور return مقادیر را برمی‌گردانند. اگر تابعی دستور return نداشته باشد، مقدار None را برمی‌گرداند. بیایید توابع بالا را با استفاده از return بازنویسی کنیم. از این به بعد، هنگام فراخوانی یک تابع، مقداری از آن دریافت می‌کنیم و آن را چاپ می‌کنیم.

def generate_full_name ():
    first_name = 'Asabeneh'
    last_name = 'Yetayeh'
    space = ' '
    full_name = first_name + space + last_name
    return full_name
print(generate_full_name())

def add_two_numbers ():
    num_one = 2
    num_two = 3
    total = num_one + num_two
    return total
print(add_two_numbers())

تابع با پارامترها

در یک تابع می‌توانیم انواع داده‌های مختلف (عدد، رشته، بولی، لیست، تاپل، دیکشنری یا مجموعه) را به عنوان پارامتر بگذرانیم.

  • پارامتر تکی: اگر تابع ما پارامتری بگیرد، باید تابع را با یک آرگومان فراخوانی کنیم.
  # نحو
  # اعلام یک تابع
  def function_name(parameter):
    کدها
    کدها
  # فراخوانی تابع
  print(function_name(argument))

مثال:

def greetings (name):
    message = name + ', welcome to Python for Everyone!'
    return message

print(greetings('Asabeneh'))

def add_ten(num):
    ten = 10
    return num + ten
print(add_ten(90))

def square_number(x):
    return x * x
print(square_number(2))

def area_of_circle (r):
    PI = 3.14
    area = PI * r ** 2
    return area
print(area_of_circle(10))

def sum_of_numbers(n):
    total = 0
    for i in range(n+1):
        total+=i
    return total
print(sum_of_numbers(10)) # 55
print(sum_of_numbers(100)) # 5050
  • دو پارامتر: یک تابع ممکن است پارامتر یا پارامترهایی داشته باشد یا نداشته باشد. یک تابع همچنین ممکن است دو یا چند پارامتر داشته باشد. اگر تابع ما پارامترهایی بگیرد، باید آن را با آرگومان‌ها فراخوانی کنیم. بیایید یک تابع با دو پارامتر بررسی کنیم:
  # نحو
  # اعلام یک تابع
  def function_name(para1, para2):
    کدها
    کدها
  # فراخوانی تابع
  print(function_name(arg1, arg2))

مثال:

def generate_full_name (first_name, last_name):
    space = ' '
    full_name = first_name + space + last_name
    return full_name
print('Full Name: ', generate_full_name('Asabeneh','Yetayeh'))

def sum_two_numbers (num_one, num_two):
    sum = num_one + num_two
    return sum
print('Sum of two numbers: ', sum_two_numbers(1, 9))

def calculate_age (current_year, birth_year):
    age = current_year - birth_year
    return age

print('Age: ', calculate_age(2021, 1819))

def weight_of_object (mass, gravity):
    weight = str(mass * gravity)+ ' N' # مقدار باید ابتدا به رشته تبدیل شود
    return weight
print('Weight of an object in Newtons: ', weight_of_object(100, 9.81))

گذراندن آرگومان‌ها با کلید و مقدار

اگر آرگومان‌ها را با کلید و مقدار بگذرانیم، ترتیب آرگومان‌ها اهمیتی ندارد.

# نحو
# اعلام یک تابع
def function_name(para1, para2):
    کدها
    کدها
# فراخوانی تابع
print(function_name(para1 = 'John', para2 = 'Doe')) # ترتیب آرگومان‌ها اینجا اهمیتی ندارد

مثال:

def print_fullname(firstname, lastname):
    space = ' '
    full_name = firstname  + space + lastname
    print(full_name)
print_fullname(firstname = 'Asabeneh', lastname = 'Yetayeh')

def add_two_numbers (num1, num2):
    total = num1 + num2
    return total
print(add_two_numbers(num2 = 3, num1 = 2)) # ترتیب اهمیتی ندارد

تابع بازگشت‌دهنده مقدار - بخش ۲

اگر با یک تابع مقداری برنگردانیم، تابع ما به طور پیش‌فرض None را برمی‌گرداند. برای بازگرداندن مقداری با یک تابع، از کلمه کلیدی return به دنبال متغیری که برمی‌گردانیم استفاده می‌کنیم. می‌توانیم هر نوع داده‌ای را از یک تابع برگردانیم.

  • بازگشت یک رشته: مثال:
def print_name(firstname):
    return firstname
print_name('Asabeneh') # Asabeneh

def print_full_name(firstname, lastname):
    space = ' '
    full_name = firstname  + space + lastname
    return full_name
print_full_name(firstname='Asabeneh', lastname='Yetayeh')
  • بازگشت یک عدد:

مثال:

def add_two_numbers (num1, num2):
    total = num1 + num2
    return total
print(add_two_numbers(2, 3))

def calculate_age (current_year, birth_year):
    age = current_year - birth_year
    return age
print('Age: ', calculate_age(2019, 1819))
  • بازگشت یک بولی: مثال:
def is_even (n):
    if n % 2 == 0:
        print('even')
        return True    # return اجرای بیشتر تابع را متوقف می‌کند، مشابه break 
    return False
print(is_even(10)) # True
print(is_even(7)) # False
  • بازگشت یک لیست: مثال:
def find_even_numbers(n):
    evens = []
    for i in range(n + 1):
        if i % 2 == 0:
            evens.append(i)
    return evens
print(find_even_numbers(10))

تابع با پارامترهای پیش‌فرض

گاهی اوقات مقادیر پیش‌فرض را به پارامترها می‌گذرانیم، وقتی تابع را احضار می‌کنیم. اگر آرگومان‌هایی را هنگام فراخوانی تابع نگذرانیم، مقادیر پیش‌فرض آنها استفاده خواهد شد.

# نحو
# اعلام یک تابع
def function_name(param = value):
    کدها
    کدها
# فراخوانی تابع
function_name()
function_name(arg)

مثال:

def greetings (name = 'Peter'):
    message = name + ', welcome to Python for Everyone!'
    return message
print(greetings())
print(greetings('Asabeneh'))

def generate_full_name (first_name = 'Asabeneh', last_name = 'Yetayeh'):
    space = ' '
    full_name = first_name + space + last_name
    return full_name

print(generate_full_name())
print(generate_full_name('David','Smith'))

def calculate_age (birth_year,current_year = 2021):
    age = current_year - birth_year
    return age;
print('Age: ', calculate_age(1821))

def weight_of_object (mass, gravity = 9.81):
    weight = str(mass * gravity)+ ' N' # مقدار باید ابتدا به رشته تبدیل شود
    return weight
print('Weight of an object in Newtons: ', weight_of_object(100)) # 9.81 - میانگین گرانش روی سطح زمین
print('Weight of an object in Newtons: ', weight_of_object(100, 1.62)) # گرانش روی سطح ماه

تعداد دلخواه آرگومان‌ها

اگر تعداد آرگومان‌هایی که به تابع خود می‌گذرانیم را ندانیم، می‌توانیم تابعی ایجاد کنیم که تعداد دلخواهی آرگومان را بگیرد با اضافه کردن * قبل از نام پارامتر.

# نحو
# اعلام یک تابع
def function_name(*args):
    کدها
    کدها
# فراخوانی تابع
function_name(param1, param2, param3,..)

مثال:

def sum_all_nums(*nums):
    total = 0
    for num in nums:
        total += num     # همان total = total + num 
    return total
print(sum_all_nums(2, 3, 5)) # 10

پارامترهای پیش‌فرض و تعداد دلخواه در توابع

def generate_groups (team,*args):
    print(team)
    for i in args:
        print(i)
generate_groups('Team-1','Asabeneh','Brook','David','Eyob')

بازکردن دیکشنری (Dictionary unpacking)

می‌توانید تابعی که آرگومان‌های نام‌دار می‌گیرد را با یک دیکشنری که کلیدهایش با نام پارامترها یکی‌ست، صدا بزنید. برای این کار از ** استفاده می‌کنیم.

# تعریف تابعی که دو آرگومان می‌گیرد: 'name' و 'location'
def greet(name, location):
    # پیام خوش‌آمدگویی با استفاده از آرگومان‌های ورودی چاپ می‌کند
    print("Hi there", name, "how is the weather in", location)

# فراخوانی تابع با استفاده از آرگومان‌های کلیدی (keyword)
greet(name="Alice", location="New York")  
# خروجی: Hi there Alice how is the weather in New York

# ساخت یک دیکشنری با کلیدهای برابر با نام پارامترها
my_dict = {"name": "Alice", "location": "New York"}

# فراخوانی تابع با بازکردن دیکشنری (Dictionary unpacking)
greet(**my_dict)  
# عملگر ** دیکشنری را باز می‌کند و جفت کلید-مقدارها را به صورت آرگومان نام‌دار ارسال می‌کند
# خروجی: Hi there Alice how is the weather in New York

تعداد دلخواه آرگومان‌های نام‌دار

می‌توانید تابعی تعریف کنید که تعداد دلخواهی آرگومان نام‌دار بگیرد.

def arbitrary_named_args(**args):
    print("تعدادی آرگومان نام‌دار به صورت دلخواه گرفتم، مجموعاً", len(args))
    print("آرگومان‌ها به صورت دیکشنری به تابع داده شده‌اند:", type(args))
    print("بیایید آنها را چاپ کنیم:")
    for k, v in args.items():
        print(" * کلید:", k, "مقدار:", v)

در کل، مگر در مواقع ضروری، از این روش استفاده نکنید چون فهمیدن اینکه تابع چه آرگومان‌هایی می‌گیرد و چه کاری انجام می‌دهد را سخت می‌کند.

تابع به عنوان پارامتر تابع دیگر

# می‌توانید توابع را به عنوان پارامتر بگذرانید
def square_number (n):
    return n ** n
def do_something(f, x):
    return f(x)
print(do_something(square_number, 3)) # 27

🌕 شما تا اینجا دستاوردهای زیادی داشته‌اید. ادامه دهید! شما چالش‌های روز ۱۱ را به پایان رساندید و ۱۱ گام جلوتر در مسیر بزرگی هستید. حالا چند تمرین برای مغز و عضلاتتان انجام دهید.

اظهارات

حالا زمان آن است که افکار خود را در مورد نویسنده و ۳۰روزپایتون بیان کنید. می‌توانید اظهارات خود را در این لینک بگذارید.

💻 تمرین‌ها: روز ۱۱

تمرین‌ها: سطح ۱

۱. تابعی به نام add_two_numbers اعلام کنید. دو پارامتر می‌گیرد و مجموع را برمی‌گرداند. ۲. مساحت دایره به صورت زیر محاسبه می‌شود: area = π x r x r. تابعی بنویسید که area_of_circle را محاسبه کند. ۳. تابعی به نام add_all_nums بنویسید که تعداد دلخواهی آرگومان می‌گیرد و همه آرگومان‌ها را جمع می‌کند. بررسی کنید که آیا همه آیتم‌های لیست از نوع عدد هستند. اگر نه، بازخورد مناسبی بدهید. ۴. دما در °C می‌تواند با استفاده از این فرمول به °F تبدیل شود: °F = (°C x 9/5) + 32. تابعی بنویسید که °C را به °F تبدیل کند، convert_celsius_to-fahrenheit. ۵. تابعی به نام check-season بنویسید، که یک پارامتر ماه می‌گیرد و فصل را برمی‌گرداند: پاییز، زمستان، بهار یا تابستان. ۶. تابعی به نام calculate_slope بنویسید که شیب یک معادله خطی را برمی‌گرداند. ۷. معادله درجه دوم به صورت زیر محاسبه می‌شود: ax² + bx + c = ۰. تابعی بنویسید که مجموعه راه‌حل یک معادله درجه دوم را محاسبه کند، solve_quadratic_eqn. ۸. تابعی به نام print_list اعلام کنید. یک لیست را به عنوان پارامتر می‌گیرد و هر عنصر لیست را چاپ می‌کند. ۹. تابعی به نام reverse_list اعلام کنید. یک آرایه را به عنوان پارامتر می‌گیرد و معکوس آرایه را برمی‌گرداند (از حلقه‌ها استفاده کنید).

print(reverse_list([1, 2, 3, 4, 5]))
# [5, 4, 3, 2, 1]
print(reverse_list(["A", "B", "C"]))
# ["C", "B", "A"]

۱۰. تابعی به نام capitalize_list_items اعلام کنید. یک لیست را به عنوان پارامتر می‌گیرد و لیستی از آیتم‌های بزرگ‌نوشته‌شده را برمی‌گرداند. ۱۱. تابعی به نام add_item اعلام کنید. یک لیست و یک پارامتر آیتم می‌گیرد. لیستی با آیتم اضافه‌شده در انتها برمی‌گرداند.

food_stuff = ['Potato', 'Tomato', 'Mango', 'Milk']
print(add_item(food_stuff, 'Meat'))     # ['Potato', 'Tomato', 'Mango', 'Milk','Meat']
numbers = [2, 3, 7, 9]
print(add_item(numbers, 5))    #  [2, 3, 7, 9, 5]

۱۲. تابعی به نام remove_item اعلام کنید. یک لیست و یک پارامتر آیتم می‌گیرد. لیستی با آیتم حذف‌شده از آن برمی‌گرداند.

food_stuff = ['Potato', 'Tomato', 'Mango', 'Milk']
print(remove_item(food_stuff, 'Mango'))  # ['Potato', 'Tomato', 'Milk'];
numbers = [2, 3, 7, 9]
print(remove_item(numbers, 3))  # [2, 7, 9]

۱۳. تابعی به نام sum_of_numbers اعلام کنید. یک پارامتر عدد می‌گیرد و همه اعداد در آن محدوده را جمع می‌کند.

print(sum_of_numbers(5))  # 15
print(sum_of_numbers(10)) # 55
print(sum_of_numbers(100)) # 5050

۱۴. تابعی به نام sum_of_odds اعلام کنید. یک پارامتر عدد می‌گیرد و همه اعداد فرد در آن محدوده را جمع می‌کند. ۱۵. تابعی به نام sum_of_even اعلام کنید. یک پارامتر عدد می‌گیرد و همه اعداد زوج در آن محدوده را جمع می‌کند.

تمرین‌ها: سطح ۲

۱. تابعی به نام evens_and_odds اعلام کنید. یک عدد صحیح مثبت را به عنوان پارامتر می‌گیرد و تعداد زوج‌ها و فردها در عدد را شمارش می‌کند.

    print(evens_and_odds(100))
    # تعداد فردها ۵۰ است.
    # تعداد زوج‌ها ۵۱ است.

۲. تابع خود را به نام factorial صدا بزنید، یک عدد صحیح را به عنوان پارامتر می‌گیرد و فاکتوریل عدد را برمی‌گرداند. ۳. تابع خود را با نام is_empty صدا بزنید، یک پارامتر می‌گیرد و بررسی می‌کند آیا تهی است یا نه. ۴. توابع مختلفی بنویسید که برای لیست‌ها به کار می‌روند. باید توابعی مانند calculate_mean، calculate_median، calculate_mode، calculate_range، calculate_variance و calculate_std (انحراف معیار) را بسازید. ۵. تابعی به نام greet بنویسید که یک آرگومان پیش‌فرض به نام name می‌گیرد. اگر هیچ آرگومانی ارسال نشود، باید "Hello, Guest!" را چاپ کند، در غیر این صورت باید شخص را با نام مورد نظر خوشامد بگوید.

    greet()
    # "سلام، مهمان!"
    greet("Alice")
    # "سلام، Alice!"

۶. تابعی به نام show_args بسازید که تعداد دلخواهی از آرگومان‌های نام‌دار را می‌گیرد و نام و مقدارشان را چاپ می‌کند.

show_args(name="Alice", age=30, city="New York")
# خروجی: نام: Alice، سن: 30، شهر: New York
show_args(name="Bob", pet="Fluffy, the bunny")
# خروجی: نام: Bob، حیوان خانگی: Fluffy, the bunny

تمرین‌ها: سطح ۳

۱. تابعی به نام is_prime بنویسید، که بررسی می‌کند آیا یک عدد اول است. ۲. تابعی بنویسید که بررسی می‌کند آیا همه آیتم‌ها در لیست منحصر به فرد هستند. ۳. تابعی بنویسید که بررسی می‌کند آیا همه آیتم‌های لیست از یک نوع داده هستند. ۴. تابعی بنویسید که بررسی می‌کند آیا متغیر ارائه‌شده یک متغیر معتبر پایتون است. ۵. به پوشه data بروید و به فایل countries-data.py دسترسی پیدا کنید.

  • تابعی به نام most_spoken_languages در جهان ایجاد کنید. باید ۱۰ یا ۲۰ زبان پرگویش جهان را به ترتیب نزولی برگرداند.
  • تابعی به نام most_populated_countries ایجاد کنید. باید ۱۰ یا ۲۰ کشور پرجمعیت را به ترتیب نزولی برگرداند.

🎉 تبریک ! 🎉

<< روز ۱۰ | روز ۱۲ >>