توابع تو در تو در پایتون – آموزش به زبان ساده + مثال و کد
«توابع تو در تو در پایتون» (Nested Function in Python)، یکی از مفاهیم جذاب در برنامهنویسی است که اشاره به تعریف یک تابع درون تابعی دیگر دارد. این توابع تو در تو که با نام «توابع درونی» (Inner Functions) نیز شناخته می شوند، توانایی بینظیری در دسترسی به متغیرهای محدوده خود دارند. به بیان سادهتر، آنها میتوانند از منابع تابع والد خود بهرهمند شوند. توابع تو در تو در پایتون یکی از ابزارهای قدرتمند این زبان محسوب میشوند و به ما امکان میدهند تابعی را درون تابعی دیگر تعریف کنیم. این مفهوم با استفاده از جایگذاری یک تابع درون تابعی دیگر، کمک میکند تا کدهای منظمتر و مدیریتپذیرتری را ایجاد کنیم. به لطف وجود مفهوم Nested Functions، کدها خواناتر و همچنین بهینهتر میشوند. در این مطلب از مجله فرادرس توضیح میدهیم که توابع تو در تو در پایتون چیست و به چه دلیلی از آن استفاده میکنیم.
- یاد میگیرید توابع تو در تو در پایتون را تعریف کنید.
- میآموزید کجا و چگونه از nested function برای ساختار بهتر بهره ببرید.
- نحوه استفاده از closure و مزایای کپسولهسازی را خواهید آموخت.
- خواهید توانست کد خود را با ماژولار کردن سادهتر نگهداری کنید.
- تفاوت توابع تو در تو و lambda را یاد خواهید گرفت.
- با روش مقابله با رایجترین خطاها و چالشهای مربوط به توابع درونی آشنا میشوید.


مقدمهای بر توابع در پایتون
در این قسمت، بهطور مختصر مروری بر مفاهیم اولیه این موضوع، نظیر تابع در پایتون و برنامهنویسی تابعی خواهیم داشت.
توابع در پایتون
«توابع» (Functions) نقش مهمی را در برنامهنویسی به زبان پایتون بر عهده دارند. فانکشنها در واقع قطعه کدهایی با قابلیت استفاده مجدد هستند که میتوانند وظایف مشخصی را انجام دهند. پس از تعریف تابع، با استفاده از نام آن و - در صورت لزوم - ارسال آرگومانهایی در پرانتز، میتوانیم آن را فراخوانی کنیم. برای انجام وظایف مختلف میتوانیم توابع متعددی را تعریف کنیم که هر یک وظیفه خاص خود را دارند. با این کار کدهایمان راحتتر سازماندهی و ساختارمند میشوند. مستندسازی و تایپدهی تابع، مؤلفههای مهمی برای خوانایی کدها و دیباگ راحتتر آن بهشمار میروند، بهخصوص هنگامیکه با پروژههای بزرگ سر و کار داریم.

برنامه نویسی تابعی
زبان برنامهنویسی پایتون از پارادایمها یا الگوهای برنامهنویسی متعددی نظیر «برنامهنویسی تابعی» (Functional Programming) پشتیبانی میکند. این رویکرد برنامهنویسی به استفاده از توابع خالص، بدون استفاده از وضعیت مشترک، دادههای «تغییرپذیر» (Mutable) و «اثرات ناخواسته» (Side-Effects) معطوف است. بهطور معمول این رویکرد در پایتون بهوسیله بهکارگیری توابع «مرتبهبالاتر» (Higher-Order) و عبارات لامبدا یا lambda مورد استفاده قرار میگیرد.
منظور از توابع تو در تو در پایتون چیست؟
توابع تو در تو در پایتون به مفهومی در این زبان برنامهنویسی گفته میشود که در آن تابعی را درون تابعی دیگر ایجاد میکنیم. به بیان دیگر، یک تابع را میتوانیم داخل تابعی دیگر تعریف کنیم سپس این تابع میتواند به متغیرهای اعلان شده در تابع بیرونی خود دسترسی داشته باشد.

