تعریف تابع در پایتون (python) با دستور def

در این آموزش به کامل‌ترین شکل ممکن نحوه تعریف تابع در پایتون (python) رو آموزش میدیم! تابع رو باید با def به معنی define تعریف کنیم! که در این مطلب به طور کامل در موردش توضیح میدیم!

خیلی از وقت‌ها نیازه تا یک‌سری کُد رو در قالب یک تابع بنویسیم و در انواع و اقسام جاهای مختلف کُد خودمون استفاده کنیم!

مثال ۱ – تابع بدون پارامتر!

فرض کنید می‌خوایم یک تابع تعریف کنم، که بیاد اسم و فامیل من و وبسایت کولاک رو پرینت کنه! [میدونم تابع جالبی نیست، و با کارایی واقعی تایعی که شما توووی ذهنتون فاصله داره، ولی لحاظ کنید که مثال ۱ است! قطعاً جلوتر بهتر میشه!]

قطعه کد زیر رو در نظر بگیرید!:

خط ۱: اولاً def مخفف define (به معنی تعریف کردن) است! که برای تعریف تابع بکار میره! اسم تابع رو دوست داشتم بذارم copyright! شما می‌تونید اسم تابع رو بذارید Hasan یا هر اسم دیگه!

توجه: تمام خطوط بعدی باید اون فاصله اولیه یا تووو رفتگی رو داشته باشن، تا پایتون (Python) بنده خدا بفهمه منظور ما اینه که خطوط بعدی زیر مجوعه دستور def است! وگرنه بنده‌خدا از کجا میتونه بفهمه؟! خب درکش کنید دیگه!

خط ۲: اومدیم یه تابع پرینت استفاده کردیم! برای اینکه چند خطی پرینت کنیم از triple quotation استفاده کردیم!

(هموون “””یه‌چیزی””” منظورم است!)

بعدش وسطش دوتا “””نوشتم: اسمم چیه، آدرس کولاک چیست و آدرس ایمیلم رو وارد کردم! همین!

سوال احتمالی شما

الان ما یه دستور ساده print رو اومدیم توی سه خط نوشتیم؟! اینو پایتون (python) ایراد نمی‌گیره؟! [خیر! شما ۱۰ خط هم که بزنین، باز چیزی نمیگه! پایتون به هر فاصله‌ای حساس نیست! البته به بعضی فاصله‌ها مثل هموون تووورفتگی که بالاتر گفتم، خیلی حساسه!]

مثال از نحوه فراخوانی تابع مثال ۱

که این میاد، همون چیز میزای بالا رو می‌نویسه! بذارید به این موضوع تاکید کنم که خیلی واضحه که وقتی دارید تابع copyright رو فراخوانی می‌کنید! اصلاً تابعی به اسم copyright تعریف کرده باشید! (مثل اووون‌بنده‌خدای معروف نشه، که حساب بانکی نداشت، بعد دعا میکرد خدایا توووی قرعه‌کشی برنده شم!)

یعنی در اصل کل فضای کد به صورت زیر بوده:

که خب ما به دلیل محدودیت فضا، و طولانی نشدن متن، فقط همون آخری رو نوشتیم! (چون بقیش رو قبلاً یه بار آوردیم دیگه!)

مثال ۲ – به توان ۳ رساندن عدد! (تابع با یک ورودی!)

به عنوان مثال، میخوایم یه تابعی بنویسیم که هر عددی که بهش میدیم رو به توان سه برسووونه!

در این صورت کد زیر رو می‌نویسم! [کُد رو نگاه کنید، توضیح میدم در ادامه!]

یه تابع تعریف کردیم به اسم Sajjad! که یه دونه ورودی میگیره! (هر چیزی که توی پرانتز جلوی اسمش میذاریم، بیانگر ورودی است! چون یه دونه چیز گذاشتیم، یعنی یه دونه ورودی میگیره! اگر ۵۰۰ تا چیز توی پرانتز میذاشتیم! یعنی تابع ما ۵۰۰ تا ورودی میگیره!)

بعد یه چیز دیگه!: اون x همینجوری گذاشتیم x! (میتونست هر چیز دیگه هم باشه! منظور کلّی‌مووون اینه که یه ورودی میگیره! مثلاً به اسم x! حالا نمی‌تونه اون یه دونه ورودی اسمش a باشه؟! چرا نشه! واضحه که میشه!)

