جریان کنترل

در برنامه هایی که تاکنون دیده ایم، همیشه مجموعه ای از دستورات وجود داشته است که پایتون آن ها را به طور دقیق و از بالا به پایین اجرا می کرد. اما اگر بخواهید جریان یا ترتیب اجرای برنامه را تغییر دهید، چطور؟ برای مثال، می خواهید برنامه براساس شرایط مختلف تصمیم گیری کند و کارهای متقاوتی انجام دهد؛ مثلاً باتوجه به زمان روز، عبارت 'Good Morning' یا 'Good Evening' را پرینت کند.

همان طور که احتمالاً حدس زده اید، این هدف با استفاده از دستورات جریان کنترل به دست می آید. در پایتون سه دستور برای کنترل جریان وجود دارد: if, for و while.

دستور if

دستور if برای بررسی یک شرط استفاده می شود: اگر(if) شرط درست باشد، مجموعه ای از دستورات را اجرا می کنیم که if-block نام دارد؛ در غیر این صورت (else) مجموعه ای از دستورات دیگر را اجرا می کنیم که else-block نامیده می شود. بخش else اختیاری است.

مثال را با نام if.py ذخیره کنید:

number = 23
guess = int(input('Enter an integer : '))

if guess == number:
    # New block starts here
    print('Congratulations, you guessed it.')
    print('(but you do not win any prizes!)')
    # New block ends here
elif guess < number:
    # Another block
    print('No, it is a little higher than that')
    # You can do whatever you want in a block ...
else:
    print('No, it is a little lower than that')
    # you must have guessed > number to reach here

print('Done')
# This last statement is always executed,
# after the if statement is executed.

خروجی:

$ python if.py
Enter an integer : 50
No, it is a little lower than that
Done

$ python if.py
Enter an integer : 22
No, it is a little higher than that
Done

$ python if.py
Enter an integer : 23
Congratulations, you guessed it.
(but you do not win any prizes!)
Done

نحوۀ عملکرد

در این برنامه، از کاربر می خواهیم که حدس بزند و بررسی می کنیم که آیا حدس او همان عددی است که ما انتخاب کرده ایم یا خیر. متغیر number را روی یک عدد صحیح دلخواه، مثلاً 23، قرار می دهیم. سپس، با استفاده از تابع ()input حدس کاربر را دریافت می کنیم. توابع بخش هایی از برنامه هستند که می توان آنها را مجدد استفاده کرد. در next chapter بیشتر دربارۀ آنها خواهیم خواند.

ما یک رشته به تابع input می دهیم؛ این تابع رشته را روی صفحه نمایش می دهد و منتظر دریافت ورودی از کاربر می ماند. هنگامی که چیزی را وارد کرده و کلید [enter] را فشار دهیم، تابع ()input چیزی را که وارد کرده ایم به عنوان یک رشته بر می گرداند. سپس این رشته را با استفاده از int به یک عدد صحیح تبدیل کرده و آن را در متغیر guess ذخیره می کنیم. در واقع، int یک کلاس (class) است؛ اما در حال حاضر کافی است بدانید که می توانید از آن برای تبدیل یک رشته به عددی صحیح استفاده کنید ( فرض کنید رشته شامل یک عدد صحیح معتبر در متن است).

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

دقت کنید که دستور if در انتهای خود دارای یک دو نقطه (:) است. با این کار به پایتون نشان می دهیم که پس از آن یک بلوک از دستورات قرار خواهد گرفت.

در مرحلۀ بعد، بررسی می کنیم که آیا حدس کاربر از عدد موردنظر کوچک تر است یا خیر. اگر چنین باشد، به کاربر اطلاع می دهیم که باید عددی بزرگنر را حدس بزند. در اینجا از عبارت elif استفاده کرده ایم. این عبارت در واقع دو ساختار ترکیبی if else-if else را در قالب یک ساختار ترکیبی if-elif-else ادغام می کند. این امر برنامه را ساده تر کرده و میزان تورفتگی موردنیاز را کاهش می دهد.