چه زمانی از توابع تو در تو در پایتون استفاده می کنیم؟
توابع تو در تو در پایتون زمانی مفید هستند که نیازمند تعریف تابع کمکی هستیم که تنها داخل محدوده «تابع بیرونی» (Outer Function) مورد نیاز است. توابع تو در تو در پایتون افزون بر اینکه خوانایی کدهایمان را افزایش میدهند، به سازماندهی و ماژولارسازی کدها نیز کمک میکنند.
مثال توابع تو در تو در پایتون
در این بخش از مطلب مجله فرادرس میخواهیم نمونههایی از نِستِدفانکشن یا همان توابع تو در تو در پایتون را با هم مرور کنیم.
مثال اول از توابع تو در تو در پایتون
در زیر، مثالی از توابع تو در تو آورده شده است.
خروجی این کدها را در ادامه آوردهایم.
8توضیح کدها
در این مثال، ۲ تابع به نامهای آورده شده در زیر تعریف کردهایم.
- outer_function
- inner_function

تابعouter_function آرگومانی ورودی بهنامx را دریافت کرده و تابع inner_function را بهعنوان خروجی برمیگرداند. بههمین ترتیب، تابعinner_functionآرگومانy را دریافت کرده و مجموع x و y را بر میگرداند.
خروجی تابعouter_function(5) را به متغیرadd_five تخصیص میدهیم که تبدیل به تابعی شده و مقدار5 را به آرگومان خود اضافه میکند. هنگامیکهadd_five(3) را فراخوانی میکنیم، نتیجهای برابر با8 دریافت خواهیم کرد.
مثال دوم از توابع تو در تو در پایتون
در زیر، مثال دیگری از توابع تو در تو را بررسی میکنیم.
خروجی این کدها را در ادامه آوردهایم.
3توضیح کدها
در این مثال، تابعی بهنام outer_functionتعریف کردهایم که مقدار اولیه 1 را بهx نسبت میدهد و خروجیinner_function را بر میگرداند. inner_function متغیر y را با 2 مقداردهی میکند و مجموع x و y را بر میگرداند.
زمانیکه تابعouter_function را فراخوانی میکنیم مقدار3 را بهعنوان نتیجه، دریافت خواهیم کرد که مجموع متغیرهای x وy است. تابعinner_function درون محدودهouter_function فراخوانی میشود و به متغیرx - تعریف شده درون تابعouter_function - دسترسی خواهد داشت.
مزایای استفاده از توابع تو در تو در پایتون
بهکارگیری توابع تو در تو در پایتون دارای مزیتهای بسیاری است. این قابلیت به برنامهنویسان امکان میدهد تا ساختار برنامهنویسی تطبیقپذیر و قویتری را ایجاد کنند، خوانایی کدهایشان را افزایش دهند و با ایجاد کدهای ماژولار، فرایند نگهداری از آن را تسهیل کنند.

