در این آموزش به کاملترین شکل ممکن نحوه تعریف تابع در پایتون (python) رو آموزش میدیم! تابع رو باید با def به معنی define تعریف کنیم! که در این مطلب به طور کامل در موردش توضیح میدیم!
خیلی از وقتها نیازه تا یکسری کُد رو در قالب یک تابع بنویسیم و در انواع و اقسام جاهای مختلف کُد خودمون استفاده کنیم!
فرض کنید میخوایم یک تابع تعریف کنم، که بیاد اسم و فامیل من و وبسایت کولاک رو پرینت کنه! [میدونم تابع جالبی نیست، و با کارایی واقعی تایعی که شما توووی ذهنتون فاصله داره، ولی لحاظ کنید که مثال 1 است! قطعاً جلوتر بهتر میشه!]
قطعه کد زیر رو در نظر بگیرید!:
def copyright(): print(""" By: Sajjad Rahmani Website: www.Koolac.Org My E-Mail: Sajjad.Rahmani.Private@Gmail.Com """)
خط 1: اولاً def مخفف define (به معنی تعریف کردن) است! که برای تعریف تابع بکار میره! اسم تابع رو دوست داشتم بذارم copyright! شما میتونید اسم تابع رو بذارید Hasan یا هر اسم دیگه!
توجه: تمام خطوط بعدی باید اون فاصله اولیه یا تووو رفتگی رو داشته باشن، تا پایتون (Python) بنده خدا بفهمه منظور ما اینه که خطوط بعدی زیر مجوعه دستور def است! وگرنه بندهخدا از کجا میتونه بفهمه؟! خب درکش کنید دیگه!
خط 2: اومدیم یه تابع پرینت استفاده کردیم! برای اینکه چند خطی پرینت کنیم از triple quotation استفاده کردیم!
(هموون “””یهچیزی””” منظورم است!)
بعدش وسطش دوتا “””نوشتم: اسمم چیه، آدرس کولاک چیست و آدرس ایمیلم رو وارد کردم! همین!
الان ما یه دستور ساده print رو اومدیم توی سه خط نوشتیم؟! اینو پایتون (python) ایراد نمیگیره؟! [خیر! شما 10 خط هم که بزنین، باز چیزی نمیگه! پایتون به هر فاصلهای حساس نیست! البته به بعضی فاصلهها مثل هموون تووورفتگی که بالاتر گفتم، خیلی حساسه!]
مثال از نحوه فراخوانی تابع مثال 1
copyright()
که این میاد، همون چیز میزای بالا رو مینویسه! بذارید به این موضوع تاکید کنم که خیلی واضحه که وقتی دارید تابع copyright رو فراخوانی میکنید! اصلاً تابعی به اسم copyright تعریف کرده باشید! (مثل اووونبندهخدای معروف نشه، که حساب بانکی نداشت، بعد دعا میکرد خدایا توووی قرعهکشی برنده شم!)
یعنی در اصل کل فضای کد به صورت زیر بوده:
def copyright(): print(""" By: Sajjad Rahmani Website: www.Koolac.Org My E-Mail: Sajjad.Rahmani.Private@Gmail.Com """) copyright()
که خب ما به دلیل محدودیت فضا، و طولانی نشدن متن، فقط همون آخری رو نوشتیم! (چون بقیش رو قبلاً یه بار آوردیم دیگه!)
به عنوان مثال، میخوایم یه تابعی بنویسیم که هر عددی که بهش میدیم رو به توان سه برسووونه!
در این صورت کد زیر رو مینویسم! [کُد رو نگاه کنید، توضیح میدم در ادامه!]
def Sajjad(x): print(x**3)
یه تابع تعریف کردیم به اسم Sajjad! که یه دونه ورودی میگیره! (هر چیزی که توی پرانتز جلوی اسمش میذاریم، بیانگر ورودی است! چون یه دونه چیز گذاشتیم، یعنی یه دونه ورودی میگیره! اگر 500 تا چیز توی پرانتز میذاشتیم! یعنی تابع ما 500 تا ورودی میگیره!)
بعد یه چیز دیگه!: اون x همینجوری گذاشتیم x! (میتونست هر چیز دیگه هم باشه! منظور کلّیمووون اینه که یه ورودی میگیره! مثلاً به اسم x! حالا نمیتونه اون یه دونه ورودی اسمش a باشه؟! چرا نشه! واضحه که میشه!)
مثلاً تابع y=x+3 رو اگر کسی بنویسه: y=a+3 بهش گیر میدن؟! نه دیگه! چون اسمه! ما هم دوست داشتیم اسم پارامتر رو بذاریم x! یکی دیگه ممکنه حال کنه یه چیز دیگه بذاره!
پس ما به اون ورودی که تابع میگیره، گفتیم x!
حالا داخل تابع میگیم، بیا همون ورودی (یعنی x) رو به توان سه برسووون و چاپش کن! اینم از تابع ما!
مثال از نحوه فراخوانی تابع مثال 2
Sajjad(5)
که خروجی این میشه: 125 !
برای بار دوم و آخر بذارید تاکید کنم، که وقتی تابعی به اسم Sajjad رو دارید تعریف میکنید، یعنی قبلش همچین تابعی رو تعریف کردید! یعنی مثلاً کد فضا کد شما بوده:
def Sajjad(x): print(x**3) Sajjad(5)
که خب ما در بالا، برای محدودیت فضا، فقط همون خط آخر رو بهتون نشون دادیم!
شاید یکی بگه من دیدم بعضیها این تابع رو این شکلی هم تعریف میکنن:!
def Sajjad(x): return x**3
بله کاملاً درسته! return میاد مقدار رو بر میگردونه و میده دست ما! اما چاپ نمیکنه!
شاید بگید خب اگر چاپ نکنه، خب به چه دردی میخوره؟!
جواب اینه که واقعاً عموماً اتفاقاً لازمه که خروجی به ما داده بشه، نه اینکه چاب بشه! مثلاً فرض کنید میخوایم خروجی تابع فوق رو بندازیم توووی یک متغیر و بعد با اون متغیر کار کنیم! خیلی واضحه که دیگه print کردن به دردمون نمیخوره! و نیازه که return رو استفاده کنیم! مثلاً همین مثال رو در نظر بگیرید!
def Sajjad(x): return x**3 a=Sajjad(2) print(a)
که خروجی رو میندازه توووی a و بعد میاد چاپش میکنه!
این بار دوست داریم یه تابعی بنویسیم که وقتی بهش دوتا عدد میدیم، اون ها رو در هم ضرب کنه! و حاصلضرب رو چاپ کنه!
def Rahmani(a,b): print(a*b)
اینجا اسم تابع رو گذاشتیم Rahmani ! چون قراره دوتا ورودی بگیره، اومدیم دوتا چیز! داخل پرانتز نوشتیم! حالا ما دوست داشتیم اسم این دوتا چیز رو بذاریم a و b! ممکنه شما دوست داشته باشید اسامی رو بذارید x و y یا هر چیز دیگه! (اسمه دیگه! هرکی یه چیز میذاره!)
ولی خلاصه من، اسم ورودیها رو گذاشتم a و b!
حالا در خط بعد میگم: چاپ کن حاصلضرب دو عدد a و b رو! (a و b هم نمایانگر دو عددی هستن که بعداً قراره به این تابع داده بشه!)
مثال از نحوه فراخوانی تابع مثال 3
Rahmani(2,8)
که اگر اینو اجرا کنیم خروجی 16 رو میده!
فرض کنید میخوایم یه تابع برای معادله خط درست کنیم!
اگر یادتون باشه، معادله خط بود: y=ax+b ! (برای یک متغیر البته!)
حالا میخوایم یه تابع درست کنیم، که کاربر فقط بهمووون مقادیر a و b و x رو بده! (یعنی شیب خط، عرض از مبدأ خط و مقدار متغیر x!) تا ما بهش بگیم که y چند میشه!
قطعه کد زیر رو در نظر بگیرید!
def khat(x,a,b): return a*x+b
اسم تابع رو گذاشتیم khat (خط)! که سه تا ورودی میگیره! ورودی اول مقدار x! ورودی دوم مقدار a (شیب خط) و ورودی سوم مقدار عرض از مبدأ خط! (یعنی b)!
در خط بعدی، هم اومدیم گفتیم، به عنوان خروجی مقدار ax+b رو به ما برگردوونه!
حالا فرض کنید میخوایم ببینیم اگر در معادله خط y=2x+4، مقدار x رو 5 بذاریم، y چند میشه! در این صورت داریم:!
w=khat(5,2,4) print(w)
که در خط اول، خروجی تابع khat رو میندازیم توی متغیر w و بعد در خط بعد هم چاپش میکنیم!
نتیجه میشه: 14 !
پس مشخصه که به هرتعداد که بخوایم بخوایم میتونیم پارامتر و ورودی در نظر بگیریم!
همون مثال 4 رو در نظر بگیرید! حالا فرض کنید میخوایم یک قابلیت به تابع خودمون اضافه کنیم که خود تابع به طور پیشفرض عرض از مبدأ رو صفر در نظر بگیره! (مگر اینکه کاربر برای عرض از مبدأ یعنی همووون b مقداری رو وارد کنه!) اینجوری وقتی عرض از مبدأ صفره، لازم نیست، برای عرض از مبدا چیزی وارد کنه و کاربر ورودی کمتری وارد میکنه و کمتر خسته میشه!!!!!!! [هرچی علامت تعجب از این مسخریبازیها بذارم، کمه! یه عدده دیگه! وارد کنه این کاربر!]
برای اینکار داریم:!
def khat(x,a,b=0): return a*x+b
دقت دارید که جلوی ورودی سوم نوشتیم: برابر با 0! یعنی پیشفرض اینه که صفره!
حالا اگر یکی وارد کنه:!
a=khat(5,2,4) print(a)
دیگه چون صراحتاً خود کاربر واسه عرض از مبدأ (یعنی b) مقدار تعیین کرده، دیگه پیشفرض رو بیخیال میشه! و مشابه مثال 4 جواب میشه 14 !
اما اگر یکی وارد کنه:
a=khat(5,2) print(a)
چون برای عرض از مبدأ چیزی وارد نکرده، به طور پیشفرض 0 در نظر گرفته میشه! و جواب نهایی اجرای کُد میشه 10 !
توجه: یه جورایی انگار ورود پارامتر سوم ورودی (یعنی عرض از مبدأ) اختیاری است! و اگر کاربر حال کرد، وارد میکنه! حال نکرد، به طور پیشفرض صفر در نظر میگیریم!
1- تعداد ورودیهایی که به یک تابع میدیم باید با تعداد پارامترهای ورودیِ اجباری اون تابع برابر باشه! نه کمتر! نه بیشتر! وگرنه خطا دریافت میکنیم!
مثلا در مثال 3 همین مطلب، کد زیر به علت اینکه داریم زیادی ورودی میدیم، خطا میده!
Rahmani(1,2,3)
یا حتی مورد زیر به خاطر کم بودن ورودی خطا میده!
Rahmani(2)
تاکید میکنم که اگر تابعی پارامتر اختیاری داشت که خب اختیاریه دیگه!
2- پارامترهایی که قراره به صورت پیشفرض براشووون مقدار در نظر بگیریم، باید بعد از پارامترهایی تعریف بشن که براشوون مقدار پیشفرض در نظر نمیگیریم!
یعنی مثلاً اگر در همون مثال 5، به صورت زیر تابع رو وارد کنیم:
def khat(a,b=0,x): return a*x+b
بهمووون خطا میده! خطاش هم به صورت زیر است:
SyntaxError: non-default argument follows default argument
که دقیقاً همون چیزی است که گفتیم! داره با عصبانیت میگه چرا اونایی که مقدار default ندارن رو بعد از اونایی آوردی که مقدار default دارن؟! بعد یکم دعوامون میکنه و میگه دفعه آخرمووون باشه!
تعداد دیدگاه | 45 |
تعداد بازدید | 48.2K |
تاریخ انتشار | 24/06/2019 |
تاریخ بروزرسانی | 24/06/2019 |
نویسنده | گروه آموزشی کولاک |