رفتن به مطلب



iran rules jazbe modir
ADS mahak

Doctor Robot

Programming-Py آموزش 0 تا 100 پایتون

پست های پیشنهاد شده

تابع

توابع به شما اجازه میدهند که یک رفتار یا وظیفه را تعریف کنید و مجموعهای از کدها هستند که در هر جای برنامه میتوان از آنها استفاده کرد. توابع دارای آرگومانهایی هستند که وظیفه تابع را مشخص میکنند. تابع در داخل کلاس تعریف میشود. میتوان یک تابع را در داخل تابع دیگر تعریف کرد. وقتی که شما در برنامه یک تابع را صدا میزنید برنامه به قسمت تعریف تابع رفته و کدهای آن را اجرا میکند.

پارامترها همان چیزهایی هستند که تابع منتظر دریافت آنها است.
آرگومانها مقادیری هستند که به پارامترها ارسال میشوند.

گاهی اوقات دو کلمه پارامتر و آرگومان به یک منظور به کار میروند. سادهترین ساختار یک تابع به صورت زیر است :

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

به برنامه ساده زیر توجه کنید. در این برنامه از یک تابع برای چاپ یک پیغام در صفحه نمایش استفاده شده است :

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

خروجی کد:

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

در خطوط 2-1 2 یک تابع تعریف کردهایم. در تعریف تابع بالا کلمه کلیدی defآمده است که نشان دهنده تعریف تابع است. نام تابع ما PrintMessage() است. به این نکته توجه کنید که در نامگذاری تابع از روش پاسکال (حرف اول هر کلمه بزرگ نوشته میشود) استفاده کردهایم. این روش نامگذاری قراردادی است و میتوان از این روش استفاده نکرد، اما پیشنهاد میشود که از این روش برای تشخیص توابع استفاده کنید. بهتر است در نامگذاری توابع از کلماتی استفاده شود که کار آن تابع را مشخص میکند مثلا ا نامهایی مانند GOTOBED یا OPENDOOR دو پرانتزی که بعد از نام میآید نشان دهنده آن است که نام متعلق به یک تابع است. در این مثال در داخل پرانتزها هیچ . چیزی نوشته نشده چون پارامتری ندارد. در درسهای آینده در مورد توابع بیشتر توضیح میدهیم.بعد از پرانتزها علامت: قرار میدهیم و کدهایی را که میخواهیم اجرا شوند را به صورت تو رفتگی بعد از علامت: و در خط زیر مینویسیم.در خط 4 تابع PrintMessage() را صدا میزنیم. برای صدا زدن یک تابع کافیست نام آن را نوشته و بعد از نام پرانتزها را قرار دهیم.

به این نکته توجه کنید که برای اجرای کدهای تابع، هنگام فراخوانی تابع، حتم ا ا باید بعد از نام تابع، علامتهای پرانتز را هم قرار دهید.

اگر تابع دارای پارامتر باشد باید شما آرگومانها را به ترتیب در داخل پرانتزها قرار دهید. در این مورد نیز در درسهای آینده توضیح بیشتری میدهیم. با صدا زدن یک تابع کدهای داخل بدنه آن اجرا میشوند. برای اجرای تابع PrintMessage() برنامه به محل تعریف تابعPrintMessage() می رود. مثلا ا وقتی ما تابع PrintMessage() را در خط 4 صدا میزنیم برنامه از خط 4 به خط 1 یعنی جایی که تابع تعریف شده میرود و کدهای بدنه آن را اجرا میکند.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

telegram channel   jazbe modir

مقدار برگشتی از یک تابع


توابع میتوانند مقدار برگشتی از هر نوع دادهای داشته باشند. این مقادیر میتوانند در محاسبات یا به دست آوردن یک داده مورد استفاده قرار بگیرند. در زندگی روزمره فرض کنید که کارمند شما یک تابع است و شما او را صدا میزنید و از او میخواهید که کار یک سند را به پایان برساند. سپس از او میخواهید که بعد از اتمام کارش سند را به شما تحویل دهد. سند همان مقدار برگشتی تابع است. نکته مهم در مورد یک تابع، مقدار برگشتی و نحوه استفاده شما از آن است. برگشت یک مقدار از یک تابع آسان است. کافیست در تعریف تابع به روش زیر عمل کنید :

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