«کپسولهسازی و ماژولار بودن» (Encapsulation and Modularity): مهمترین مزیت توابع تو در تو در پایتون، به توانایی آن در تعریف توابع کمکی درون محدوده خاص یک تابع متکی است. در نتیجه این کار، ضمن ترویج سازماندهی کدها، از بینظمی و شلوغی Namespace عمومی پیشگیری میشود. برای تعریف تابع از کلمه کلیدی def در پایتون استفاده میکنیم. برای نمونه، مثال زیر را در نظر میگیریم.
در این مثال، double_odd_numbers توابع is_odd و double را در بر میگیرد که درک آن را آسان میکند چون این توابع تنها در محدوده تابع اصلی استفاده میشوند.
«ایجاد بستار» (Closure Creation): مزیت قابل توجه دیگری که توابع تو در تو در پایتون برایمان فراهم میکنند، توانایی آنها در ایجاد بستارها است. این قابلیت به توابع تو در تو امکان میدهد تا به متغیرها، از تابع دربرگیرنده خود دسترسی پیدا کرده و تغییرات مربوطه را روی آنها اعمال کنند. برای مثال، قطعه کدهای زیر را در نظر میگیریم.
خروجی این کدها به صورت زیر خواهد بود.
8
9در این حالت، تابع power_function تابع جدیدی بهنام exponent_power ایجاد میکند که میتواند مقدار توان یک پایه base - به توان دادهشده - را محاسبه کند. با بهکارگیری این ساختار تو در تو، توابعی مانندsquare وcube به متغیر base از تابع دربرگیرنده، دسترسی پیدا کرده و ایجاد توابع جدید با مقادیرbase متفاوت را تسهیل میکنند.
با بهرهگیری از توابع تو در تو در پایتون، توسعهدهندگان این زبان میتوانند خوانایی و ماژولار بودن کدهای خود را افزایش دهند و از عملکردهای قدرتمند بستاری برای ایجاد ساختارهای متنوع و کارآمد تر استفاده کنند.
ایجاد توابع تو در تو در پایتون چگونه است؟
توابع تو در تو در پایتون به فرایند ایجاد یا همان تعریف تابعی درون تابعی دیگر اشاره دارد. این روند به سازماندهی بهتر و افزایش خوانایی کدها کمک بهسزایی میکند. برای ایجاد یک تابع تو در تو در پایتون، کافی است تا مراحل آورده شده در ادامه را دنبال کنیم.
- «تابع بیرونی» (Outer Function) را میسازیم.
- «تابع درونی» (Inner Function) را داخل تابع بیرونی تعریف میکنیم.
- تابع درونی را داخل تابع بیرونی فراخوانی میکنیم یا - به عنوان نتیجه آن - بر میگردانیم.
همانطور که پیشتر هم بیان کردیم، ایجاد توابع تو در تو در پایتون، روش مفیدی برای سازماندهی و سادهسازی کدها محسوب میشود. همچنین، فرایندهای پیچیده را ساده میسازد و به خوانایی بهتر کدها نیز کمک میکند.
مثال های توابع تو در تو پایتون در کاربردهای واقعی
Nested Function-ها توابعی هستند که درون توابع دیگر تعریف شدهاند. ایجاد توابع به این شکل در برنامهنویسی، کاربرد زیادی دارد و میتواند در کاربردهای واقعی پایتون مورد استفاده قرار گیرد. بهطور مثال، یک تابع تو در تو میتواند تابعی را تعریف کرده که تابع دیگری را فراخوانی میکند. یا در مثالی دیگر یک تابع تو در تو میتواند تابعی را تعریف کرده که از تابع از پیشتعریف شدهای استفاده میکند. افزون بر این، تابع تو در تو میتواند «محدوده محلی» (Local Scope) را نیز در اختیارمان قرار دهد.
مثال اول
کدهای آورده شده در ادامه را در نظر بگیرید.
در این مثال، تابعchild_function یک تابع تو در تو محسوب میشود که درون تابعparent_function تعریف شده است. تابع parent_functionپارامتری بهنامx را دریافت میکند. سپس از تابعchild_functionبرای دوبرابر کردن مقدار آن استفاده میکند. در نهایت، مجموعxو child_functionرا بر میگرداند. با اجرای parent_function(5) مقدار 15 به عنوان نتیجه دریافت میکنیم.

مثال دوم
مثال دیگری در این رابطه آوردهایم.
در این مثال، inner یک تابع تو در تو است که درون تابع adder تعریف شده است. تابع adderپارامتری بهنامa را دریافت و تابع inner را بر میگرداند. تابع innerپارامتری بهنام x را دریافت و مجموع xوa را بر میگرداند. هنگامیکه adder(3) را فراخوانی میکنیم، تابعinner را دریافت خواهیم کرد. innerرا نیز بهعنوانx ذخیره میکنیم. این مورد برایadder(5) هم صدق میکند که آن را بهعنوانy ذخیره میکنیم. هنگامیکه x(5) باشد، نتیجهای برابر با 8 خواهیم داشت و زمانیکهy(5) فراخوانی میکنیم، عدد10 را بهعنوان خروجی دریافت خواهیم کرد.
مثال سوم
در ادامه این مطلب از مجله فرادرس، مثال دیگری را بررسی میکنیم.
در این مثال، تابع square یک تابع تو در تو است که درون تابع exponential تعریف شده است. تابع exponential پارامتری بهنام x را دریافت کرده و مقدار مربع x به توان چهارم را برمیگرداند. تابع square پارامتری بهنام y را دریافت کرده و مربع y را بر میگرداند. با اجرای exponential(2) ، مقدار 16 را بهعنوان نتیجه دریافت خواهیم کرد.

بهترین روش ها برای استفاده از توابع تو در تو در پایتون
بهترین روشها برای این توابع تو در تو شامل موراد زیر است.
- پرهیز از زیادهروی در تو در تو سازی
- اطمینان از اینکه هر تابع، هدف واضح و مشخصی دارد.
- استفاده از محدوده متغیر مناسب.

