Python Functions

ساختن یک تابع

در پایتون برای تعریف تابع از کلیدواژه def استفاده می‌کنیم.

def my_function():
    print("Hello from a function")

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

جهت فراخواندن یک تابع، از اسم تابع همراه با پرانتز استفاده می‌کنیم.


def my_function():
  print("Hello from a function")

my_function()

خروجی:

آرگومان‌ها

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

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

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


def my_function(fname):
  print(fname + "Smith")

my_function("Emil")
my_function("Tobias")
my_function("Linus")

خروجی:

معمولاً در راهنماهای پایتون آرگومان‌ها (Arguments) را به صورت خلاصه args می‌نویسند.

پارامتر یا آرگومان؟

دو واژه آرگومان و پارامتر را می‌توان برای یک چیز به کار برد: اطلاعاتی که به تابع داده می‌شود.

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

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

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

در کد زیر تابع انتظار دو آرگومان را دارد.


def my_function(fname, lname):
  print(fname + " " + lname)

my_function("Emil", "Refsnes")

خروجی:

اگر بخواهید که تابع فوق رابا یک یا 3 آرگومان فرا بخوانید با خطا مواجه خواهید شد.


def my_function(fname, lname):
  print(fname + " " + lname)

my_function("Emil")

خروجی:

آرگومان‌های دلبخواهی args*

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

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


def my_function(*kids):
  print("The youngest child is " + kids[2])

my_function("Emil", "Tobias", "Linus")

خروجی:

آرگومان‌های دلبخواهی معمولاً در متن‌های راهنمای پایتون به صورت args* نمایش داده می‌شوند.

آرگومان‌ها به صورت کلیدواژه

می‌توان آرگومان‌ها را به صورت نوشتار key = value هم فرستاد.

در این حالت ترتیب آرگومان‌ها مهم نیست.


def my_function(child3, child2, child1):
  print("The youngest child is " + child3)

my_function(child1 = "Emil", child2 = "Tobias", child3 = "Linus")

خروجی:

معمولاً در متن@های راهنمای پایتون آرگومان‌های به صورت کلیدواژه را به شکل kwargs خلاصه نویسی می‌کنند.

آرگومان‌های کلیدواژه دلبخواهی kwargs**

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

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


def my_function(**kid):
  print("His last name is " + kid["lname"])

my_function(fname = "Tobias", lname = "Refsnes")

خروجی:

آرگومان‌های کلیدواژه دلبخواهی معمولاً در متن‌های راهنمای پایتون به صورت kwargs** خلاصه نویسی می‌شوند.

پارامتر با مقدار پیش‌فرض

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

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


def my_function(country = "Norway"):
  print("I am from " + country)

my_function("Sweden")
my_function("India")
my_function()
my_function("Brazil")

خروجی:

دادن یک لیست به تابع به عنوان آرگومان

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

به عنوان مثال اگر یک لیست از آرگومان‌ها را به تابع بدهید، در هنگام رسیدن به تابع همچنان یک لیست خواهد بود.


def my_function(food):
  for x in food:
    print(x)

fruits = ["apple", "banana", "cherry"]

my_function(fruits)

خروجی:

دستور return

برای اینکه یک تابع بتواند مقداری را برگرداند، از دستور return استفاده می‌کنیم.


def my_function(x):
  return 5 * x

print(my_function(3))
print(my_function(5))
print(my_function(9))

خروجی:

دستور pass

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

def myfunction():
    pass

توابع بازگشتی

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

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

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

در مثال زیر، تابع tri_recursion() را طوری تعریف کرده‌ایم که خود را فرا بخواند. از متغیر k به عنوان داده استفاده کرده‌ایم که در هر مرحله یک واحد از آن کم می‌شود. بازگشت زمانی پایان می‌یابد که k بزرگتر از صفر نباشد (به این معنی که صفر باشد).

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


def tri_recursion(k):
  if(k > 0):
    result = k + tri_recursion(k - 1)
    print(result)
  else:
    result = 0
  return result

print("\n\nRecursion Example Results")
tri_recursion(6)

خروجی: