در این مطلب، ۲۳ نمونه سوال تابع در پایتون را با جواب و کد بررسی کردهایم. تابع به بلوکهایی از کدهای پایتون گفته میشود که با هدف انجام وظیفه مشخص و در چهارچوب معینی نوشته شدهاند. با استفاده از تابع در پایتون میتوانیم کدهای خود را به صورت ماژولار بنویسیم. در ضمن این کدها قابلیت استفاده مجدد و بدون محدودیت را دارند. به طور معمول، برای نوشتن توابع از کلمه کلیدی def در پایتون استفاده میکنیم. اما روشهای دیگری هم مانند دستورات lambda برای نوشتن توابع یکخطی در دسترس هستند. برنامه نویسان پایتون باید انواع روشهای طراحی و استفاده از توابع را بلد باشند.
آنچه در این مطلب میآموزید:
-
روش نوشتن تابع برای انجام محاسبات مقایسهای و ریاضی را یاد میگیرید.
-
میآموزید که چگونه در ورودی تابع رشته دریافت کرده و در خروجی معکوس آن را برگردانید.
-
روش استفاده از پارامتر با مقدار پیشفرض را در زمان تعریف تابع یاد میگیرید.
-
یاد میگیرید که چگونه به توابع، نام جدیدی اختصاص دهید و کدهای رشتهای را اجرا کنید.
-
با پارامترهای args* و kwargs** آشنا شده و روش استفاده از آنها را میآموزید.
-
متوجه میشوید که تابع lambda چیست و چگونه باید از آن استفاده کرد.

در این مطلب از مجله فرادرس، چند نمونه سوال پایتون را همراه با جواب نوشته و راه حل آنها را توضیح میدهیم. این نمونه سوالات را از ساده به دشوار به ترتیب بیان کرده و حل میکنیم. در این تمرینات، مباحث مختلفی مانند توابع ریاضی، استفاده از args* و kwargs** و دستورات «lambda» را مطرح میکنیم.
پیدا کردن عدد بزرگتر در بین سه عدد
در این نمونه سوال تابع در پایتون، سه عدد مختلف داده شده است. برای پیدا کردن بزرگترین عدد و نشان دادن آن در خروجی، کاربر باید تابعی بنویسد. استفاده از تابع یکی از مهمترین تکنیکهای برنامه نویسی در زبان پایتون است. به این روش، برنامه نویسی تابعی گفته میشود. برای آموزش حرفهای آن پیشنهاد میکنیم که فیلم آموزش برنامه نویسی تابعی در پایتون را از فرادرس مشاهده کنید. لینک مربوط به این فیلم را در پایین نیز قرار دادهایم.
در کادر پایین، روش حل این سوال با کمک ۲ تابع جدا از هم نوشته شده است.
در خط آخر از کدهای بالا اعداد (3, 6, -5) به عنوان ورودی به تابع داده شدهاند. در نتیجه بعد از اجرای این برنامه، خروجی به صورت عدد 6 تولید شده و در کنسول پایتون نمایش داده میشود.
در پایین، روش حل این مسئله را به سه گام مهم تقسیم کرده و هر کدام را به شکل شفاف توضیح دادهایم.
- گام اول: در کادر بالا برای حل این مسئله، دو تابع مختلف تعریف کردهایم. ابتدا تابع max_of_two(x, y) را توضیح میدهیم.
وظیفه تابع max_of_two پیدا کردن بزرگترین عدد بین دو عدد است. در فهرست پایین روش کار تابع max_of_two(x, y) را نوشتهایم.
- این تابع دو عدد x و y را میگیرد.
- شرط if x > y: بررسی میکند که آیا x بزرگتر از y است یا نه.
- اگر شرط برقرار بود، مقدار x برگردانده میشود.
- در غیر این صورت، یعنی اگر y بزرگتر یا مساوی باشد، مقدار y برگردانده میشود.

- گام دوم: اکنون تابع max_of_three(x, y, z) را تعریف میکنیم.
این تابع برای محاسبه بزرگترین عدد از بین سه عدد استفاده میشود. اما همینطور که مشاهده میکنید درون خودش دوباره از تابع max_of_two(x, y) استفاده کرده است. روش کار آن را در فهرست پایین توضیح دادهایم.
- این تابع سه عدد x و y و z میگیرد.
- اول max_of_two(y, z) اجرا میشود. خروجی این تابع، بزرگترین مقدار بین y و z است.
- سپس نتیجه max_of_two(y, z) با x مقایسه میشود.
- در نهایت، تابع max_of_three(x, y, z) بزرگترین عدد بین سه عدد ورودی را پیدا و برمیگرداند.

- گام سوم: کد print(max_of_three(3, 6, -5)) برای آزمایش کارکرد تابع اجرا میشود. همینطور که گفتیم در خروجی تابع max_of_three مقدار 6 برگشت داده میشود.
جمع بستن تمام اعداد درون لیست
در این سوال، لیستی با چند عدد صحیح داده میشود. مخاطب باید تابعی با زبان پایتون بنویسد که این لیست پایتون را در ورودی بگیرد و در خروجی، حاصل جمع تمام عناصر لیست را برگرداند. برای مثال اگر لیست [8, 2, 3, 0, 7] را به تابع، ارسال کنیم در خروجی باید عدد 20 برگشت داده شود.

