آموزش پایتون Python قسمت هفدهم

پوریا جهانبخش 1395/2/20 1539

آموزش پایتون Python قسمت هفدهم

سلام مجدد و خسته نباشید به همه علاقه مندان به پایتون.
در قسمت قبل تا حدودی مبحث کلاس رو توضیح دادیم.
در این قسمت هم قرار شد توابع رو وارد کلاس هامون بکنیم.
توجه داشته باشین که این جلسات (یعنی از جلسه قبل که کلاس ها شروع شدن به بعد) خیلی مهم هستن.

خوب برای این که کلاسمون تابع داشته باشه، کافیه هنگام ساختنش تابع مورد نظرمون رو (مثل قبلا که تابع مینوشتیم) بنویسیم.

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

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


 

آموزش پایتون


خوب حالا علت وجود این self چیه که هنگام ساخت تابع باید باشه ولی هنگام اجرا نباید باشه؟
دلیلش همونه مطلبیه که ابتدای همین قسمت بهش اشاره کردم.
یعنی ممکنه شما بخواید داخل تابع به بقیه ی توابع یا متغیر های تعریف شده داخل کلاس اشاره کنید.

نحوه کار کردش چطوریه؟


 

آموزش پایتون


همونطور که مشاهده کردین ما داخل کلاس یه متغیر به نام test تعریف کردیم و سپس داخل تابعی که تو کلاس تعریف کردیم با استفاده از آرگومان self به عنوان پیشوند، تونستیم به متغیر دسترسی پیدا کنیم.

حالا یه مثال از دسترسی به توابع:


 

آموزش پایتون


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

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


 

آموزش پایتون


فصل قبل و این فصل رو از ابتدا تا به اینجا یک بار بخونید، اگر نفهمیدید دوباره بخونید، ...
اگر شده هزار بار بخونید، فقط مطمئن شید که حتما فهمیدینش.
چون از اینجا به بعد دیگه همش با class و  self و ... سر و کار داریم.
حالا میخوایم یه برنامه بنویسیم که معدل یک دانش آموز رو حساب کنه.
خوب ما به 3 تا تابع نیاز داریم:

تابع اول: وظیفش اینه بهمون بگه چند تا درس برای معدل گیری داریم، یعنی باید داخل این تابع قطعه کدی بنویسیم که این کار رو بکنه (در اینجا ما ورودی رو از کاربر میگیریم).
تابع دوم:
این تابع وظیفش اینه به اندازه ی تعداد درس ها، نمره ها رو از کاربر بگیره و همرو تحت ساختار داده ای list بهمون بده.
تابع سوم:
معدل یه لیست از نمرات رو حساب میکنه.
پس کلاسمون میشه:

 

آموزش پایتون


file program.py

 

آموزش پایتون


run program.py

توضیح ()input :
جزو توابع و کلاس های توکار پایتونه و یک رشته رو به عنوان آرگومان میپذیره و زمان اجرا اون رشته رو نمایش میده و بعد از اون هرچی کاربر بنویسه رو تا زمان زدن دکمه ی اینتر، به عنوان ورودی و تحت ساختار داده ای رشته برمیگردونه.

ما داخل تابع اول از کاربر تعداد درس رو به عنوان ورودی گرفتیم و با استفاده از تابع تو کار ()int اون رو از رشته به عدد تبدیل کردیم و با استفاده از آرگومان self مقدار متغیر total_numbers رو برابر با ورودی که گرفتیم قرار دادیم.

در تابع اول ما متغیر total_numbers رو ساختیم و بعدش تابع دوم رو اجرا کردیم که برای دسترسی به تعداد درس ها با استفاده از self به این متغیر دسترسی پیدا میکنه و به همون اندازه از کاربر نمره ی درس هارو میگیره و داخل یه لیست میریزه و در آخر مقدار متغیر numbers رو با استفاده از self برابر با اون لیست قرار میده.

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

توجه کنید که اگر داخل کلاس یه متغیر به نام test داشتید، و داخل توابع کلاس هم متغیری به نام test تعریف کردید، این دو تا با هم یکی نیستن، بلکه داخل تابع اون متغیر test مربوط به کلاس به self.test شناخته میشه و متغیر test داخل تابع به همون test شناخته میشه.
به مثال زیر توجه کنید:


 

آموزش پایتون


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

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

پس یه تابع دیگه به کلاسمون اضافه میکنیم و تغییرات دیگه ای هم به کلاسمون میدیم.

 

آموزش پایتون


new file program.py

 

آموزش پایتون


run new file program.py

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

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

خوب نوشتن برنامه ای که کامپیوتر بفهمش خیلی آسونه دوستان من، برنامه نویس باید سعی کنه برنامه ای بنویسه که علاوه بر کامپیوتر، بقیه ی برنامه نویسان هم بفهمنش !

 اگر کوتاه نویسی هنره،  من کل این برنامه بالا رو در یک خط برنامه نویسی مینویسم:
 

آموزش پایتون


دوستانی که فقط این آموزش هارو دنبال کردند که اصلا نمیفهمنش، (نگران هم نباشید چون این تکنیک ها رو به زودی بهتون یاد میدم)
دوستانی هنم که تا حدودی بلد بودن هم باز باید زمان بذارن روش تا بفهمن من چی نوشتم، که این زمان بسیار بیشتره از زمانی که برای فهمیدن برنامه قبل میذارن !

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

print(sum([int(input("Enter number: ")) for count in range(int(input("Enter total number: ")))])/int(input("Enter total number again: ")))

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

قسمت بعدی قسمت قبلی