در داخل بدنه تابع کلمه کلیدی return و بعد از آن یک مقدار یا عبارتی که نتیجه آن یک مقدار است را مینویسیم. مثال زیر یک تابع که دارای مقدار برگشتی است را نشان میدهد.

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

همانطور که مشاهده میکنید، در خطوط 6-1 یک تابع تعریف کردهایم. در خطوط 2 و 3 دو متغیر تعریف و مقدار دهی شدهاند. توجه کنید که این متغیرها، متغیرهای محلی هستند. و این بدان معنی است که این متغیرها در سایر توابع، قابل دسترسی نیستند و فقط در تابعی که در آن تعریف شدهاند قابل استفاده هستند. در خط 4 جمع دو متغیر در متغیر SUM قرار میگیرد. در خط 6 مقدار برگشتی SUM دستور return فراخوانی میشود.در خط 8 یک متغیر به نام  result  تعریف کرده و تابع CalculateSum() را فراخوانی میکنیم. ذخیره میشود.تابع CalculateSum() مقدار 15 را بر میگرداند که در داخل متغیر result ذخیره میشود در خط 10 مقدار ذخیره شده در متغیر result چاپ میشود. تابعی که در این مثال ذکر شد تابع کاربردی و مفیدی نیست. با وجودیکه کدهای زیادی در تابع بالا نوشته شده resultولی همیشه مقدار برگشتی 15 است، در حالیکه میتوانستیم به راحتی یک متغیر تعریف کرده و مقدار 15 را به آن اختصاص دهیم. این تابع در صورتی کارآمد است که پارامترهایی به آن اضافه شود که در درسهای آینده توضیح خواهیم داد. هنگامی که میخواهیم در داخل یک تابع از دستور if استفاده کنیم باید تمام کدها دارای مقدار برگشتی باشند. برای درک بهتر این مطلب به مثال زیر توجه کنید :

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

خروجی کد:

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

در خطوط 6-1 یک تابع به نام GetNumber() تعریف شده است که از کاربر یک عدد بزرگتر از 22 را میخواهد. اگر عدد وارد شده توسط کاربر درست نباشد تابع مقدار صفر را بر میگرداند. و اگر قسمت else دستور if و یا دستور return را از آن حذف کنیم در هنگام اجرای برنامه با پیغام خطا مواجه میشویم. چون اگر شرط دستور if نادرست باشد (کاربر مقداری کمتر از 22 را وارد کند) برنامه به قسمت else میرود تا مقدار صفر را بر گرداند و چون قسمت else حذف شده است برنامه با خطا مواجه میشود و همچنین اگر دستور return حذف شود چون برنامه نیاز به مقدار برگشتی دارد پیغام خطا میدهد. و آخرین مطلبی که در این درس میخواهیم به شما آموزش دهیم این است که شما میتوانید از یک تابع که مقدار برگشتی ندارد خارج شوید. استفاده از return باعث خروج از بدنه تابع و اجرای کدهای بعد از آن میشود:

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

خروجی 

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

در برنامه بالا نحوه خروج از تابع با استفاده از کلمه کلیدی return و نادیده گرفتن همه کدهای بعد از این کلمه کلیدی نشان داده شده است. در کد بالا انتظار ما این است که با فراخوانی تابع در خط 11 ، همه کدهای بدنه تابع 9-2 اجرا شوند. ولی با فراخوانی تابع خطوط 2 و 3 چاپ میشوند چون هنگامی که برنامه به خط 5 میرسد از بدنه تابع خارج میشود. سپس مفسر به خط 12 رفته و رشته Hello world را چاپ کند.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

پارامترها و آرگومان ها

پارامترها داده‌های خامی هستند که تابع آنها را پردازش می‌کند و سپس اطلاعاتی را که به دنبال آن هستید، در اختیار شما قرار می‌دهد. فرض کنید پارامترها مانند اطلاعاتی هستند که شما به یک کارمند می‌دهید که بر طبق آنها کارش را به پایان برساند. یک تابع می‌تواند هر تعداد پارامتر داشته باشد. هر پارامتر می‌تواند از انواع مختلف داده باشد. در زیر یک تابع با N پارامتر نشان داده شده است :

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