ابتدا در کادر پایین، پاسخ سوال را مینویسیم. سپس روش کار این تابع را با جزئیات توضیح میدهیم.
بعد از اجرای کدهای بالا، خروجی برابر با عدد 20 تولید شده و در کنسول پایتون نمایش داده میشود. روش کار کدهای بالا را خطبهخط در فهرست پایین توضیح دادهایم.
- def sum(numbers): ابتدا تابعی به نام sum() تعریف میکنیم. این تابع، پارامتری به نام numbers دریافت میکند. پارامتر numbers همان لیست یا تاپلی است که باید مجموع تمام عناصر آن محاسبه شود.
- total = 0: با این کد، متغیری به نام total ساخته و مقدار اولیه آن را 0 میگذاریم. از این متغیر برای ذخیره نتیجه جمع عناصر استفاده میکنیم.
- for x in numbers: با کمک این کد، حلقهای برای پیمایش عناصر numbers ایجاد میکنیم. در هر بار اجرای حلقه، متغیر x برابر با یکی از عناصر لیست میشود.
- total += x: این کد، وظیفه دارد عنصر فعلی x را به مقدار متغیر total اضافه کند.
- return total: این کد نتیجه نهایی را به خارج از تابع برمیگرداند.
- خط آخر: نتیجه اجرای تابع sum() با دستور print() در خروجی نمایش داده میشود.
معکوس کردن رشته
در این نمونه سوال تابع در پایتون از کاربر خواسته شده است که تابعی برای معکوس کردن رشتهها بنویسد. برای مثال، فرض کنیم که رشته 1234abcd به تابع ارسال میشود. این تابع باید در خروجی رشته dcba4321 را برگرداند.
ابتدا تابع جواب حل مسئله را نوشتهایم. سپس روش کار تابع را توضیح دادیم.
بعد از اجرای کدهای بالا، خروجی زیر تولید شده و در کنسول پایتون نمایش داده میشود.
dcba4321
در فهرست پایین، مراحل کار کد بالا را توضیح دادهایم.
- با کمک کد def string_reverse(str1) تابعی به نام string_reverse تعریف میکنیم. این تابع رشته str1 را میگیرد و نسخه معکوس آن را برمیگرداند.
- با کد rstr1 = ” رشتهای خالی برای نگهداری رشته معکوس میسازیم.
- با کمک کد index = len(str1) طول رشته ورودی را محاسبه کرده و در متغیر index ذخیره میکنیم.
- تا زمانی که index به صفر برسد، حلقه while اجرا میشود.
- کد rstr1 += str1[index – 1] در هر بار اجرای حلقه، یک کاراکتر از انتهای str1 به ابتدای rstr1 اضافه میکند.
- سپس مقدار index را یک واحد کاهش میدهیم. با این کار از انتهای رشته به سمت ابتدای آن حرکت میکنیم.
- پس از پایان حلقه، رشته معکوس شده را به خارج از تابع برمیگردانیم.

بررسی عضویت عدد در محدوده
در این مسئله محدوده خاصی از قبل مشخص شده است، برای مثال اعداد بین ۳ و ۹. سپس از کاربر خواسته شده تا تابعی بنویسد و عضویت اعداد داده شده را در این محدوده بررسی کند.

فرض کنیم که به این تابع عدد 5 را دادهایم. خروجی تابع باید به شکل 5 is in the range باشد. در کادر پایین، جواب سوال را نوشتهایم.
بعد از اجرای کدهای بالا، خروجی زیر تولید شده و در کنسول پایتون نمایش داده میشود.
5 is in the range
در فهرست پایین، کدهای جواب سوال را توضیح دادهایم.
- با کد def test_range(n): تابعی به نام test_range تعریف میکنیم. این تابع عدد n را دریافت میکند.
- عبارت شرطی if n in range(3, 9): بررسی میکند که آیا n در بازه 3 تا 8 قرار دارد یا نه.
- اگر n در این بازه باشد، پیام n is in the range چاپ میشود.
- در غیر این صورت، پیام The number is outside the given range. چاپ میشود.
چرا و چگونه پایتون را یاد بگیریم؟
یادگیری کار با پایتون، انتخاب مناسبی برای افراد علاقهمند به شغلهای برنامهنویسی است. از بین روشهای گوناگون برای یادگیری پایتون، استفاده از فیلمهای آموزشی، بهترین انتخاب ممکن است. وبسایت فرادرس یکی از تولیدکنندگان قدرتمند فیلمهای آموزش پایتون است. پایتون گزینه بسیار مناسبی است برای توسعه نرمافزارهای مدرن و پیچیده. سینتکس این زبان به زبان انسان نزدیک است. این مسئله، مراحل یادگیری و کار با آن را راحتتر کرده است. در ضمن با افزایش تسلط بر پایتون به مرور پروژههای این زبان، جذابتر و کاربردیتر نیز میشوند.

فرادرس سالهاست به شکل اختصاصی به تولید فیلمهای آموزشی در حوزههای مختلف میپردازد. بنابراین تخصص و تجربه بالایی در این زمینه دارد. این مسئله باعث شده است که فیلمهای بسیار متنوعی در حوزه برنامه نویسی با پایتون در فرادرس تولید شوند. اگر در ابتدای مسیر آموزش پایتون هستید، بهتر است که فیلم آموزش رایگان پایتون، برنامه نویسی سریع و آسان در ۱۴۰ دقیقه را از فرادرس مشاهده کنید. اما اگر مراحل آشنایی با پایتون را پشت سر گذاشتهاید پیشنهاد میکنیم که مسیر یادگیری خود را با مشاهده فیلمهای پیشرفتهتر ادامه دهید.
در پایین، چند مورد از فیلمهای آموزشی دیگر را معرفی کردهایم. این فیلمها برای آموزش سطوح پیشرفته پایتون مفید هستند.
شمارش حروف بزرگ و کوچک انگلیسی
اکنون باید تابعی بنویسیم که در ورودی رشته دریافت کند. سپس تمام کاراکترهای رشته را بررسی کرده و تعداد دقیق حروف بزرگ و کوچک انگلیسی آن را برگرداند. برای مثال فرض کنیم که رشته The quick Brown Fox را به تابع ارسال کردهایم. خروجی تابع باید به شکل زیر باشد.
No. of Upper case characters : 3 No. of Lower case Characters : 13
در کادر پایین برای این نمونه سوال تابع در پایتون، جوابی را نوشتهایم.
بعد از اجرای کدهای بالا، خروجی زیر تولید شده و در کنسول پایتون نمایش داده میشود.
Original String : The quick Brown Fox No. of Upper case characters : 3 No. of Lower case Characters : 13
در فهرست پایین روش کار کدهای جواب مسئله را نوشتهایم.
- با کد def string_test(s): تابعی ساخته شده است. این تابع به عنوان پارامتر ورودی فقط یک متغیر – s - دریافت میکند.
- در خط ۲ دیکشنری d را با دو کلید “UPPER_CASE” و “LOWER_CASE” ساختهایم. این کلیدهای برای شمارش حروف بزرگ و کوچک استفاده میشوند.
- با استفاده از حلقه for رشته s را کاراکتر به کاراکتر پیمایش میکنیم.
- اگر کاراکتری بزرگ باشد، مقدار “UPPER_CASE” یک واحد افزایش مییابد. برای بررسی این مسئله از متد .isupper() استفاده کردهایم.
- اگر کاراکتری کوچک باشد، مقدار “LOWER_CASE” یک واحد افزایش مییابد. برای بررسی این مسئله از متد .islower() استفاده کردهایم.
- در نهایت، عبارت اصلی همراه با با تعداد حروف بزرگ و کوچک آن نمایش داده میشود.

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