برای استفاده از توابع تو در تو در پایتون، تابع بیرونی را تعریف کرده و سپس تابع درونی را داخل آن تعریف ميکنیم. تابع درونی بهمتغیرهای درون تابع بیرونی دسترسی خواهد داشت، اما عکس این قضیه برقرار نیست. در ادامه، ۲ مثال را در این باره آوردهایم.
در این مثال، تابع Power بهصورت تو در تو ایجاد شده است. تابع بیرونی، عددی را دریافت کرده و تابع درونی را - که توان آن عدد را محاسبه میکند - بهعنوان خروجی بر میگرداند. تابع درونی در محدوده تابع بیرونی تعریف شده است که به آن امکان میدهد به پارامترnum دسترسی داشته و توان را محاسبه کند.
مثال دیگری را در زیر آوردهایم.
در این مثال، با استفاده از یک حلقه و توابع تو در تو، لیستی از توابع تولید شده است. تابع درونی که داخل حلقه تعریف شده است، به آن امکان دسترسی به متغیر حلقه یعنی i را میدهد. لیست حاصل از توابع پس از آن میتواند برای اجرای محاسبات با مقادیر گوناگونi مورد استفاده قرار گیرد.
خطاهای متداول هنگام استفاده از توابع تو در تو در پایتون
برای پیشگیری از خطاهای رایج هنگام استفاده از توابع تو در تو در برنامهنویسی پایتون، اطمینان از اینکه نام توابع و متغیرها داخل تابع درونی و تابع والد آن تکرار نشده، اهمیت زیادی دارد، زیرا ممکن است سردرگمی و بروز خطا را بهدنبال داشته باشد.
خطاهای رایج دیگری که میبایست از آنها پرهیز کنیم شامل فراخوانی ناصحیح تابعی درون تابع دیگر و همچنین استفاده اشتباه از حلقهها درون توابع تو در تو است. افزون بر این، هنگام استفاده از روشهای برنامهنویسی تابعی میبایست دقت کافی به خرج دهیم.
بهطور مثال، کدهایی که در ادامه آوردهایم، خطای رایجی را نشان میدهد که متغیری در هر ۲ تابع والد و درونی تعریف شده است.
سوالات متداول
اکنون که دانستیم توابع تو در تو در پایتون چیست و چگونه نوشته میشود و همچنین کارکرد آنها چگونه است، برخی از پرسشهای رایج در رابطه با آن را نیز در این قسمت پاسخ میدهیم.
منظور از تابع تو در تو چیست؟
همانطور که گفتیم، توابع تو در تو شامل تعریف یک تابع درون تابع دیگر است که این قضیه به کپسولهسازی و سازماندهی کدها کمک خواهد کرد.
فرق بین توابع ناشناس و توابع تو در تو در پایتون چیست؟
«توابع تو در تو» (Nested functions)، در واقع توابعی هستند که درون تابعی دیگر تعریف شدهاند.این توابع تنها از درون تابع در برگیرنده بیرونی قابل دسترسیاند. از سویی دیگر، «توابع ناشناس» (Anonymous Functions) را داریم که توابعی بدوننام هستند و با کلمه کلیدی lambda تعریف میشوند. این نوع توابع را میتوان در هر جایی از برنامه تعریف کرد و همچنین میتوانند بهعنوان آرگومان به تابع دیگر ارسال شوند.
جمعبندی
در این مطلب از مجله فرادرس به توضیح این مفهوم پرداختیم که توابع تو در تو در پایتون چیست و نحوه ایجاد این نوع توابع چگونه است. همچنین با مزایی که این روش برایمان فراهم میکند آشنا شدیم. همچنین، ضمن اینکه مثالهای متعددی را در مورد توابع تو در تو در پایتون بیان کردیم، کاربردهای واقعی استفاده از آن را نیز به همراه کدهای مرتبط توضیح دادیم.
هنگام نوشتن توابع تو در تو ممکن است با خطاهایی روبهرو شویم که برای رفع آنها نیز نکاتی را بیان کردیم. در آخر نیز به بیان برخی از پرسشهای متداول در این بلاره پرداختیم و پاسخهای مربوطه را با هم مرور کردیم.