پارامترها بعد از نام تابع و بین پرانتزها قرار می‌گیرند. بر اساس کاری که تابع انجام می‌دهد می‌توان تعداد پارامترهای زیادی به تابع اضافه کرد. بعد از فراخوانی یک تابع باید آرگومانهای آن را نیز تأمین کنید. آرگومان‌ها مقادیری هستند که به پارامترها اختصاص داده می‌شوند. اجازه بدهید که یک مثال بزنیم :

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

خروجی کد:

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

در برنامه بالا یک تابع به نام CalculateSum() (خطوط 2-1) تعریف شده است و می خواهیم مقدار دو عدد را با این تابع حمع کنیم. در بدنه تابع دستور return نتیجه جمع دو عدد را بر می‌گرداند. در خطوط 4 و 5 برنامه از کاربر دو مقدار را درخواست می‌کند و آنها را داخل متغیرها قرار می‌دهد. حال تابع را که آرگومانهای آن را آماده کرده‌ایم فراخوانی می‌کنیم. مقدارnum1 به پارامتر اول و مقدار num2 به پارامتر دوم ارسال می‌شود. حال اگر مکان دو مقدار را هنگام ارسال به تابع تغییر دهیم (یعنی مقدار num2 به پارامتر اول و مقدار num1 به پارامتر دوم ارسال شود) هیچ تغییری در نتیجه تابع ندارد چون جمع خاصیت جابه جایی دارد.

فقط به یاد داشته باشید که باید تعداد آرگومانها هنگام فراخوانی تابع دقیقاً با تعداد پارامترها تعریف شده در تابع مطابقت داشته باشد. بعد از ارسال مقادیر 10 و 5 به پارامترها، پارامترها آنها را دریافت می‌کنند. به این نکته نیز توجه کنید که نام پارامترها طبق قرارداد به شیوه کوهان شتری یا camelCasing (حرف اول دومین کلمه بزرگ نوشته می‌شود) نوشته می‌شود. در داخل بدنه تابع (خط 2) دو مقدار با هم جمع می‌شوند و نتیجه به تابع فراخوان (تابعی که تابعCalculateSum() را فراخوانی می‌کند) ارسال می‌شود. در درس آینده از یک متغیر برای ذخیره نتیجه محاسبات استفاده می‌کنیم ولی در اینجا مشاهده می‌کنید که می‌توان به سادگی نتیجه جمع را نشان داد (خط 7).
در خط 7 تابع CalculateSum() را فراخوانی می‌کنیم و دو مقدار صحیح به آن ارسال می‌کنیم. دو عدد صحیح در داخل تابع با هم جمع شده و نتیجه آنها برگردانده می‌شود. مقدار برگشت داده شده از تابع به وسیله تابع ()print نمایش داده می‌شود. و نکته آخر اینکه یک تابع را می توان به عنوان آرگومان به تابع دیگر ارسال کرد. به کد زیر توجه کنید:

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

خروجی کد:

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

در کد بالا ما دو تابع تعریف کرده ایم. که تابع اول یعنی functionA قرار است که یک آرگومان از نوع تابع دریافت کند. برای این منظور بعد از تعریف پارامتر در خط 1 در خط 2 و بعد از نام پارامتر حتما باید علامت های پرانتز را بنویسید. این بدین معنی است که مقدار برگشتی از تابع functionA یک تابع است. در نتیجه هنگامی که در خط 7 ما functionB را به عنوان آرگومان به تابع functionA می دهیم، کلمه functionA در خط 2 جایگزین کلمه myFunction شده و در نتیجه این خط همانند فراخوانی تابع functionB عمل می کند (یعنی فراخوانی یک تابع همراه با پرانتزهای آن).

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

آرگومان های کلمه کلیدی (Keyword Arguments)

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

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

به مثال زیر توجه کنید:

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

خروجی کد:

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