در کادر پایین جواب این سوال را نوشتهایم.
بعد از اجرای کدهای بالا، خروجی به شکل عبارت False در کنسول پایتون، نمایش داده میشود.
در فهرست پایین روش کار کدهای جواب مسئله را نوشتهایم.
- با کد def test_prime(n): تابعی ساختهایم. این تابع، پارامتر n را دریافت میکند.
- در خطهای ۲ تا ۳، بررسی میکنیم که آیا n برابر با 1 است. در این صورت، مقدار False برگردانده شود. چون 1 عدد اول نیست.
- در خطهای ۴ تا ۵ اگر n برابر 2 باشد، مقدار True برگردانده میشود. چون 2 عدد اول است.
- در غیر این صورت با استفاده از حلقه for تمام اعداد 2 تا n-1 را بررسی میکنیم.
- اگر n بر یکی از این اعداد بخشپذیر بود- باقیمانده نداشت – مقدار False برگردانده میشود، چون عدد اول نیست.
- اگر n بر هیچ عددی در این محدوده بخشپذیر نبود، مقدار True برگردانده میشود. زیرا n عدد اول است.

نمونه سوال تابع در پایتون برای بررسی کامل بودن عدد
در این مسئله از کاربر خواسته شده است که تابعی برای بررسی کامل بودن اعداد بنویسد. طبق نظریه اعداد، عدد کامل، عدد صحیح مثبتی است که با مجموع مقسومعلیههای خودش به غیر از خودش برابر باشد. برای مثال، اولین عدد کامل 6 است. زیرا 6 برابر است با مجموع 1 و 2 و 3. عدد کامل بعدی ۲۸ است. زیرا 28 برابر است با 1 + 2 + 4 + 7 + 14.
در کادر پایین، جواب این مسئله نوشته شده است.
بعد از اجرای کدهای بالا، خروجی زیر تولید شده و در کنسول پایتون نمایش داده میشود.
True
در فهرست پایین، روش کار کدهای جواب مسئله را نوشتهایم.
- در خط اول با کد def perfect_number(n): تابعی ساختهایم. این تابع فقط مقدار n را به عنوان پارامتر ورودی دریافت میکند.
- در خط ۲، متغیر sum را با مقدار اولیه صفر میسازیم. این متغیر مجموع مقسومعلیههای عدد n را نگهداری میکند.
- با استفاده از حلقه for اعداد را از 1 تا n-1 پیمایش میکنیم.
- اگر n بر عدد x بخشپذیر باشد، مقدار x به sum اضافه میشود.
- در پایان، نتیجه بررسی مقایسه مقدار متغیرهای sum و n را به بیرون برمیگردانیم.
ساخت لیستی از مربع اعداد ۱ تا ۲۰
در این نمونه سوال تابع در پایتون باید با لیستها کار کنیم. هدف این است که تابعی برای ساخت لیست با مقادیر مشخص بسازیم. این تابع هیچ پارامتر ورودی دریافت نمیکند. اما در خروجی باید لیستی از اعداد صحیح را برگرداند.

لیست خروجی شامل مربع تمام اعداد 1 تا 20 است.
بعد از اجرای کدهای بالا، خروجی زیر تولید شده و در کنسول پایتون نمایش داده میشود.
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400]
در فهرست پایین روش کار کدهای جواب مسئله را نوشتهایم.
- با کد def printValues(): تابعی به نام printValues ساخته شده است. این تابع، هیچ پارامتری دریافت نمیکند.
- در خط دوم لیست خالی به نام l ساختهایم. از این لیست برای ذخیره کردن مقدار مربع هر عدد استفاده میکنیم.
- با استفاده از حلقه for اعداد از 1 تا 20 پیمایش میشوند. برای پیمایش حلقه از شمارنده i استفاده میشود. بعد از هر با اجرای دستورات حلقه مقدار i، یک واحد زیاد میشود.
- در هر تکرار، مربع i محاسبه شده و به لیست l اضافه میشود.
- در پایان، لیست شامل مربع اعداد از 1 تا 20 است. در نهایت، تمام این اعداد با استفاده از print نمایش داده میشوند.

