زیربرنامه های (پایتون): رویه ها و توابع - 1


زیرروال ها

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

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

هر زیربرنامه فقط باید یک کار انجام دهد،  یا فقط چیزی را محاسبه کنید، یا مقداری داده را خروجی بگیرید، یا کار دیگری انجام دهید. 

دو نوع زیر روال وجود دارد - روش‌هاو عملکرد.
.
رویه‌های فرعی برخی اقدامات را انجام می‌دهند، مانند نمایش یک نتیجه بر روی صفحه به شکلی خاص (یک مثال ساده، عبارت print() یک روش فرعی استاندارد است که داده‌ها را روی صفحه چاپ می‌کند).

زیرروال های تابع نتیجه ای را برمی گرداند (عدد، رشته کاراکتر و غیره) که می توانیم در برنامه اصلی استفاده کنیم.

بیایید سعی کنیم یک روش ساده بنویسیم:
فرض کنید باید رشته "Error" را روی صفحه نمایش دهیم هر بار که ممکن است به دلیل خطای کاربر خطایی در کد رخ دهد، مثلاً وقتی داده های نادرست وارد می کند.
این را می توان با نوشتن بیانیه انجام داد print("خطا") و حالا تصور کنید که چنین خطی باید در بسیاری از جاهای برنامه درج شود. البته، شما فقط می توانید آن را در همه جا بنویسید. اما این راه حل دو اشکال دارد.
1) این رشته بارها در حافظه ذخیره می شود.
2) اگر بخواهیم خروجی خطا را تغییر دهیم، باید این خط را در طول برنامه تغییر دهیم، که نسبتاً ناخوشایند است

برای چنین مواردی، مراحل لازم است.
یک برنامه با رویه ممکن است به شکل زیر باشد:
  def printError(): # شرح رویه چاپ ("خطا") ... printError() # روال را برای اجرا شروع کنید. # فقط نام رویه ای را که می خواهیم اجرا کنیم را مشخص کنید ... printError()
باید به خاطر بسپارید!
  1. روش با کلمه def شروع می‌شود (از انگلیسی - define - to define). بعد از نام رویه، براکت‌های خالی و دو نقطه نوشته می‌شود. . پارامترها را می توان در داخل براکت ها مشخص کرد (در ادامه در مورد آن صحبت خواهیم کرد).
  2. همه عباراتی که در یک رویه اجرا می شوند تورفتگی دارند. 
  3. برای اجرای یک رویه، در برنامه اصلی باید آن را با نام صدا بزنید و به یاد داشته باشید که پرانتز بنویسید!
  4. می‌توانید هر چند بار که بخواهید یک رویه را در یک برنامه فراخوانی کنید.

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

حالا بیایید تصور کنیم که بسته به نوع اشتباه کاربر، باید پیام های مختلفی را در پاسخ به خطای کاربر نمایش دهیم.
در این صورت، می توانید رویه خود را برای هر خطا بنویسید:   <پیش> def printErrorZero(): چاپ ("خطا. تقسیم بر صفر!") <پیش> def printErrorInput(): چاپ ("خطا در ورودی!")
اگر خطاهای احتمالی بسیار بیشتری وجود داشته باشد چه؟ این راه حل برای ما مناسب نیست!
ما باید یاد بگیریم که چگونه رویه را با گفتن اینکه چه پیام خطایی نمایش دهد، کنترل کنیم.
برای این کار به پارامترهایی نیاز داریم که بعد از نام رویه در پرانتز می نویسیم <پیش> خطا(های) def print: چاپ ("ها")
در این روش، s یک پارامتر است - یک متغیر ویژه که به شما امکان می دهد رویه را کنترل کنید.
 
پارامتر متغیری است که نحوه عملکرد زیربرنامه را تعیین می کند. نام پارامترها در سربرگ زیربرنامه با کاما از هم جدا می شوند.


اکنون، هنگام فراخوانی رویه، باید مقدار واقعی را که به پارامتر (متغیر s) در داخل رویه ما تخصیص داده می‌شود، در داخل پرانتز مشخص کنید. <پیش> printError("خطا! تقسیم بر صفر!")
چنین مقداری آرگومان نامیده می شود.
 
Argumentمقدار پارامتری است که هنگام فراخوانی به زیربرنامه ارسال می شود.

یک آرگومان نه تنها می تواند یک مقدار ثابت باشد، بلکه می تواند یک متغیر یا یک عبارت حسابی نیز باشد.

متغیرهای محلی و جهانی

متغیرهایی که در برنامه اصلی معرفی می شوند جهانی (یا اشتراکی) نامیده می شوند.

می‌توانید از هر زیرروال به متغیرهای سراسری دسترسی داشته باشید. 

اغلب لازم است متغیرهای اضافی معرفی شوند که فقط در زیر برنامه مورد استفاده قرار گیرند. چنین متغیرهایی local (یا محلی) نامیده می شوند. شما می توانید با آنها فقط در زیر برنامه ای که در آن ایجاد شده اند کار کنید. بقیه روتین ها چیزی در مورد آنها "نمی دانند".

بنابراین، می توان دامنه (حوزه) یک متغیر را فقط به زیربرنامه ای که واقعاً مورد نیاز است محدود کرد. در برنامه نویسی به این تکنیکencapsulation  - پنهان کردن متغیر از تغییر از خارج.

تجزیه و تحلیل سه برنامه: <سر> <بدن>
شرح برنامه
1) در این برنامه، متغیر i محلی است. اگر در برنامه اصلی متغیر i وجود نداشته باشد، پیغام خطا دریافت می کنیم. و اگر چنین متغیری وجود داشته باشد (پس یک متغیر جهانی است)، مقدار آن روی صفحه نمایش داده می شود. <پیش> def test(): print(i)
2) در اینجا، حتی اگر یک متغیر سراسری i وجود داشته باشد، یک متغیر محلی جدید i با مقدار 2 ایجاد می شود و 2 روی آن ظاهر می شود. صفحه نمایش. <پیش> def test():   i = 2 print(i)
3) در این برنامه یک متغیر جهانی i با مقدار 15 وجود دارد. مقدار آن را می توان در داخل زیربرنامه تغییر داد، برای این کار باید به صراحت اعلام کرد که جهانی است ( از دستور global استفاده کنید.
این رویه با متغیر سراسری i کار می کند و مقدار جدیدی از 2 به آن اختصاص داده می شود. مقدار 2 نمایش داده می شود.
<پیش> def test():   جهانی i i = 2 #برنامه اصلی من = 15 چاپ (i)