دستورات elif و else نیز باید در انتهای خط منطقی خود یک دو نقطه داشته باشد و پس از آن دستورات مربوطه قرار گیرد؛ البته با رعایت تورفتگی صحیح.

می توانید یک دستور if دیگر را درون بلوک if یک دستور if قرار دهید و همین طور ادامه دهید. به چنین ساختاری دستور if تودرتو گفته می شود.

به خاطر داشته باشید که بخش های elif و else اختیاری هستند. حداقل یک دستور if معتبر می تواند به شکل زیر باشد:

if True:
    print('Yes, it is true')

پس از آنکه پایتون اجرای کامل دستور if و بخش های مرتبط elif و else را به پایان رساند، به سراغ دستور بعدی در بلوکی می رود که دارای دستور if باشد. در این مثال، آن بلوک، بلوک اصلی است (جایی که اجرای برنامه از آن آغاز می شود). دستور بعدی نیز دستور print('Done') است. پس از آن، پایتون به انتهای برنامه می رسد و اجرای آن را به پایان می رساند.

اگرچه این برنامه بسیار ساده است، نکات زیادی وجود دارد که باید به آن توجه کنید. همه این نکات بسیار منطقی و سرراست هستند (حتی برای افرادی که پیش زمینه C++/C دارند، به طرز شگفت انگیزی ساده هستند). در ابتدا لازم است با تمام این نکات آشنا شوید، اما پس از کمی تمرین، به راحتی با آن ها کنار خواهید آمد و استفاده از آن ها برایتان کاملاً «طبیعی» خواهد شد.

نکته برای برنامه نویسان C++/C

در پایتون دستور switch وجود ندارد. ازif..elif..else برای انجام همان کار استفاده کنید (و در برخی موارد، برای انجام سریع تر این کار از یک dictionary استفاده کنید.) می توانید از دستور

دستور while

دستور while به شما اجازه می دهد تا هنگامی که یک شرط درست باشد، یک بلوک از دستورات را به طور مکرر اجرا کنید. دستور while نمونه ای از چیزی است که دستور حلقه (looping) نامیده می شود. یک دستور while می تواند یک عبارت else اختیاری نیز داشته باشد.

مثال را با نام while.py ذخیره کنید:

number = 23
running = True

while running:
    guess = int(input('Enter an integer : '))

    if guess == number:
        print('Congratulations, you guessed it.')
        # this causes the while loop to stop
        running = False
    elif guess < number:
        print('No, it is a little higher than that.')
    else:
        print('No, it is a little lower than that.')
else:
    print('The while loop is over.')
    # Do anything else you want to do here

print('Done')

خروجی:

$ python while.py
Enter an integer : 50
No, it is a little lower than that.
Enter an integer : 22
No, it is a little higher than that.
Enter an integer : 23
Congratulations, you guessed it.
The while loop is over.
Done

نحوۀ عملکرد

در این برنامه، همچنان درحال اجرای بازی حدس زدن هستیم؛ اما مزیت آن این است که کاربر می تواند تا زمانی که پاسخ صحیح را حدس بزند، به حدس زدن ادامه دهد. بنابراین دیگر نیازی نیست برای هر حدس، برنامه را دوباره اجرا کنیم؛ کاری که در بخش قبلی انجام می دادیم. این مثال به خوبی کاربرد دستور while را نشان می دهد.

دستورات input و if را به داخل حلقه while منتقل می کنیم و پیش از شروع حلقه while، متغیر running را برابر True قرار می دهیم. ابتدا بررسی می کنیم که آیا متغیر running برابر True است یا خیر. سپس بلوک مربوط به while را، یعنی while-blockاجرا می شود. پس از اجرای این بلوک،شرط دوباره بررسی می شود؛ در اینجا این شرط همان متغیر running است. اگر مقدار آن True باشد، بلوک while دوباره اجرا می شود؛ در غیر این صورت، اجرای برنامه به بلوک else منتقل می شود و پس از آن به سراغ دستور بعدی می رود.