نمونه سوال تابع در پایتون، آرگومان پیشفرض
در این سوال، خواسته شده است که تابعی به نام show_employee() تعریف کنیم. این تابع باید مشخصات زیر را داشته باشد.
- تابع باید دو آرگومان را برای نام کارمند و مقدار حقوق به عنوان ورودی دریافت بکند.
- در انتها هم باید نام و حقوق را بر روی کنسول چاپ کند.
- در زمان فراخوانی تابع اگر هیچ مقداری به عنوان حقوق به آن ارسال نشده بود، خودش مقدار حقوق را برابر با 9000 در نظر بگیرد.
برای مثال، تابع را به شکلهای زیر فراخوانی میکنیم.
در این صورت، خروجی تابع باید به شکل پایین باشد.
Name: Ben salary: 12000 Name: Jessa salary: 9000
در کادر پایین، روش حل این مسئله را پیادهسازی کردهایم.
بعد از اجرای کدهای بالا، خروجی زیر تولید شده و در کنسول پایتون نمایش داده میشود.
Name: Ben salary: 12000 Name: Jessa salary: 9000
در فهرست پایین روش کار کدهای جواب مسئله را نوشتهایم.
- با کد def show_employee(name, salary=9000) تابعی ساخته شده است. این تابع دو پارامتر name و salary را دریافت میکند.
- پارامتر salary دارای مقدار پیشفرض 9000 است، بنابراین اگر هنگام فراخوانی هیچ مقداری به آن داده نشود، از مقدار پیشفرض استفاده میکند.
- داخل تابع، نام و حقوق کارمند با استفاده از print نمایش داده میشوند.
- در خطهای ۴ و ۵، تابع دو بار فراخوانی شده است.
استفاده از مقدار پیش فرض پارامتر، زمانی مناسب است که در زمان فراخوانی تابع، این مقدار ارسال نشود. در این صورت، تابع از مقدار پیشفرض استفاده میکند. برای تعیین مقدار پیشفرض برای پارامترها فقط کافی است که در زمان تعریف تابع با کمک عملگر = مقداری را به پارامتر مورد نظر تخصیص دهیم.
بازگرداندن چند مقدار از تابع
در این مثال از کاربر خواسته شده که تابعی به نام calculation() بنویسد. این تابع باید دو متغیر مختلف را در ورودی دریافت کند. سپس حاصل جمع و تفریق آنها را محاسبه کرده و در خروجی این دو مقدار را برگرداند.
بعد از اجرای کدهای بالا، خروجی به شکل تاپل (50, 30) در کنسول پایتون نمایش داده میشود.
در فهرست پایین روش کار کدهای جواب مسئله را نوشتهایم.
- با کد def calculation(a, b): تابعی ساختهایم. این تابع دو پارامتر a و b را دریافت میکند.
- در داخل تابع، متغیر addition مقدار a + b و متغیر subtraction مقدار a – b را ذخیره میکند.
- در خط ۴، تابع با استفاده از «return addition, subtraction» همزمان دو مقدار را برمیگرداند. این مقادیر به شکل تاپل ذخیره میشوند.
نکته: برای برگرداندن چند مقدار مختلف از تابع میتوانیم همه آنها را در مقابل return نوشته و با عملگر کاما , از همدیگر جدا کنیم. از دستور return در پایتون برای پایان دادن به اجرای دستورات تابع استفاده میشود. برای آشنایی بیشتر با این دستور، پیشنهاد میکنیم که مطلب مربوط به آن را در مجله فرادرس مطالعه کنید.

تخصیص نام جدید به تابع
در کادر پایین، تابع display_student(name, age) را تعریف کردهایم. باید برنامهای بنویسیم که نام جدید show_student(name, age) را به تابع اختصاص بدهد. سپس با استفاده از این نام دوباره تابع را فراخوانی کنیم.
برای مثال با استفاده از کد زیر هم باید بتوان این تابع را فراخوانی کرد.
جواب این سوال را در کادر پایین پیادهسازی کردهایم.
بعد از اجرای کدهای بالا، خروجی زیر تولید شده و در کنسول پایتون نمایش داده میشود.
Mostafa 37 Mostafa 37
در فهرست پایین، روش کار کدهای جواب مسئله را نوشتهایم.
- تابع display_student() دو پارامتر name و age را دریافت کرده و آنها را چاپ میکند.
- در خط ۵، تابع با نام اصلی خودش display_student() صدا زده شده است. بنابراین، عبارت “Mostafa”, 37 چاپ میشود.
- در خط ۸، خود تابع به متغیر دیگری به نام showـStudent تخصیص داده شده است. از این به بعد میتوانیم همان تابع را با نام showـStudent نیز فراخوانی کنیم.
- در فراخوانی دوم – خط ۱۰ – هم مقادیر “Mostafa”, 37 چاپ میشوند.
برای تخصیص دادن نام جدید به تابع میتوانیم از عملگر = استفاده کنیم. فقط کافی است که شیء تابع را مساوی با متغیر جدید بگذاریم. سپس با کمک این نام به راحتی میتوانیم تابع را فراخوانی کنیم.
اجرای رشتهی حاوی کد پایتون
بعضی از وقتها شاید بخواهیم بعضی از کدهای پایتون را به کامنت تبدیل کرده و در متغیری ذخیره کنیم. بعدا هم میتوانیم این کدهای ذخیره شده را اجرا کنیم. در این نمونه سوال تابع در پایتون، باید کدی برای اجرای این نوع از توابع بنویسیم.
فرض کنید تابع خاصی از برنامه به کامنت تبدیل شده است. اکنون میخواهیم کد جدید، این کامنتها را خوانده و تابع درون آنها را اجرا کند. در مثال پایین، کدهای پایتون را به دو روش مختلف به کامنت تبدیل کردهایم.
بعد از اجرای کدهای بالا، خروجی زیر تولید شده و در کنسول پایتون نمایش داده میشود.
hello world Multiply of 2 and 3 is: 6
در فهرست پایین روش کار کدهای جواب مسئله را نوشتهایم.
- با کد «mycode = ‘print(“hello world”)’» رشتهای ساخته شده است. این رشته، شامل کد پایتون برای چاپ عبارت “hello world” است.
- در خطهای ۵ تا ۹ هم متغیر code ساخته شده است. این متغیر شامل رشته چندخطی است. این رشته، ساختاری شبیه به تابع دارد.
- با استفاده از تابع exec(mycode) رشته mycode به عنوان کد پایتون اجرا میشود. در اثر اجرای این رشته، متن “hello world” چاپ میشود.
- با استفاده از تابع exec(code) رشته چندخطی code اجرا میشود. این رشته خودش شامل تابع multiply است.
نکته: برای اجرای کدهای کامنت شده در این برنامه از تابع exec() استفاده شده است.