خروجی نشان می‌دهد که حتی اگر ما ترتیب آرگومانها در سه بار فراخوانی تابع را تغییر دهیم مقادیر مناسب به پارامترهای مربوطه‌شان اختصاص داده می‌شود. همچنین می‌توان از آرگومان های کلمه کلیدی و آرگومانهای ثابت (مقداری) به طور همزمان استفاده کرد به شرطی که آرگومانهای ثابت قبل از آرگومان های کلمه کلیدی قرار بگیرند:

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

همانطور که مشاهده می‌کنید ابتدا باید آرگومانهای ثابت هنگام فراخوانی تابع ذکر شوند. در اولین و دومین فراخوانی در کد بالا، مقدار “Scalia” را به عنوان اولین آرگومان به اولین پارامتر تابع یعنی jack اختصاص می‌دهیم. سومین و چهارمین خط کد بالا اشتباه هستند چون آرگومان های کلمه کلیدی، قبل از آرگومانهای ثابت قرار گرفته‌اند. قرار گرفتن آرگومان های کلمه کلیدی بعد از آرگومانهای ثابت از بروز خطا جلوگیری می‌کند.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

آرگومان های متغیر

با استفاده از دستورات خاص args* و kwargs** می‌توان تعداد دلخواهی از آرگومان‌ها را به تابع ارسال کرد. همانطور که در درس‌های قبل ذکر شد، هنگام فراخوانی تابع باید به تعداد پارامترهایی که در داخل پرانتز تعریف شده‌اند، آرگومان به تابع ارسال کرد. گاهی اوقات در برنامه نویسی ممکن است بخواهید که در هر بار فراخوانی تابع تعداد دلخواهی آرگومان به آن ارسال کنید. این کار با استفاده از * و ** ممکن است. به کد زیر توجه کنید :

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

خروجی کد:

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

ابتدا به این نکته توجه کنید که نامهای args و kwargs اختیاری هستند و هم نام دیگری می‌تواند به جای آنها به کار رود. تنها چیزی که مهم است تعداد علامت * می‌باشد که در ادامه کاربرد آنها را توضیح می‌دهیم.

همانطور که در کد بالا مشاهده می‌کنید، با قرار دادن یک علامت ستاره قبل از نام پارامتر، می‌توان هر بار که تابع را فراخوانی کرد، تعداد دلخواهی از آرگومانها را به آن ارسال کرد. وجود یک علامت * باعث می‌شود که آرگومانها در یک متغیر از جنس tuple ذخیره شوند و در نتیجه می‌توان با یک دستور for مقادیر آنها را با هم جمع کرد. این نوع پارامتر را می‌توان با پارامترهای ثابت هم به کار برد. به مثال زیر توجه کنید:

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

خروجی کد:

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

در کد بالا اولین آرگومان به اولین پارامتر (یعنی 1 به number) و بقیه آرگومانها به args اختصاص داده می‌شوند. وقتی از چندین پارامتر در یک تابع استفاده می‌کنید فقط یکی از آنها باید دارای * بوده و همچنین از لحاظ مکانی باید آخرین پارامتر باشد. اگر این پارامتر (پارامتری که دارای علامت * است) در آخر پارامترهای دیگر قرار نگیرد و یا از چندین پارامتر علامت دار استفاده کنید با خطا مواجه می‌شوید. به مثالهای اشتباه و درست زیر توجه کنید :

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

البته می‌توان پارامتر ستاره دار را در ابتدای پارامترهای دیگر قرار داد ولی پارامترهای بعد از این پارامتر یا باید دارای مقدار پیشفرض باشند

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

خروجی کد:

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

و یا هنگام فراخوانی تابع، باید پارامترهای بعد از این پارامتر را با استفاده از اسمشان مقداردهی کرد. به کد زیر توجه کنید:

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

خروجی کد:

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

حال فرض کنید که می‌خواهید چند list یا tuple به پارامتر ستاره دار ارسال کنید. به کد زیر توجه نمایید :

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

خروجی کد:

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