مثلاً تابع y=x+3 رو اگر کسی بنویسه: y=a+3 بهش گیر میدن؟! نه دیگه! چون اسمه! ما هم دوست داشتیم اسم پارامتر رو بذاریم x! یکی دیگه ممکنه حال کنه یه چیز دیگه بذاره!

پس ما به اون ورودی که تابع میگیره، گفتیم x!

حالا داخل تابع میگیم، بیا همون ورودی (یعنی x) رو به توان سه برسووون و چاپش کن! اینم از تابع ما!

مثال از نحوه فراخوانی تابع مثال ۲

که خروجی این میشه: ۱۲۵ !

برای بار دوم و آخر بذارید تاکید کنم، که وقتی تابعی به اسم Sajjad رو دارید تعریف می‌کنید، یعنی قبلش همچین تابعی رو تعریف کردید! یعنی مثلاً کد فضا کد شما بوده:

که خب ما در بالا، برای محدودیت فضا، فقط همون خط آخر رو بهتون نشون دادیم!

استفاده از return برای برگرداندن مقدار خروجی در پایتون (python)!

شاید یکی بگه من دیدم بعضی‌ها این تابع رو این شکلی هم تعریف میکنن:!

بله کاملاً درسته! return میاد مقدار رو بر می‌گردونه و میده دست ما! اما چاپ نمی‌کنه!

شاید بگید خب اگر چاپ نکنه، خب به چه دردی میخوره؟!

جواب اینه که واقعاً عموماً اتفاقاً لازمه که خروجی به ما داده بشه، نه اینکه چاب بشه! مثلاً فرض کنید می‌خوایم خروجی تابع فوق رو بندازیم توووی یک متغیر و بعد با اون متغیر کار کنیم! خیلی واضحه که دیگه print کردن به دردمون نمی‌خوره! و نیازه که return رو استفاده کنیم! مثلاً همین مثال رو در نظر بگیرید!

که خروجی رو میندازه توووی a و بعد میاد چاپش میکنه!

مثال ۳ – ضرب دو عدد (تابع با دو پارامتر ورودی!)

این بار دوست داریم یه تابعی بنویسیم که وقتی بهش دوتا عدد می‌دیم، اون ها رو در هم ضرب کنه! و حاصل‌ضرب رو چاپ کنه!

اینجا اسم تابع رو گذاشتیم Rahmani ! چون قراره دوتا ورودی بگیره، اومدیم دوتا چیز! داخل پرانتز نوشتیم! حالا ما دوست داشتیم اسم این دوتا چیز رو بذاریم a و b! ممکنه شما دوست داشته باشید اسامی رو بذارید x و y یا هر چیز دیگه! (اسمه دیگه! هرکی یه چیز میذاره!)

ولی خلاصه من، اسم ورودی‌ها رو گذاشتم a و b!

حالا در خط بعد می‌گم: چاپ کن حاصل‌ضرب دو عدد a و b رو! (a و b هم نمایانگر دو عددی هستن که بعداً قراره به این تابع داده بشه!)

مثال از نحوه فراخوانی تابع مثال ۳

که اگر اینو اجرا کنیم خروجی ۱۶ رو میده!

مثال ۴- معادله خط (تابع با ۳ پارامتر ورودی!)

فرض کنید می‌خوایم یه تابع برای معادله خط درست کنیم!

اگر یادتون باشه، معادله خط بود: y=ax+b ! (برای یک متغیر البته!)

حالا می‌خوایم یه تابع درست کنیم، که کاربر فقط بهمووون مقادیر a و b و x رو بده! (یعنی شیب خط، عرض از مبدأ خط و مقدار متغیر x!) تا ما بهش بگیم که y چند میشه!

قطعه کد زیر رو در نظر بگیرید!

اسم تابع رو گذاشتیم khat (خط)! که سه تا ورودی میگیره! ورودی اول مقدار x! ورودی دوم مقدار a (شیب خط) و ورودی سوم مقدار عرض از مبدأ خط! (یعنی b)!

در خط بعدی، هم اومدیم گفتیم، به عنوان خروجی مقدار ax+b رو به ما برگردوونه!

حالا فرض کنید می‌خوایم ببینیم اگر در معادله خط y=2x+4، مقدار x رو ۵ بذاریم، y چند میشه! در این صورت داریم:!

که در خط اول، خروجی تابع khat رو میندازیم توی متغیر w و بعد در خط بعد هم چاپش می‌کنیم!