شمارش تعداد متغیرهای محلی تابع
متغیر محلی به متغیری گفته میشود که در داخل بلوک خاصی از کدها مثل تابع تعریف شده باشد. در این سوال از کاربر خواسته شده است تعداد متغیر محلی موجود در تابع را شمرده و اعلام کند.
بعد از اجرای کدهای بالا، خروجی به شکل عدد 3 در کنسول پایتون نمایش داده میشود.
در فهرست پایین، روش کار کدهای جواب مسئله را نوشتهایم.
- در خط اول، با کد def abc(): تابعی ساخته شدهایم. این تابع هیچ پارامتری دریافت نمیکند.
- از خط ۲ تا ۴ در داخل تابع، سه متغیر محلی تعریف و مقداردهی شدهاند.
- در خط ۶، رشته “Python Exercises” با استفاده از تابع print نمایش داده میشود.
- در خط آخر، با کمک کد abc.__code__.co_nlocals تعداد متغیرهای محلی داخل تابع abc() را شمردهایم. نتیجه با استفاده از تابع print چاپ میشود.
در واقع مهمترین بخش برای حل این مسئله، عبارت abc.__code__.co_nlocals است. با کمک این عبارت میتوان تعداد متغیر محلی درون هر تابعی را بدست آورد.
تغییر مقدار متغیر سراسری در تابع
در این سوال خواسته شده است که متغیر سراسری به نام global_var تعریف کرده و مقدار 10 را به آن اختصاص بدهیم. سپس تابعی را بنویسیم که در داخل خودش مقدار این متغیر سراسری را تغییر میدهد.
بعد از اجرای کدهای بالا، خروجی زیر تولید شده و در کنسول پایتون نمایش داده میشود.
Inside function: 20 Outside function: 20
در فهرست پایین روش کار کدهای جواب مسئله را نوشتهایم.
- ابتدا متغیری سراسری به نام global_var را با مقدار 10 ساختهایم.
- سپس تابعی را به نام modify_global_var تعریف کردهایم.
- در داخل تابع از کلمه کلیدی global استفاده میکنیم. این کلمه کلیدی، بیان میکند که متغیر global_var از نوع سراسری است.
- در خط ۵ در داخل تابع مقدار global_var را تغییر داده و برابر 20 میگذاریم.
- سپس با کمک دستور print مقدار این متغیر را چاپ میکنیم.
- از آنجا که این متغیر، سراسری است. بعد از خروج از تابع هم مقدار آن 20 خواهد بود.
نکته: برای ساختن متغیر سراسری لازم نیست کار خاصی بکنیم. اما برای استفاده از آن در بلوکهای مختلف – مانند تعریف تابع – باید با کمک کلمه کلیدی global سراسری بودن آن را به مفسر پایتون اعلام کنیم. در غیر این صورت، پایتون متغیر محلی با همان نام میسازد.

ساخت تابع بازگشتی
در این مسئله از ما خواسته شده است که برنامهای برای محاسبه حاصل جمع اعداد 0 تا 10 بنویسیم. در متن سوال تاکید شده که حل این سوال باید با کمک تابع بازگشتی انجام شود.
نکته: تابع بازگشتی به تابعی گفته میشود که خودش را به صورت تکراری فراخوانی میکند.
بعد از اجرای کدهای بالا، خروجی زیر تولید شده و در کنسول پایتون نمایش داده میشود.
55
در فهرست پایین روش کار کدهای جواب مسئله را نوشتهایم.
- در خط اول با کد def addition(num): تابعی ساختهایم. این تابع جمع اعداد از 1 تا num را با استفاده از تکنیک بازگشتی محاسبه میکند.
- با کد if num: مقدار متغیر num را بررسی میکنیم.
- اگر این مقدار صفر نباشد، یعنی True باشد. همان تابع – این بار با num – 1 -دوباره فراخوانی میشود. سپس مقدار فعلی num به نتیجه اضافه میشود.
- اگرnum برابر صفر یا False بود، مقدار 0 برگردانده شده و بازگشت متوقف میشود.
- در خط ۸، با کد addition(10) مجموع اعداد 1 تا 10 محاسبه و در متغیر res ذخیره میشود.

تابع بازگشتی برای محاسبه فاکتوریل
در این مسئله از ما خواسته شده است که مقدار فاکتوریل اعداد را با کمک تابع بازگشتی محاسبه کنیم.
ابتدا روش حل مسئله را نوشتهایم. سپس کدهای آن را توضیح میدهیم.
بعد از اجرای کدهای بالا، خروجی زیر تولید شده و در کنسول پایتون نمایش داده میشود.
The factorial of 5 is 120
در فهرست پایین روش کار کدهای جواب مسئله را نوشتهایم.
- در خط اول تابعی به نام factorial_recursive() ساختهایم. این تابع پارامتر n را دریافت میکند.
- در داخل بدنه تابع، مقدار n را با ساختار شرطی if-elif-else بررسی میکنیم.
- در بلوک if اگر مقدار ورودی n منفی باشد، ادامه کار تابع با خطای ValueError متوقف میشود. زیرا فاکتوریل برای اعداد منفی تعریف نشده است.
- در بلوک elif برابری مقدار n را با صفر بررسی میکنیم. اگر شرط این بلوک درست بود، عدد 1 برگردانده میشود، چون فاکتوریل صفر برابر 1 است.
- در بلوک else متوجه شدهایم که n حتما بزرگتر از 0 است. بنابراین مقدار n را در نتیجه تابع «factorial_recursive(n-1)» ضرب میکنیم. این بلوک شرطی، همان مرحله بازگشتی است. انجام عملیات این بلوک تا رسیدن n به صفر ادامه پیدا میکند.
- در خطهای ۱۰ و ۱۱، مقدار 5 به عنوان پارامتر به تابع داده شده است. نتیجه کار تابع فاکتوریل در متغیر result ذخیره میشود.
- در پایان با کمک print نتیجه کار تابع را نمایش دادهایم. مقدار خروجی فاکتوریل برای عدد 5 برابر با 120 است.
تابعی با تعداد پارامتر نامحدود
با بررسی چند نمونه سوال تابع در پایتون به راحتی روشهای مختلف طراحی توابع را میآموزیم. اما باید نکاتی هم درباره پارامترهای ورودی به تابع یاد بگیریم. در این سوال از ما خواسته شده است که تابعی را تعریف کنیم که متغیرهای دریافتی آن نامحدود باشند. این تابع باید تمام پارامترهای دریافت شده را یک به یک در خروجی چاپ کند.