همانطور که در کد بالا مشاهده می‌کنید، کافیست که آرگومان‌ها به صورت list یا tuple ارسال شوند و قبل از آنها علامت * را قرار دهیم. خط آخر کد بالا را به صورت زیر هم می‌توان نوشت :

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

kwargs** هم شبیه args* عمل می‌کند با این تفاوت که هنگام فراخوانی تابع باید آرگومان‌ها را به صورت کلید/ مقدار به آن ارسال کرد تا به صورت dictionary ذخیره کند:

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

خروجی کد :

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

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

محدوده متغیر

متغیرها در پایتون دارای محدوده (scope) هستند. محدوده یک متغیر به شما می‌گوید که در کجای برنامه می‌توان از متغیر استفاده کرد و یا متغیر قابل دسترسی است. به عنوان مثال متغیری که در داخل یک تابع تعریف می‌شود فقط در داخل بدنه تابع قابل دسترسی است. می‌توان دو متغیر با نام یکسان در دو تابع مختلف تعریف کرد. برنامه زیر این ادعا را اثبات می‌کند :

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

خروجی کد:

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

مشاهده می‌کنید که حتی اگر ما دو متغیر با نام یکسان تعریف کنیم که دارای محدوده‌های متفاوتی هستند، می‌توان به هر کدام از آنها مقادیر مختلفی اختصاص داد. متغیر تعریف شده در داخل تابع firstFunction() هیچ ارتباطی به متغیر داخل تابع secondFunction() ندارد. همانطور که ذکر شد، متغیری که در داخل بدنه یک تابع تعریف شود در خارج از تابع قابل دسترسی نیست. به مثال زیر توجه کنید :

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

در تابع بالا یک متغیر به نام number تعریف شده است. اگر بخواهیم در خارج از تابع یعنی خط آخر مقدار این متغیر را چاپ کنیم با پیغام خطا مواجه می شویم. چون این متغیر فقط در داخل تابع قابل دسترسی است. به این متغیرها محلی یا Local گفته می شود. یک نوع دیگر از متغیرها، عمومی یا global هستند. این متغیر ها در خارج از تابع تعریف می شوند و در داخل بدنه تابع قابل دسترسی هستند. به مثال زیر توجه کنید :

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

خروجی کد:

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

در کد بالا یک متغیر به نام number با مقدار 10 در خارج از تابع تعریف شده است. از تابع ()myFunction خواسته ایم که مقدار این متغیر را در هنگام فراخوانی چاپ کند. این اتفاق می افتد، چون متغیر های خارج از تابع در داخل تابع قابل دسترسی هستند. به کد زیر توجه کنید:

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

خروجی کد:

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

به دو متغیر number در خطوط 1 و 4 توجه کنید. این دو متغیر جدا از هم هستند. چون یکی از آنها global و دیگری Local است. و چون هیچ ارتباطی به هم ندارند، در نتیجه خروجی نیز متفاوت است. حال اگر بخواهیم مقدار یک متغیر عمومی و خارج از تابع را در داخل تابع مورد استفاده قرار یا تغییر دهیم باید چکار کنیم؟ راهکار، استفاده از کلمه کلیدی global است. به مثال زیر توجه کنید :

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

خروجی کد :

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

در کد بالا یک متغیر تعریف کرده ایم و قبل از آن کلمه کلیدی global را نوشته ایم. این کلمه به برنامه می فهماند که قرار است از فلان متغیر در خارج از تابع استفاده شود. همانطور که مشاهده می کنید با وجود کلمه global می توان به متغیر number در خارج از تابع دسترسی داشت و از آن استفاده کرد و یا آن را تغییر داد. ما در اینجا فقط مقدار number را خارج از تابع تغییر داده ایم. ولی شما ممکن است که بخواهید از آن، استفاده های دیگری بکنید. همانطور که مشاهده می کنید با تغییر مقدار متغیر number در داخل تابع، مقدار آن در خارج از تابع هم تغییر می کند. نکته آخر این است که در خطی که کلمه global به کار رفته است نمی توان عمل انتساب را انجام داد. یعنی خط زیر اشتباه است:

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

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

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

خروجی کد:

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

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

پارامترهای پیشفرض

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

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

