توابع داخلی
به تابعی که در داخل تابع دیگر تعریف شده باشد، تابع داخلی گفته می شود :
def outer(): def inner(): #Some code
در کد بالا تابع ()inner یک تابع داخلی است. برای اینکه یک تابع داخلی را به وسیله تابع خارجی آن برگشت دهیم باید بعد از کلمه کلیدی return، نام تابع داخلی را بدون پرانتز بنویسیم:
def outer(): def inner(): #Some code return inner;
به مثالی ساده در مورد توابع داخلی توجه کنید :
1: def make_adder(x): 2: def addFive(): 3: return x + 5 4: return addFive 5: 6: result = make_adder(10) 7: print(result())
15
قبل از توضیح کد بالا به این نکته توجه کنید که توابع داخلی به متغیرهای تابع خارجی دسترسی دارد. در کد بالا یک تابع داخلی به نام ()addFive تعریف شده است که وظیفه آن اضافه کردن عدد 5 به مقداری است که با تابع خارجی ارسال می شود. در خط 6 وقتی تابع ()make_adder را فراخوانی می کنیم و مقدار آن را در داخل یک متغیر به نام result می ریزیم، این متغیر در اصل مقدار برگشتی از تابع ()make_adder یعنی تابع ()addFive است. در نتیجه برای چاپ نهایی این مقدار برگشتی باید در جلوی نام result در خط 7 علامت پرانتز بگذاریم تا به نوعی تابع ()addFive فراخوانی شود. پس وقتی مقدار 10 را به تابع ()make_adder ارسال می کنیم، این عدد در داخل تابع ()addFive با 5 جمع شده و مقدار 15 برگشت داده می شود. توابع داخلی در مبحث Decorator ها کاربرد دارند، که در درس های آینده توضیح می دهیم.
با سلام استاد متاسفانه چنتا از مثال های آخر به خوبی چاپ نشدن و بعضی ها هم پاک شدند
با سلام استاد متشکر از آموزشات شما واقعا کامل و قابل فهم هستند و من از همینجا به پایتون مسلط شدم و واقعا کتاب ها و دوره های آموزشیون عالی هستن
استاد ما سوالی نداشتیم فقط خواستیم کمی این مثال آخر واضح تر نشون بدیم چون بعضی از دوستانم که در همین سایت فعالیت میکنند دچار سر درگمی در این قسمت شده اند و من گفتم شاید دوستان دیگر هم همین مشکل را داشته باشن
دوستان دلیل اینکه ما تابع در یک متغیر قرار دادیم این است که ما باید از مقدار return شده استفاده کنیم
برای درک راحت تر این موضوع یک مثال میزنم
در این مثال ما در تابع ()Example مقدار 5 به متغیر x دادیم و متغیر x را برگردانده ایم اکنون متغیر x ارسال شده است اما هیچ تابع یا دستوری برای دریافت آن وجود ندارد حال این مثال را ببینید
اکنون وقتی این برنامه را اجراع کنید تابع عدد 5 را بر میگرداند و توسط تابع ()print مورد استفاده قرار میگیرد
و در نتیجه در خروجی عدد 5 نمایش داده میشود
حال که فهمیدیم چرا تابع ()make_adder را در متغیر result میریزیم به سراغ موضوع بعدی میریم اما قبلش درمورد این این خط کد
result = make_adder(10) یک توضیحی بدم اکنون که این برنامه را اجراع میکنید تابع فراخوانی میشود و مقدار 10 را به عنوان آرگومان به پارامتر ارسال میکند و 10 درون متغیر x قرار میگیرد بعد به دنبال کد های بعدی میرود و وقتی به خط 4 میرسد و تابع addFive به بر میگرداند الان این دو کد کاملا برابر هستند با این تفاوت که کد اول راحت اجراع میشود اما کد دوم دارای خطا میباشد چون به عناصر Local درون تابع ()make_adder دسترسی ندارد و این مثال فقط برای فهم آسان تر موضوع است
result = addFive ==== result = make_adder(10)
حال چرا جلوی متغیر result از پرانتز استفاده کردیم . چون وقتی متغیر را به صورت خالی چاپ کنیم فقط آدرس تابع را در memory مشاهده خواهید کرد
و از پرانتز برای نشان دادن تابع بودن تابع ()addFive استفاده میشود
الان این چند کد تنها تفاوتشون همون قضیه Local و Global و نمیتوان مستقیم تابع addFive را چاپ کرد و فقط برای درک بهتر نوشته شده اند
>> print
15 >> print
این یک مثال است که معنیش محل ذخیره تابع در مموری است که اصلا مبحث مهمی نیست و زیاد بهش فکر نکنید
اکنون کارایی دقیق () پرانتز را درک کرده اید و توضیح کلی این است که پرانتز به برنامه میفهماند که این اسم یا متغیر یک تابع هستند