بلوک else زمانی اجرا می شود که شرط حلقۀ while برابر False (نادرست) شود؛ حتی ممکن است این اولین باری باشد که شرط بررسی می شود. اگر یک حلقۀ while دارای عبارت else باشد، همیشه اجرا می شود مگر اینکه با استفاده از دستور break از حلقه خارج شوید.

مقادیر True و False انواع بولی (Boolean types) نامیده می شوند و می توانید آن ها را به ترتیب معادل مقادیر 1 و 0 در نظر بگیرید.

نکته برای برنامه نویسان C++/C

به خاطر داشته باشید که حلقه while نیز می تواند دارای عبارت else باشد.

حلقۀ for

دستور for..in یکی دیگر از دستورات حلقه ای است که روی یک دنباله از اشیا تکرار انجام می دهد؛ یعنی تک تک آیتم های موجود در یک دنباله را بررسی می کند. در فصل های بعد دربارۀ sequences با جزئیات بیشتری بحث خواهیم کرد. چیزی که در حال حاضر کافی است بدانید این است که یک دنباله، مجموعه ای مرتب از آیتم ها است.

مثال را با نام for.py ذخیره کنید.

for i in range(1, 5):
    print(i)
else:
    print('The for loop is over')

خروجی:

$ python for.py
1
2
3
4
The for loop is over

نحوۀ عملکرد

در این برنامه، یک دنباله از اعداد را چاپ می کنیم. این دنباله را با استفاده از تابع داخلی range ایجاد می کنیم.

در اینجا دو عدد به range می دهیم و range دنباله ای از اعداد را باز می گرداند که از عدد اول شروع شده و تا قبل از عدد دوم ادامه دارد. برای مثال، range(1,5) دنبالۀ [1,2,3,4] را ایجاد می کند. به صورت پیش فرض، range گام را برابر 1 در نظر می گیرد. اگر عدد سومی را به range بدهیم، آن عدد به عنوان گام استفاده می شود. برای مثال، range(1,5,2) دنبالۀ [1,3] را ایجاد می کند. به خاطر داشته باشید که range تا قبل از عدد دوم ادامه پیدا می کند؛ یعنی دنباله شامل عدد دوم نمی شود.

توجه کنید که ()range در هر لحظه فقط یک عدد را تولید می کند. اگر فهرست کامل اعداد را می خواهید، می توانید روی ()range تابع ()list را فراخوانی کنید. به عنوان مثال، list(range(5)) نتیجۀ [0,1,2,3,4] را به دنبال خواهد داشت. لیست ها (lists) در data structures chapter توضیح داده خواهند شد.

سپس حلقۀ for روی این محدوده تکرار انجام می دهد. عبارت for i in range(1,5) معادل است با for i in [1,2,3,4]؛ یعنی هر عدد (یا به طور کلی هر شئ) موجود در دنباله، یکی یکی به i اختصاص داده می شود و سپس بلوک دستورات برای هر مقدار i اجرا می شود. در این مثال، تنها کاری که انجام می دهیم این است که مقدار را درون بلوک پرینت می کنیم.

به خاطر داشته باشید که بخش else اختیاری است. زمانی که بخش else وجود داشته باشد پس از پایان حلقۀ for اجرا می شود؛ مگر اینکه یک دستور break اجرا شود.

به یاد داشته باشید که حلقۀ for..in برای هر نوع دنباله ای قابل استفاده است. در اینجا یک لیست از اعداد داریم که با استفاده از تابع داخلی range ساخته شده است، اما به طور کلی می توانیم از هر نوع دنباله ای شامل هر نوع شئ استفاده کنیم! در فصل های بعد این موضوع را با جزئیات بیشتری مورد بررسی قرار خواهیم داد.

نکته برای برنامه نویسان #C++/C/Java/C