بازگشت (Recursion)

بازگشت فرایندی است که در آن تابع مدام خود را فراخوانی می‌کند تا زمانی که به یک مقدار مورد نظر برسد. بازگشت یک مبحث پیچیده در برنامه نویسی است و تسلط به آن کار راحتی نیست. به این نکته هم توجه کنید که بازگشت باید در یک نقطه متوقف شود وگرنه برای بی نهایت بار، تابع، خود را فراخوانی می‌کند. در این درس یک مثال ساده از بازگشت را برای شما توضیح می‌دهیم. فاکتوریل یک عدد صحیح مثبت (n!) شامل حاصل ضرب همه اعداد مثبت صحیح کوچکتر یا مساوی آن می‌باشد. به فاکتوریل عدد 5 توجه کنید.

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

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

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

خروجی کد

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

تابع مقدار بزرگی را بر می‌گرداند چون محاسبه فاکتوریل می‌تواند خیلی بزرگ باشد. تابع یک آرگومان که یک عدد است و می‌تواند در محاسبه مورد استفاده قرار گیرد را می‌پذیرد. در داخل تابع یک دستور if می‌نویسیم و در خط 2 می گوییم که اگر آرگومان ارسال شده برابر 1 باشد سپس مقدار 1 را برگردان در غیر اینصورت به خط بعد برو. این شرط باعث توقف تکرارها نیز می‌شود.
در خط 4 مقدار جاری متغیر number در عددی یک واحد کمتر از خودش (number – 1) ضرب می‌شود. در این خط تابعFactorial خود را فراخوانی می‌کند و آرگومان آن در این خط همان number – 1 است. مثلاً اگر مقدار جاری number 10باشد یعنی اگر ما بخواهیم فاکتوریل عدد 10 را به دست بیاوریم آرگومان تابع Factorial در اولین ضرب 9 خواهد بود. فرایند ضرب تا زمانی ادامه می‌یابد که آرگومان ارسال شده با عدد 1 برابر نشود. شکل زیر فاکتوریل عدد 5 را نشان می‌دهد.psdk.jpg.500dc38b61936454b96e607608ac5c9d.jpg

کد بالا را به وسیله یک حلقه while نیز می‌توان نوشت.

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

این کد از کد معادل بازگشتی آن آسان‌تر است. از بازگشت در زمینه‌های خاصی در علوم کامپیوتر استفاده می‌شود. استفاده از بازگشت حافظه زیادی اشغال می‌کند پس اگر سرعت برای شما مهم است از آن استفاده نکنید.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

توابع داخلی

به تابعی که در داخل تابع دیگر تعریف شده باشد، تابع داخلی گفته می شود :

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

در کد بالا تابع ()inner یک تابع داخلی است. برای اینکه یک تابع داخلی را به وسیله تابع خارجی آن برگشت دهیم باید بعد از کلمه کلیدی return، نام تابع داخلی را بدون پرانتز بنویسیم:

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

به مثالی ساده در مورد توابع داخلی توجه کنید :

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

خروجی کذ:

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

قبل از توضیح کد بالا به این نکته توجه کنید که توابع داخلی به متغیرهای تابع خارجی دسترسی دارد. در کد بالا یک تابع داخلی به نام ()addFive تعریف شده است که وظیفه آن اضافه کردن عدد 5 به مقداری است که با تابع خارجی ارسال می شود. در خط 6 وقتی تابع ()make_adder را فراخوانی می کنیم و مقدار آن را در داخل یک متغیر به نام result می ریزیم، این متغیر در اصل مقدار برگشتی از تابع ()make_adder یعنی تابع ()addFive است. در نتیجه برای چاپ نهایی این مقدار برگشتی باید در جلوی نام result در خط 7 علامت پرانتز بگذاریم تا به نوعی تابع ()addFive فراخوانی شود. پس وقتی مقدار 10 را به تابع ()make_adder ارسال می کنیم، این عدد در داخل تابع ()addFive با 5 جمع شده و مقدار 15 برگشت داده می شود. توابع داخلی در مبحث Decorator ها کاربرد دارند، که در درس های آینده توضیح می دهیم.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

