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

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

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

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

برای نوشتن تابع باید با کلمه def شروع کنیم و بعد از آن یک نام برای تابع انتخاب کنیم، بعد از آن پرانتز باز و بسته میشود که میتوانیم مقادیر ورودی و خروجی تابع را در آن مشخص کنیم. بعد از گذاشتن یک دو نقطه ( : ) به سراغ بدنه تابع میرویم.

قصد داریم تابعی بنویسیم به نام zarb که هربار آن را صدا کردیم یک عدد بعنوان ورودی از کاربر گرفته و آن را ضرب در ۷ کند و در آخر چاپ کند:

def zarb ():
    n = int(input())
    print(n*7)

اگر برنامه را اجرا کنیم هیچ اتفاقی نمی افتد زیرا توابع تا صدا زده نشوند اجرا نمیشوند. با نوشتن اسم تابع و باز و بسته کردن پرانتز در واقع یک تابع را صدا زده ایم:

def zarb ():
    n = int(input())
    print(n*7)

zarb()
zarb()
# ۵
  ۳۵
  ۸
  ۵۶

ورودی و خروجی توابع

در این بخش میخواهیم درمورد ورودی ها و خروجی های تابع صحبت کنیم. گفتیم که در پرانتزی که در تعریف تابع می آید میتوانیم ورودی های یک تابع را مشخص کنیم. میخواهیم تابع ضربی را که در بخش قبل دادیم به شکلی تغییر دهیم که بتوانیم یک عدد را به آن پاس بدهیم، آن را ضرب در ۷ کنیم و نتیجه را چاپ کنیم:

def zarb (n):
    print(n*7)

zarb(3)
# ۲۱

در پرانتز یک متغیر با نام دلخواه تعریف کرده ایم که این متغیر فقط در بدنه همین تابع شناخته میشود. وقتی در ادامه برنامه عدد ۳ را به تابع پاس داده ایم، این عدد جای n نشسته و در ۷ ضرب میشود.

من میتوانم بیشتر از یک ورودی از کاربر بگیرم، کلفیست در پرانتز نام چند متغیر را بیاورم و آن ها را با کاما از هم جدا کنم. برنامه را طوری تغییر میدهیم که از کاربر دو ورودی گرفته و آن ها را ضرب در هم کند و نتیجه را چاپ کند.

def zarb (x, y):
    print(x * y)

zarb(3, 4)
# ۱۲
zarb(5, 3)
# ۱۵
zarb(6, 4)
# ۲۴

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

def zarb (x, y):
    return x * y

print(zarb(3, 4))
# ۱۲

همچنین میتوانیم تابع را صدا بزنیم و نتیجه را در یک متغیر بریزیم:

def zarb (x, y):
    return x * y

res = zarb(3, 4)

در تابع میتوانیم بیش از یک مقدار را به صورت تاپل برگردانیم و همچنین میتوانیم چند مقدار را در یک خط درون چند متغیر مختلف بریزیم:

def zarb (x, y):
    return (x*y, x+y, x)

zarb, jam, x = zarb(3, 4)

میبینید که در خط آخر چگونه این کار را انجام داده ایم.

ورودی های اجباری و اختیاری

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

def function (x, y=7):
    print(x,y)

function(2)
# ۲ ۷

زمانی که تابع function را تعریف کردیم، در قسمت ورودی ها به متغیر y مقدار پیشفرض ۷ را داده ایم. هنگامی که میخواهیم این تابع را فراخوانی کنیم اگر به y مقداری نسبت ندهیم، متغیر y به صورت پیشفرض عدد ۷ میباشد.

در بسیاری از مواقع لازم است تعداد زیادی از داده را به یه تابع پاس بدهیم ولی نمیدانیم که دقیقا چند تا! در این مواقع از تاپل کمک میگیریم. به این صورت که در هنگام تعریف یک تابع، قبل از نوشتن نام آخرین متغیر ورودی، یک ستاره میگذاریم. این کار باعث میشود که آن متغیر از نوع تاپل بوده و تعداد بی شماری از تابع را در خود ذخیره کند. به مثال زیر توجه کنید:

def function (a, *tpl):
    print(a)
    for i in tpl:
        print(i)

حالا میتوانیم هر چند تا ورودی که میخواهیم به تابع function پاس بدهیم. پس به صورت زیر عمل میکند:

function(3,"hi",2.12,True,6,7,8,9,0)
# ۳
# hi
# ۲٫۱۲
# True
# ۶
# ۷
# ۸
# ۹
# ۰

در جلسه بعد درمورد تابع lambda و map صحبت خواهیم کرد.

ارسال دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *