فهرست عناوین

موضوع قبلی

8. رساندن روزنامه

موضوع بعدی

10. دور بزن

9. قانون شمارهٔ ۳

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

مهم

قانون شمارهٔ ۳

وقتی دارید برنامه‌های کامپیوتری می‌نویسید، کارها را شما تکرار نکنید. تکرار می‌کنم: تکرار نکنید!

9.1. سه بار گردش به چپ می‌تواند یک گردش به راست باشد

از آن‌جایی که چندتایی برنامه نوشته اید (انجامشون دادید دیگه، مگه نه؟)، تا حالا حتماً باید دیگر فهمیده باشید که اگر کاری کنیم که ریبرگ سه تا گردش به چپ، درجا و پشت سر هم بزند؛ مثل این است که کاری کرده‌ایم یک گردش به راست داشته باشد. احتمالاً هر دفعه که می‌خواستید کاری کنید که ریبرگ به راست بچرخد؛ کم کم دیگر برایتان کسل کننده شده بوده که سه تا دستور گردش به چپ ()turn_left را برایش بنویسید. بهتر نمی بود اگر می‌توانستید خیلی راحت دستور ()turn_right را برای گردش به راست بنویسید؟ آخر این درس می‌توانید این کار را بکنید.

9.2. تعریف تابع‌ها

چیزهایی که تا حالا به آن‌ها می‌گفتیم دستور نمونه‌هایی از توابع پایتون هستند. پس، ()turn_left و همچنین ()move هر کدام یک تابع هستند. ما می‌توانیم تابع‌های جدید پایتونی را این طور تعریف کنیم:

def   some_well_chosen_name(): #یک تابع با یک اسم آشنا و مشخّص
    # چند سطر کد
    # به اندازه ی هم از اوّل سطرها فاصله دار می‌کنیم.

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

بیاید اوّلین تابع پایتون‌مان را بنویسیم:

def turn_right():
    turn_left()
    turn_left()
    turn_left()

خودش است! حالا دیگر می‌توانید بی‌خیال نوشتن سه تا ()turn_left پشت سر هم برای گردش به راست بشوید!

امتحان کنید!

تابع گردش به راست ()turn_right را در یک برنامه تعریف کنید و از آن استفاده کنید. این برنامه می‌تواند برای محیط «تنها در خانه» باشد. اگر اصلاً نمی دانید این تابع را با چه چیزی امتحان کنید، کاری کنید که ریبرگ با ۴ بار اجرای متناوب توابع ()turn_right و ()move دور یک مربّع بچرخد.

9.3. چطور def را توی ذهنمان تصوّر کنیم

توجه

لطفاً توجّه داشته باشید که این توضیح ساده مفهوم چیزی که به عنوان دامنهٔ متغیّر شناخته شده‌است را شامل نمی شود. بعداً به این موضوع خواهیم پرداخت.

همین الآن دیدید که چطور یک تابع در پایتون تعریف می‌شود. احتمالاً در جا فهمیدید که چطور در مورد آن‌ها فکر کنیم و فرآیند کارشان را بفهمیم. محض احتیاط، این جا یک توضیح مفصّل هست که نه تنها به شما کمک می‌کند که بفهمید توابع چطور کار می‌کنند؛ بلکه با کمک آن ساختار و روند کار بقیّهٔ ساختارهای پایتون -که شامل این جور تکّه‌کدها می‌شوند- را هم می‌فهمید.

فرض کنید این کد را داریم:

 def  turn_right():  # از این جا به بعد شروع تکّه‌کد هست
     turn_left()
     turn_left()
     turn_left()   # پایان تکّه‌کد

 move()
 turn_right()
 move()

کد بالا معادل نوشتن این کد است:

 # تعریف یه تابع
 def turn_right():
     turn_left()
     turn_left()
     turn_left()

 move()

 # شروع قسمتی از کد که داخل تعریف تابع turn_right است
 turn_left()
 turn_left()
 turn_left()

 # پایان تکّه‌کد
 move()

به عبارت دیگر، def اسمی تعریف می‌کند که می‌توانیم آن را به عنوان هم‌معنی همهٔ آن چیزی که توی آن تکّه‌کد دیده می‌شود در نظر بگیریم. هر موقع که می‌بینیم که آن کلمهٔ هم‌معنی فراخوان می‌شود - یعنی آن اسم با () بعدش می‌آید- می‌توانیم این طوری فرض کنیم که آن تکّه‌کد را در آن قسمت کد‌ها قرار داده‌ایم.

این کار را امتحان کنید!

ببینید آیا می‌توانید با استفاده از یک تابع ()turn_right، برنامهٔ تحویل روزنامه برای خواندن و فهمیدن را ساده و راحت‌تر کنید. وقتی که این کار را کردید؛ شاید بتوانید در مورد راه‌های دیگری که بشود با تعریف تابع‌های دیگر برنامهٔتان را ساده‌تر کنید، فکر کنید.