Decorator

در درس های قبلی در مورد ارسال مقدار به تابع، ارسال تابع به تابع و همچنین نحوه ایجاد توابع داخلی توضیح دادیم. حال می خواهیم این سه مبحث را در این درس و در قالب مبحث جدیدی به نام Decorator به کار ببریم. فرض کنید می خواهیم یک تابع را ایجاد کنیم که هر عددی که به آن دادیم را به توان 2 برساند و نتیجه را برگشت دهد. روش تعریف همچین تابعی به صورت زیر است:

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

اما اگر بخواهیم فقط اعداد زوج را به توان دو برساند به دو روش می توانیم این کار را انجام دهیم. یا باید بدنه تابع را دستکاری کنیم :

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

و اگر نخواهید بدنه تابع را دستکاری کنید می توانید از روش دوم استفاده کنید و آن استفاده از یک تابع داخلی است. بدین صورت که شما هر تغییری را که می خواهید در تابع اصلی اعمال کنید به یک تابع داخلی می دهید. کد بالا را به صورت زیر اصلاح می کنیم :

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

خروجی کد

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

در کد بالا با تابع اصلی کاری نداریم (خطوط 12-11). یک تابع تعریف می کنیم، که یک تابع دریافت می کند (خطوط 9-1). در داخل این تابع یک تابع دیگر تعریف می کنیم (خطوط 7-3)، که همان تابع داخلی بوده و همان تغییراتی را که قرار است در تابع اصلی بدهیم، از این تابع می خواهیم. این تابع یک پارامتر قبول می کند که همان عددی است که قرار است به توان برسد. در داخل بدنه این تابع در خط 4 چک می کنیم که اگر باقیمانده تقسیم عدد گرفته شده بر 2 برابر با 0 بود، عدد را به تابع اصلی بدهد تا آن را به توان 2 برساند در غیر اینصورت خود عدد را نشان دهد (خط 7). در خط 9 هم همین تابع داخلی را به وسیله تابع خارجی برگشت می دهیم.

در خط 15، تابع خارجی را صدا می زنیم. این تابع، یک تابع را به عنوان پارامتر دریافت می کند، و ما هم تابع اصلی (()powEvenValue) را به آن ارسال می کنیم و نتیجه را در یک متغیر با نام result می ریزیم. از آنجاییکه خروجی تابع خارجی یعنی تابع ()getFunction، تابع داخلی ()checkValue است، در نتیجه، متغیر result همان تابع ()checkValue است و کافیست در خط 17 یک پرانتزها را در جلوی این متغیر قرار داده و یک عدد به آن بدهیم تا چک کند که آیا زوج است یا فرد؟

اگر بخواهید همان تابع اصلی خود را صدا زده و خروجی مورد نظر را دریافت کنید، کافیست که از مفهوم Decorator استفاده کنید. خطوط 17-13 کد بالا را حذف کرده و خط 11 کد زیر را قبل از تابع اصلی بنویسید. خط 11 همان کار خطوط 15 و 17 کد بالا را انجام می دهد و مفهوم Decorator هم همین است. در این خط علامت @ و سپس نام تابع خارجی را نوشته ایم:

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

خروجی کد

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

همانطور که در کد بالا مشاهده می کنید می توان تابع اصلی را صدا کرد و یک عدد به آن داد، تا مجذورش را محاسبه کند.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   بازگردانی قالب بندی

  حداکثر استفاده از ۷۵ شکلک مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به عنوان یک لینک به جای

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