حلقۀ for در پایتون تفاوت اساسی با حلقۀ for در C++/C دارد. برنامه نویسان #C توجه خواهند کرد که حلقه for در پایتون شبیه حلقۀ foreach در #C است. برنامه نویسان Java نیز متوجه خواهند شد که این حلقه به ساختار for(int i: IntArray) در Java 1.5 شباهت دارد.

در C++/C، اگر بخواهید بنویسید for (int i = 0; i < 5; i++)، در پایتون فقط باید بنویسید for i in range(0,5). همانطور که می بینید، حلقه for در پایتون ساده تر، گویاتر و کم خطاتر است.

دستور break

دستور break برای خارج شدن از یک حلقه استفاده می شود؛ یعنی اجرای دستور حلقه ای را متوقف می کند، حتی اگر شرط حلقه هنوز False نشده باشد یا تمام آیتم های دنباله هنوز به طور کامل تکرار نشده باشند.

نکتۀ مهم این است که اگر با استفاده از break از یک حلقۀ for یا while خارج شوید، بلوک else مربوط به آن حلقه اجرا نخواهد شد.

مثال را تحت عنوان break.py ذخیره کنید.

while True:
    s = input('Enter something : ')
    if s == 'quit':
        break
    print('Length of the string is', len(s))
print('Done')

خروجی:

$ python break.py
Enter something : Programming is fun
Length of the string is 18
Enter something : When the work is done
Length of the string is 21
Enter something : if you wanna make your work also fun:
Length of the string is 37
Enter something : use Python!
Length of the string is 11
Enter something : quit
Done

نحوۀ عملکرد

در این برنامه، به طور مکرر ورودی کاربر را دریافت کرده و هر بار طول هر ورودی را پرینت می کنیم. یک شرط خاص برای متوقف کردن برنامه تعیین کرده ایم؛ بررسی می کنیم که آیا ورودی کاربر برابر با 'quit' است یا خیر. با استفاده از break از حلقه خارج می شویم و به انتهای برنامه می رسیم.

طول یک رشته ورودی را می توان با تابع داخلی len به دست آورد.

به خاطر داشته باشید که دستور break را می توان با حلقۀ for نیز استفاده کرد.

پایتون شاعرانه Swaroop

ورودی ای که در اینجا استفاده کرده ام، شعری کوتاه است که خودم نوشته ام:

Programming is fun
When the work is done
if you wanna make your work also fun:
    use Python!

دستور continue

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

مثال را با نام continue.py ذخیره کنید.

while True:
    s = input('Enter something : ')
    if s == 'quit':
        break
    if len(s) < 3:
        print('Too small')
        continue
    print('Input is of sufficient length')
    # Do other kinds of processing here...

خروجی:

$ python continue.py
Enter something : a
Too small
Enter something : 12
Too small
Enter something : abc
Input is of sufficient length
Enter something : quit

نحوۀ عملکرد

در این برنامه، ورودی را از کاربر می پذیریم، اما زمانی آن را پردازش می کنیم که رشته ورودی حداقل 3 کاراکتر را داشته باشد. بنابراین، با استفاده از تابع داخلی len طول رشته را به دست می آوریم و اگر طول آن کمتر از 3 کاراکتر باشد، با استفاده از دستور continue باقی دستورات موجود در بلوک را رد می کنیم. در غیر این صورت، باقی دستورات حلقه اجرا می شوند و هر نوع پردازشی را که بخواهیم می توانیم دراینجا انجام دهیم.

توجه داشته باشید که دستور continue با حلقه for نیز کار می کند.

جمع بندی

در این فصل نحوۀ استفاده از سه دستور جریان کنترل، یعنی if, while و for را همراه با دستورات مرتبط break و continue بررسی کردیم. این دستورات از پرکاربردترین بخش های زبان پایتون هستند؛ بنابراین تسلط بر استفاده از آنها ضروری است.

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

results matching ""

    No results matching ""