نکته: تعداد متغیر دریافت شده توسط تابع نامحدود است. پس دستورات مربوط به انجام پردازش باید بر روی تمام این متغیرها اعمال شود. در نهایت مقدار هر متغیر را به شکل مجزا در خروجی چاپ میکنیم.
برای مثال اگر تابع به صورت func1(20, 40, 60) یا func1(80, 100) فراخوانی شود، باید خروجی آن به شکلهای زیر باشد.
Printing values 20 40 60 Printing values 80 100
در بخش پایین راه حل این مسئله نوشته شده است.
بعد از اجرای کدهای بالا، خروجی زیر تولید شده و در کنسول پایتون نمایش داده میشود.
10 20 hello 3.14 True 1 2 3 4 5
در فهرست پایین روش کار کدهای جواب را نوشتهایم.
- با کد def func1(*args): تابعی ساخته شده که میتواند هر تعداد پارامتر ورودی دریافت کند.
- با استفاده از حلقه for، پارامترهای موجود در *args یکییکی پیمایش شده و با دستور print نمایش داده میشوند.
- از خط ۶ به بعد هم تابع با چند داده مختلف، فراخوانی شده است.
نکته: برای اینکه تابعی بتواند تعداد نامحدودی متغیر دریافت کند باید از عبارت *args به عنوان پارامتر استفاده کنیم. این عبارت از دو بخش * و args تشکیل شده است. وجود ستاره در آن اجباری است. وجود args هم همینطور اما میتوان بهجای args از هر کلمه دیگری استفاده کرد. تمام پارامترهای ارسال شده به تابع تا زمان استفاده در ساختاری به شکل تاپل قرار میگیرند.
ساخت تابع با استفاده از kwargs**
در این نمونه سوال تابع در پایتون از ما خواسته شده است تابعی بسازیم که بتواند بدون محدودیت «آرگومان کلمه کلیدی» (Keyword Argument) دریافت کند. آرگومان کلمه کلیدی به معنای آن است که نام آرگومان را همراه با مقدار آن مشخص کنیم. برای مثال، ورودیهای دلخواه name=”Alice” و age=30 آرگومان کلمه کیدی یا **kwargs هستند. در داخل تابع باید به این مقادیر دسترسی داشته باشیم. زیرا میخواهیم آنها را مانند جفتهای کلید-مقدار در خروجی چاپ کنیم.
بعد از اجرای کدهای بالا، خروجی زیر تولید شده و در کنسول پایتون نمایش داده میشود.
--- Information --- name: Alice age: 30 city: New York --- Information --- job: Engineer salary: 75000 --- Information --- country: USA state: California zip_code: 90210
در فهرست پایین روش کار کدهای جواب مسئله را نوشتهایم.
- تابع print_info() را با آرگومان **kwargs تعریف کردهایم. این تابع میتواند تعداد نامحدودی آرگومان کلید-مقدار را دریافت کند.
- درون تابع – در خط ۲ – آرگومانها را بررسی میکنیم. اگر آرگومان وجود داشت، متن — Information — چاپ میشود. سپس با کمک حلقه for همه جفتهای کلید و مقدار نمایش داده میشوند.
- اگر هیچ آرگومانی داده نشده بود – خط ۶ و ۷ – متن No information provided. چاپ میشود.
- سپس با استفاده از سه مثال مختلف و دادن پارامترهای متفاوت عملکرد تابع را بررسی کردهایم.

**kwargs از نوع دیکشنری است. بنابراین با کمک حلقه for میتوانیم بر روی کلیدها و مقدارهای kwargs.items() پیمایش کنیم. به سینتکس شمارنده، حلقه for توجه کنید. با پیمایش درست بر روی دیکشنری میتوانیم تمام کلیدها و مقدارهای درون **kwargs را مشاهده کنیم. در پایان برنامه هم برای آزمایش، تابع را چند بار با جفتهای کلید و مقدار مختلف فراخوانی کردهایم.
استفاده از تابع lambda برای محاسبه مربع اعداد
در این نمونه سوال تابع در پایتون، با نوع خاصی از توابع کار میکنیم. با کمک تابع lambda میخواهیم مربع عدد داده شده را محاسبه کنیم. تابع lambda نوعی تابع کوچک و بدون نام در پایتون است. برای تعریف کردن این نوع از توابع از کلمه کلیدی lambda استفاده میکنیم. سینتکس تعریف این تابع به شکل lambda arguments: expression نوشته میشود. کلمه کلیدی lambda در این سینتکس ثابت است. arguments مقدار ورودی تابع را نشان میدهد. expression دستوری است که باید بر روی مقدار ورودی تابع انجام شده و نتیجهاش را به بیرون برگردانیم.
بعد از اجرای کدهای بالا، خروجی زیر تولید شده و در کنسول پایتون نمایش داده میشود.
The square of 5 is 25
در فهرست پایین، روش کار کدهای جواب مسئله را نوشتهایم.
- با کد square = lambda x: x**2 یک تابع بینام از نوع lambda ساختهایم. ورودی این تابع عدد x است. خروجی آن نیز توان دوم یا مربع عدد x است.
- سپس به عنوان مثال، عدد 5 به این تابع داده میشود.
- نتیجه کار تابع در متغیر squared_number ذخیره میشود.
- در پایان با دستور print نتیجه چاپ میشود.
استفاده از lambda با تابع filter
در این نمونه سوال تابع در پایتون، از کاربر خواسته میشود تا با یکی از روشهای پیشرفته، مسئلهای را حل کند. برای حل این مسئله باید از ترکیب تابع lambda و تابع filter() استفاده کنیم. سوال این است که تابع lambda لیستی را به عنوان ورودی تحویل بگیرد و به عنوان جواب، لیستی از تمام اعداد زوج داخل لیست اصلی تشکیل بدهد. برای مثال، فرض کنیم لیست زیر به تابع داده شده است.
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
پاسخ تابع باید به شکل زیر باشد.
The even numbers in the list are: [2, 4, 6, 8, 10]
نکته: باید بدانیم که تابع filter() ۲ آرگومان دریافت میکند، یکی از جنس تابع و یکی از نوع اشیاء پیمایشپذیر. filter()، تابع دریافت شده را بر روی تمام عناصر موجود در شیء پیمایشپذیر اجرا میکند. در خروجی هم شیء پیمایشپذیری برمیگرداند. شیء خروجی شامل تمام عناصری است که نتیجه اجرای تابع بر روی آنها True شده است.