نتیجه میشه: ۱۴ !

پس مشخصه که به هرتعداد که بخوایم بخوایم می‌تونیم پارامتر و ورودی در نظر بگیریم!

در نظر گرفتن مقدار پیش فرض برای پارامترهای ورودی تابع

مثال ۵

همون مثال ۴ رو در نظر بگیرید! حالا فرض کنید می‌خوایم یک قابلیت به تابع خودمون اضافه کنیم که خود تابع به طور پیش‌فرض عرض از مبدأ رو صفر در نظر بگیره! (مگر اینکه کاربر برای عرض از مبدأ یعنی همووون b مقداری رو وارد کنه!) اینجوری وقتی عرض از مبدأ صفره، لازم نیست، برای عرض از مبدا چیزی وارد کنه و کاربر ورودی کمتری وارد میکنه و کمتر خسته میشه!!!!!!! [هرچی علامت تعجب از این مسخری‌بازی‌ها بذارم، کمه! یه عدده دیگه! وارد کنه این کاربر!]

برای اینکار داریم:!

دقت دارید که جلوی ورودی سوم نوشتیم: برابر با ۰! یعنی پیش‌فرض اینه که صفره!

حالا اگر یکی وارد کنه:!

دیگه چون صراحتاً خود کاربر واسه عرض از مبدأ (یعنی b) مقدار تعیین کرده، دیگه پیش‌فرض رو بی‌خیال میشه! و مشابه مثال ۴ جواب میشه ۱۴ !

اما اگر یکی وارد کنه:

چون برای عرض از مبدأ چیزی وارد نکرده، به طور پیش‌فرض ۰ در نظر گرفته میشه! و جواب نهایی اجرای کُد میشه ۱۰ !

توجه: یه جورایی انگار ورود پارامتر سوم ورودی (یعنی عرض از مبدأ) اختیاری است! و اگر کاربر حال کرد، وارد میکنه! حال نکرد، به طور پیش‌فرض صفر در نظر میگیریم!

چند نکته!

۱- تعداد ورودی‌هایی که به یک تابع می‌دیم باید با تعداد پارامترهای ورودیِ اجباری اون تابع برابر باشه! نه کمتر! نه بیشتر! وگرنه خطا دریافت می‌کنیم!

مثلا در مثال ۳ همین مطلب، کد زیر به علت اینکه داریم زیادی ورودی میدیم، خطا میده!

یا حتی مورد زیر به خاطر کم بودن ورودی خطا میده!

تاکید می‌کنم که اگر تابعی پارامتر اختیاری داشت که خب اختیاریه دیگه!

۲- پارامترهایی که قراره به صورت پیش‌فرض براشووون مقدار در نظر بگیریم، باید بعد از پارامترهایی تعریف بشن که براشوون مقدار پیش‌فرض در نظر نمی‌گیریم!

یعنی مثلاً اگر در همون مثال ۵، به صورت زیر تابع رو وارد کنیم:

بهمووون خطا میده! خطاش هم به صورت زیر است:

که دقیقاً همون چیزی است که گفتیم! داره با عصبانیت میگه چرا اونایی که مقدار default ندارن رو بعد از اونایی آوردی که مقدار default دارن؟! بعد یکم دعوامون میکنه و میگه دفعه آخرمووون باشه!

  1. amir
    15:26 مورخه 10 سپتامبر 19

    میدونستی در زمینه آموزش بی نظیری؟
    من خودم پایتون رو بلدم اما جذب آموزشت شدم و اومدم ببینم مطالب رو چجور آموزش میدی
    که واقعا لذت بردم چون روش آموزشت رو توی هیچ سایت دیگه ای ندیده بودم
    با قدرت بیشتر ادامه بده 🙂
    موفق باشی

    • گروه آموزشی کولاک
      07:29 مورخه 12 سپتامبر 19

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

  2. Rioramo
    20:02 مورخه 19 اکتبر 19

    سلام مطالبتون بسیار مفید بود

  3. atefe behbudi
    21:33 مورخه 03 نوامبر 19

    واقعا بی نظیرید جدی میگم

    • گروه آموزشی کولاک
      10:09 مورخه 05 نوامبر 19

      خیلی ممنون، لطف دارید

کانال تلگرامی ما رو هم دنبال کنید (هر روز تمرین پایتون و مطالب مفیدی قرار میدیم)@Koolac_Org
+