در حال بارگذاری

  • مطالب مشابه

    • توسط Doctor Robot
      زبان نشانه گذاری توسعه پذیر (XML)
      زبان نشانه گذاری توسعه پذیر (XML)، به شما اجازه می‌دهد که داده‌ها را در یک متن و قالب ساخت یافته ذخیره کنید. این زبان به طور گسترده به عنوان یک دیتابیس جایگزین و برای ذخیره اطلاعات مربوط به پیکربندی نرم افزارها به کار می‌رود. XML از لحاظ دستوری شبیه به HTML بوده و اگر با HTML آشنایی داشته باشید یادگیری این زبان برایتان راحت‌تر است. در زیر یک سند XML را مشاهده می‌کنید :
      برای مشاهده ی این بخش لطفا وارد حساب کابری خود شوید یا اگر عضو نیستید از این قسمت عضو سایت شوید
      سند XML ترکیبی از عناصر XML می‌باشد. یک عنصر XML شامل یک تگ آغازی، یک تگ پایانی و داده‌ای است که در بین این دو تگ قرار می‌گیرد.
      برای مشاهده ی این بخش لطفا وارد حساب کابری خود شوید یا اگر عضو نیستید از این قسمت عضو سایت شوید
      می‌توان بر اساس داده‌ای که یک عنصر XML در خود نگهداری می‌کند یک نام برای عنصر انتخاب کرد. به این نکته توجه کنید که عناصر به حروف بزرگ و کوچک حساسند، بنابراین دو کلمه person و Person با هم متفاوتند. XML فضاهای خالی را نادیده می‌گیرد، بنابراین به جای نوشتن یک فایل در یک خط می‌توانید آن را در چند خط بنویسید تا خوانایی آن بالاتر رود. بین عناصر XML ممکن است رابطه پدر- فرزندی وجود داشته باشد
      برای مشاهده ی این بخش لطفا وارد حساب کابری خود شوید یا اگر عضو نیستید از این قسمت عضو سایت شوید
      سند XML بالا دارای اطلاعاتی برای سه شخص می‌باشد. هر سند XML باید دارای یک عنصر ریشه (root) باشد. در مثال اول این درس، عنصر Persons ، عنصر ریشه (پدر) و دیگر عناصر داخل آن در حکم فرزندان آن می‌باشند. جزییات هر شخص در داخل عنصر Person قرار دارند. عناصر فرزند عنصر Person عبارتند از Name، Age و Gender. صفات XML، روشی دیگر برای اضافه کردن داده به یک عنصر می‌باشند.
      برای مشاهده ی این بخش لطفا وارد حساب کابری خود شوید یا اگر عضو نیستید از این قسمت عضو سایت شوید
      عنصر بالا یک خاصیت به نام name دارد که مقدار آن John Smith می‌باشد. مقادیر باید در داخل کوتیشن (‘ ‘) یا دابل کوتیشن (“ “) قرار بگیرند. در زیر روش اضافه کردن صفات نشان داده شده است.
      برای مشاهده ی این بخش لطفا وارد حساب کابری خود شوید یا اگر عضو نیستید از این قسمت عضو سایت شوید
      همانطور که مشاهده می‌کنید، می‌توان به یک عنصر چندین صفت اضافه کرد.
      برای مشاهده ی این بخش لطفا وارد حساب کابری خود شوید یا اگر عضو نیستید از این قسمت عضو سایت شوید
      اجازه دهید که به عناصر مثال ابتدای درس صفاتی اضافه کنیم.
      برای مشاهده ی این بخش لطفا وارد حساب کابری خود شوید یا اگر عضو نیستید از این قسمت عضو سایت شوید
      عنصر Name هر شخص (person) را حذف و صفت معادل آن (name) را برای هر عنصر می‌نویسیم. اسناد XML می‌توانند دارای یک تعریف XML باشند. تعریف XML شامل اطلاعاتی درباره سند XML مانند نسخه (همیشه نسخه 1.0 پیشنهاد می‌شود) و نوع رمزگذاری (encode) متن آن می‌باشد.
      برای مشاهده ی این بخش لطفا وارد حساب کابری خود شوید یا اگر عضو نیستید از این قسمت عضو سایت شوید
      این تعریف در بالاترین بخش سند و درست قبل از عنصر اصلی نوشته می‌شود. برای فایل XML می‌توان توضیحات نیز نوشت. نحوه نوشتن توضیحات در XML به صورت زیر است.
      برای مشاهده ی این بخش لطفا وارد حساب کابری خود شوید یا اگر عضو نیستید از این قسمت عضو سایت شوید
      می‌توان با استفاده از یک ویرایشگر متن ساده فایل‌های XML تولید کرد.
  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×
×
  • جدید...