به عنوان آرگومان اول از تابع lambda استفاده میکنیم. در این صورت، میتوانیم شرط مربوط به فیلتر کردن دادهها را به صورت مختصر و خلاصه بنویسیم.
بعد از اجرای کدهای بالا، خروجی زیر در کنسول پایتون نمایش داده میشود.
The even numbers in the list are: [2, 4, 6, 8, 10]
در فهرست پایین روش کار کدهای جواب مسئله را نوشتهایم.
- ابتدا لیستی به نام numbers ساختیم. این لیست شامل اعداد 1 تا 10 است.
- سپس با استفاده از filter() و تابع lambda بررسی میکنیم که کدام اعداد بر 2 بخشپذیر هستند.
- تابع lambda x: x % 2 == 0 بررسی میکند که آیا باقیمانده تقسیم x بر 2 صفر است یا نه. اگر صفر بود، یعنی عدد زوج است.
- خروجی filter() با کمک تابع list() به لیست تبدیل شده و در متغیر even_numbers ذخیره میشود.
- در پایان با دستور print، همه اعداد موجود در لیست even_numbers نمایش داده میشوند.
فیلم های پروژه محور فرادرس برای یادگیری پایتون
مجموعه آموزشی با نام «مجموعه آموزش پروژه محور برنامه نویسی پایتون» در فرادرس تولید شده است. در این مجموعه آموزش، روش پیادهسازی پروژههای واقعی و گوناگون آموزش داده میشود. فیلمهای پروژه محور فرادرس از موضوعات ساده تا پیشرفته را پوشش میدهند. در هر کدام از فیلمهای آموزشی، تکنولوژیها و کتابخانههای مختلفی به کار برده شدهاند. بعضی از آنها با استفاده از تکنولوژی شیءگرایی پیادهسازی شدهاند و بعضی دیگر با API-های پایتون کار میکنند. با مرور این آموزشها میتوانید مهارتهای خود را به مقدار چشمگیری افزایش بدهید.
در پایین، چند فیلم آموزشی پروژهمحور زبان پایتون را معرفی کردهایم.
در صورت تمایل با کلیک بر روی تصویر زیر به صفحه اصلی این مجموعه آموزشی هدایت شده و از فیلمهای پروژهمحور بیشتری دیدن کنید.

استفاده از lambda با تابع map
در این سوال میخواهیم تمام عناصر ذخیره شده در لیست را با کمک دستورات lambda و تابع map دو برابر بکنیم. برای مثال، فرض کنیم لیست پایین به برنامه داده شده است.
numbers = [1, 2, 3, 4, 5]
خروجی برنامه باید به شکل زیر باشد.
The doubled numbers are: [2, 4, 6, 8, 10]
نکته: تابع map() ۲ آرگومان دریافت میکند. آرگومان اول از جنس تابع است و دومی از نوع اشیاء پیمایشپذیری مانند لیستها. map()، پارامتر تابع را بر روی تمام عناصر موجود در شیء پیمایشپذیر اجرا میکند. سپس در خروجی هم شیء پیمایشپذیر برمیگرداند. عناصر این شیء، اعضایی از آرگومان دوم تابع map() هستند که نتیجه اجرای آرگومان اول بر روی آنها True بوده است. برای تعریف عملیات مورد نظر در تابع map() میتوانیم از دستورهای lambda استفاده کنیم.
بعد از اجرای کدهای بالا، خروجی زیر تولید شده و در کنسول پایتون نمایش داده میشود.
The doubled numbers are: [2, 4, 6, 8, 10]
در فهرست پایین روش کار کدهای جواب مسئله را نوشتهایم.
- ابتدا لیستی به نام numbers ساختهایم. این لیست، شامل اعداد 1 تا 5 است.
- سپس با استفاده از تابع map() و دستور lambda هر عدد لیست را ضرب در 2 کردیم.
- تابع lambda x: x * 2 برای هر عدد، به صورت جداگانه اجرا میشود.
- خروجی map() را با کمک تابع list() به لیست تبدیل کرده و در متغیر doubled_numbers ذخیره میکنیم.
- در پایان با دستور print، مقدار تمام عناصر دو برابر شده لیست اصلی، نمایش داده میشوند.
استفاده از lambda با تابع sorted
در این نمونه سوال تابع در پایتون، مسئله پیچیدهتری را مطرح کردهایم. در این مسئله باید از دستورات lambda و تابع sorted() برای مرتبسازی عناصر لیست استفاده کنیم. در سوال گفته شده که تمام عناصر این لیست از جنس تاپل هستند. همچنین مرتبسازی باید بر اساس دومین عنصر در تاپل انجام شود.
برای مثال، فرض کنیم که لیست زیر به برنامه داده شده است.
data = [('apple', 5), ('banana', 2), ('cherry', 8), ('date', 1)]
خروجی برنامه باید به شکل زیر باشد.
The sorted list of tuples based on the second element is: [('date', 1), ('banana', 2), ('apple', 5), ('cherry', 8)]
نکته: تابع sorted() میتواند آرگومانی با نام key را به عنوان ورودی، دریافت کند. این آرگومان، باید از نوع تابع باشد. تابع مورد نظر، قبل از انجام مقایسه بر روی تمام عناصر اعمال میشود. برای تعریف این تابع میتوانیم از دستورات lambda استفاده کنیم.

