|
| 1 | +.. role:: emoji-size |
| 2 | + |
| 3 | +.. meta:: |
| 4 | + :description: کتاب آنلاین و آزاد آموزش زبان برنامهنویسی پایتون به فارسی - درس دوازدهم تابع |
| 5 | + :keywords: آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون, انواع شی, انواع داده, پایتون |
| 6 | + |
| 7 | + |
| 8 | +درس ۱۲: تابع |
| 9 | +============ |
| 10 | + |
| 11 | + |
| 12 | + |
| 13 | + |
| 14 | + |
| 15 | + |
| 16 | + |
| 17 | + |
| 18 | +:emoji-size:`✔` سطح: متوسط |
| 19 | + |
| 20 | +---- |
| 21 | + |
| 22 | + |
| 23 | +.. contents:: سرفصلها |
| 24 | + :depth: 2 |
| 25 | + |
| 26 | +---- |
| 27 | + |
| 28 | + |
| 29 | + |
| 30 | +مقدمه |
| 31 | +------ |
| 32 | + |
| 33 | +**تابع (Function)** به بلاکی از دستورات گفته میشود که برای به اجرا درآمدن نیازمند فراخوانی هستند و این فراخوانی میتواند بیش از یک بار در برنامه انجام گیرد. تابع میتواند به هنگام فراخوانی مقادیری را دریافت کند و در صورت لزوم مقداری نیز به عنوان نتیجه برگرداند. |
| 34 | + |
| 35 | +تابع جایگزینی برای بخشهای تکراری برنامه است که با یک بار نوشتن و چندین بار فراخوانی و اجرای آن میتوان از پیچیدگی برنامه جلوگیری و تغییر در آن را آسان نمود. استفاده از توابع باعث بالابردن قابلیت استفاده مجدد از کدها میشود و افزونگی را نیز کاهش میدهد. توابع ابزاری برای خرد کردن منطق برنامه به واحدهای اجرایی کوچکتر برای تسهیل ساخت برنامههای بزرگ است. |
| 36 | + |
| 37 | +سینتکس تابع در زبان برنامهنویسی پایتون همانند هر دستور مرکب دیگری شامل یک سرآیند و یک بدنه است - درس ششم. بخش سرآیند شامل کلمه کلیدی ``def``، یک نام به دلخواه کاربر و پرانتز میباشد که این پرانتز محل قرار گرفتن پارامترهای تابع را نمایش میدهد. هر تابع میتواند هیچ، یک یا چند پارامتر بپذیرد:: |
| 38 | + |
| 39 | + def function_name(param1, param2,... paramN): |
| 40 | + statements |
| 41 | + |
| 42 | +همانطور که بارها گفته شد، هر چیزی در پایتون شی است، هنگامی که اجرای برنامه به کلمه کلیدی ``def`` میرسد، ابتدا یک شی تابع ایجاد و سپس از نام تابع (در اینجا: function_name) به آن ارجاع داده میشود:: |
| 43 | + |
| 44 | + >>> def func_name(): |
| 45 | + ... pass |
| 46 | + ... |
| 47 | + >>> |
| 48 | + >>> type(func_name) |
| 49 | + <class 'function'> |
| 50 | + |
| 51 | +.. tip:: |
| 52 | + پیشنهاد `PEP 8 <http://www.python.org/dev/peps/pep-0008>`__: نام تابع از حروف کوچک تشکیل شود که کلمههای آن با استفاده از خط زیرین (Underscores) از یکدیگر جدا شده باشند. مانند: my_function . حالت ``mixedCase`` مانند: myFunction نیز صحیح میباشد به شرط آنکه در سراسر کدها نام توابع با همین الگو نوشته شود. |
| 53 | + |
| 54 | +بدنه تا زمانی که تابع فراخوانی نگردد، اجرا نمیشود. برای فراخوانی تابع از نام تابع + پرانتز استفاده میشود و در صورتی که در تعریف تابع پارامترهایی قرار داده شده باشد، میبایست هنگام فراخوانی آرگومانهای متناسب با این پارامترها نیز ارسال گردند:: |
| 55 | + |
| 56 | + function_name(arg1, arg2,... argN) |
| 57 | + |
| 58 | + |
| 59 | +.. caution:: |
| 60 | + در بحث توابع، به متغیرهایی که در سرآیند تابع تعریف میشوند پارامتر (Parameter) و به دادههایی که هنگام فراخوانی تابع ارسال میگردد آرگومان (Argument) گفته میشود. به ازای هر آرگومان ارسالی میبایست یک پارامتر در تابع جهت دریافت آن تعریف شده باشد. هیچ الزامی به هم نام بودن آرگومانها و پارامترهای نظیر وجود ندارد ولی وجود هم نامی باعث خوانایی بیشتر کد میشود. |
| 61 | + |
| 62 | + |
| 63 | + |
| 64 | +بدنه تابع می تواند حاوی کلمه کلیدی ``return`` نیز باشد. در واقع ``return`` دستوری است که در هر جایی از بدنه آورده شود، اجرای تابع در آن نقطه متوقف و مقداری (البته در زبان پایتون درست این است که گفته شود: شیایی) را به عنوان نتیجه به محل فراخوانی تابع بازمیگرداند:: |
| 65 | + |
| 66 | + def function_name(param1, param2,... paramN): |
| 67 | + ... |
| 68 | + return value |
| 69 | + |
| 70 | +در نمونه کد بالا value مقداری است که توسط ``return`` به محل فراخوانی بازگردانده میشود. value میتواند صراحتا یک مقدار نباشد بلکه یک عبارت مانند : ``param1**2`` یا ``param1 > 3`` و... باشد که در این صورت ابتدا حاصل عبارت ارزیابی و سپس بازگردانده میشود. چنانچه value ذکر نگردد، ``None`` بازگردانده میشود:: |
| 71 | + |
| 72 | + >>> def my_pow(x, y): |
| 73 | + ... return x**y |
| 74 | + ... |
| 75 | + >>> |
| 76 | + >>> a = 2 |
| 77 | + >>> b = 3 |
| 78 | + >>> |
| 79 | + >>> my_pow(a, b) |
| 80 | + 8 |
| 81 | + >>> |
| 82 | + |
| 83 | +در زبان برنامه نویسی پایتون تابع یک موجودیت **”first-class“** است که یعنی تابع را میتوان مانند دیگر اشیا به صورت پویا ایجاد یا نابود کرد، به صورت آرگومان به توابع دیگر ارسال نمود، به عنوان نتیجه توسط ``return`` بازگرداند و... در نتیجه میتوان یک تابع را درون بدنه دستورات کنترلی (``while`` ،``if`` و...) یا درون بدنه تابعی دیگر تعریف نمود:: |
| 84 | + |
| 85 | + >>> def outer(num1): |
| 86 | + ... def inner_increment(num1): # hidden from outer code |
| 87 | + ... return num1 + 1 |
| 88 | + ... num2 = inner_increment(num1) |
| 89 | + ... print(num1, num2) |
| 90 | + ... |
| 91 | + >>> |
| 92 | + >>> outer(1) |
| 93 | + 1 2 |
| 94 | + |
| 95 | + |
| 96 | +خیلی خوب است که با استفاده از ”Docstring“ در توابع به مستندسازی و خوانایی بهتر برنامه کمک کنیم - درس ششم:: |
| 97 | + |
| 98 | + |
| 99 | + def function_with_docstring(param1, param2): |
| 100 | + """Example function with types documented in the docstring. |
| 101 | + |
| 102 | + Args: |
| 103 | + param1 (int): The first parameter. |
| 104 | + param2 (str): The second parameter. |
| 105 | + |
| 106 | + Returns: |
| 107 | + bool: The return value. True for success, False otherwise. |
| 108 | + """ |
| 109 | + |
| 110 | + |
| 111 | +فضاهای نام |
| 112 | +----------- |
| 113 | +در هر برنامه پایتون تعداد زیادی نام وجود دارد که برای نمونه میتوان به: متغیرها که پیشتر اشاره شد و میدانیم، متغیرها نامهایی هستند که به اشیا (از انواع مختلف) ارجاع دارند، نام توابع که به اشیایی از نوع تابع ارجاع دارند، نام کلاسها که به اشیایی از نوع کلاس ارجاع دارند و... اشاره کرد. بدیهی است که برای شناسایی اشیا لازم است نامها منحصر به فرد باشند، رعایت چنین امری در یک برنامه حتی کوچک کار سختی است. در زبان پایتون برای دستهبندی و جلوگیری از تداخل نامها ساختاری با عنوان «**فضاهای نام**» (Namespaces) در نظر گرفته شده است؛ هر فضا نام بخشی از نامهای درون برنامه را دربر میگیرد. فضاهای نام متفاوت نسبت به یکدیگر ایزوله هستند؛ بنابراین در فضاهای نام متفاوت میتوان از نامهای یکسان استفاده کرد. به صورت کلی فضاهای نام پایتون در سه سطح تو در توی «محلی» (Local)، «سراسری» (Global) و Built-in به تصویر کشیده میشوند: |
| 114 | + |
| 115 | +.. image:: /_static/nested-namespaces-python.jpg |
| 116 | + :align: center |
| 117 | + |
| 118 | +هر ماژول پایتون فضانام سراسری خود را دارد. فضانام تمام ماژولها درون فضانام بزرگتری ایجاد میگردد که به عنوان فضانام Built-in شناخته میشود و نام تمامی توابع آماده مانند ``()open`` که پیش از این استفاده می کردیم در این فضا قرار گرفته است. به همین دلیل است که بدون نیاز به import ماژول خاصی در هر جای برنامه به توابع آماده (Built-in) دسترسی داریم ولی برای استفاده از توابع داخل هر ماژول میبایست ابتدا آن ماژول را import کرده تا توسط فضا نام ماژول مربوطه به نامهای درون آن دسترسی پیدا کنیم. |
| 119 | + |
| 120 | +هر ماژول میتواند شامل تعدادی تابع و کلاس باشد. با فراخوانی هر تابع یک فضانام محلی داخل فضانام ماژول آن ایجاد میگردد و با پایان اجرا نیز از بین میرود، در مورد کلاسها هم اتفاق مشابهی رخ میدهد. |
| 121 | + |
| 122 | + |
| 123 | + |
| 124 | + |
| 125 | + |
| 126 | +ارسال آرگومان |
| 127 | +-------------- |
| 128 | + |
| 129 | + |
| 130 | + |
| 131 | + |
| 132 | + |
| 133 | + |
| 134 | + |
| 135 | +| |
| 136 | +
|
| 137 | +---- |
| 138 | + |
| 139 | +:emoji-size:`😊` امیدوارم مفید بوده باشه |
| 140 | + |
| 141 | +`لطفا دیدگاه و سوالهای مرتبط با این درس خود را در کدرز مطرح نمایید. <http://coderz.ir/python-tutorial-function/>`_ |
| 142 | + |
| 143 | + |
0 commit comments