در متن سوال گفته شده است که مرتبسازی دادهها باید بر اساس عناصر با اندیس 1 – عنصر دوم – در هر تاپل انجام شود. این دستور را با کمک lambda مشخص میکنیم.
بعد از اجرای کدهای بالا، خروجی زیر تولید شده و در کنسول پایتون نمایش داده میشود.
The sorted list of tuples based on the second element is: [('date', 1), ('banana', 2), ('apple', 5), ('cherry', 8)]
در فهرست پایین روش کار کدهای جواب مسئله را نوشتهایم.
- ابتدا لیستی به نام data ساختهایم. این لیست، شامل چند تاپل مختلف است. عنصر اول هر تاپل نام میوه و عنصر دوم آنها عدد صحیح است.
- در خط ۲، با استفاده از تابع sorted() این لیست را بر اساس عنصر دوم – عنصر با اندیس 1 - در هر تاپل مرتب کردیم.
- کلید مرتبسازی با کد «key=lambda item: item[1]» مشخص شده است. این کد، یعنی آن که مرتبسازی باید بر اساس دومین عنصر تاپلها انجام شود.
- خروجی تابع sorted() در متغیر sorted_data ذخیره میشود.
- در پایان با دستور print()، لیست sorted_data نمایش داده میشود
ساخت تابع مرتبه بالاتر
در این سوال از ما خواسته شده است که تابعی به نام apply_operation() تعریف کنیم. این تابع باید سه پارامتر ورودی دریافت کند. پارامتر اول با نام دلخواه func خودش تابع است. پارامترهای x و y هم آرگومانهای معمولی هستند. خروجی تابع apply_operation(func, x, y) باید نتیجه اجرا یا فراخوانی تابع func(x, y) باشد. در آخر هم باید کارکرد apply_operation(func, x, y) را با استفاده از توابع گوناگونی مانند جمع و تفریق و غیره نشان دهیم.
به عبارت سادهتر در این تمرین از ما خواسته شده است تا تابع مرتبه بالاتر ایجاد کنیم. تابع مرتبه بالاتر، تابعی است که به عنوان پارامتر ورودی از توابع دیگر استفاده میکند.
نکته: تابع apply_operation() به عنوان پارامتر اول تابع func را دریافت میکند. سپس این تابع را با اعداد x و y - به عنوان پارامتر – فراخوانی میکند. برای تعریف این تابع میتوانیم از هر تابع دیگری استفاده کنیم. حتی امکان استفاده از توابع تعریف شده توسط کاربر هم وجود دارد. فرقی نمیکند که این توابع با کلمه کلیدی def تعریف شدهاند یا از نوع دستورات lambda هستند.
بعد از اجرای کدهای بالا، خروجی زیر تولید شده و در کنسول پایتون نمایش داده میشود.
Result of addition: 8 Result of subtraction: 6 Result of multiplication: 12
در فهرست پایین روش کار کدهای جواب مسئله را نوشتهایم.
- ابتدا تابعی به نام apply_operation() تعریف کردهایم. apply_operation() به عنوان پارامتر ورودی یک تابع و دو عدد دریافت میکند.
- در خط ۱۳، با استفاده از کد return func(x, y) در خروجی، تابع func() را بر روی پارامترهای دیگر اجرا کرده و نتیجه را برمیگرداند.
- سپس تابع معمولی به نام add میسازیم. این تابع در خروجی حاصل جمع دو عدد را برمیگرداند.
- در خطهای ۱۹ و ۲۰، تابع add به apply_operation() داده شده و نتیجه جمع 3 و 5 برابر با 8 چاپ میشود.
- بعد از آن در خط ۲۳، تابع لامبدایی به نام subtract تعریف میکنیم. این تابع هم حاصل تفریق دو عدد را برمیگرداند.
- از خط ۲۳ تا ۲۵، تابع subtract به apply_operation() داده شده است. سپس نتیجه تفریق 10 و 4 را محاسبه میکند. در نتیجه عدد 6 در خروجی، چاپ میشود.
- در مرحله بعد هم تابع لامبدا دیگری به نام multiply ساختهایم. این تابع هم دو عدد را در یکدیگر ضرب کرده و نتیجه را برمیگرداند.
- تابع multiply نیز به apply_operation() داده شده و نتیجه ضرب 2 و 6 برابر 12 چاپ میشود.

جمعبندی
در این مطلب از مجله فرادرس، به بررسی نمونه سوالهای تابع در پایتون پرداختهایم. در تمام مسائل با ارائه کد، خروجی و توضیحات گامبهگام، روش حل آنها را توضیح دادیم. توابع به عنوان بلوکهای ماژولار برنامه هستند. وجود این بلوکها قابلیت استفاده مجدد و سازماندهای بهتر کدها را فراهم میکنند. برای تعریف تابع از کلمه کلیدی def استفاده میشود. در بخشهای ابتدایی مطلب، مثالهایی مانند یافتن بزرگترین مورد بین سه عدد، جمع عناصر لیست، معکوس کردن رشته و بررسی عضویت در محدوده مطرح شدهاند. در این مثالها از ساختارهای شرطی و حلقه در تابع کمک گرفتهایم.
سپس به بررسی موضوعات متوسطی مانند شمارش حروف بزرگ و کوچک، بررسی اعداد اول و کامل، و ساخت لیستی از توان دوم عناصر پرداختیم. در سطوح پیشرفتهتر، اجرای کدهای رشتهای، شمارش متغیرهای محلی، توابع بازگشتی برای فاکتوریل و کاربرد lambda با filter() و map() و sorted() توضیح داده شدهاند. در نهایت هم با کمک مثالی روش تعریف توابع مرتبه بالاتر را بررسی کردیم. این توابع نشاندهنده انعطافپذیری پایتون در مدیریت عملیات پیچیده هستند.
source