فهرست عناوین

موضوع قبلی

21. خلاصه

موضوع بعدی

23. پالایش‌ها: بخش ۱

22. برای مدّتی...

وقتی می‌خواهیم دستورهایی را تکرار کنیم تا موقعی که شرط خاصّی درست شود؛ پایتون با کلیدواژهٔ while‍‍ راه ساده‌تری را پیش روی ما می‌گذارد. مثلاً فرض کنید می‌خواهیم کاری کنیم که ریبرگ تا زمان رسیدن به دیوار به حرکت خودش ادامه بدهد. قبلاً شاید کاری مثل این می‌کردیم:

def  move_until_wall():
    if  front_is_clear():
        move()

repeat  42 :
    move_until_wall()

و امیدوار بودیم که تعداد تکرارها برای رسیدن به دیوار کافی می‌بود. حالا با استفاده از while می‌توانیم این را بنویسیم:

while  front_is_clear():
    move()

همین! دیگر نیازی نیست که بارها و بارها حدس بزنیم و کد را اجرا کنیم، تا ببینیم دفعات تکرار کد کافی هست، یا نه.

روندنمای این برنامهٔ ساده به این شکل است:

../../_images/while.png

22.1. چطور فرآیند گزارهٔ while را بفهمیم؟

این کد را فرض بگیرید:

while condition(): #تا موقعی که شرط برقرار هست
    do_1() # کار ۱
    do_2() # کار ۲
    do_3() # کار ۳

می‌توانید کد بالا را معادل این کد در نظر بگیرید:

if  condition(): # اگر شرط برقرار هست
    do_1() # کار ۱
    do_2() # کار ۲
    do_3() # کار ۳

if  condition(): # اگر شرط برقرار هست
    do_1() # کار ۱
    do_2() # کار ۲
    do_3() # کار ۳

if  condition(): # اگر شرط برقرار هست
    do_1() # کار ۱
    do_2() # کار ۲
    do_3() # کار ۳

if  condition(): # اگر شرط برقرار هست
    do_1() # کار ۱
    do_2() # کار ۲
    do_3() # کار ۳

....

که به این معنی هست که تکّه‌کد تا موقعی که شرط درست (True) باشد، تکرار می‌شود. خب، حالا اگر شرط همیشه درست (True) باشد چه؟ تکّه‌کد برای همیشه تکرار می‌شود و برنامه هیچ وقت تمام نمی شود.

این طوری خیلی بد است.

به جای بیان این وضعیت به عنوان بندهای تکراری کد، ‌برنامه‌نویس‌ها این وضعیّت را با عنوان حلقه توصیف می‌کنند. یعنی، شما با دستور اوّل داخل تکّه‌کد شروع می‌کنید (()do_1) و بقیّهٔ دستورها را هم تا موقعی که به دستور آخر (()do_3) برسید اجرا می‌کنید. بعد برای محک شرط حلقه دوباره برمی گردید به قسمت بررسی شرط قبل از تکّه‌کد. اگر شرط هنوز برقرار بود؛ یک بار دیگه این تکّه‌کد داخل حلقه را تکرار می‌کنید. اگر شرط حلقه هیچ وقت False نشود شما همین طور به تکرار دستورهای داخل حلقه ادامه می‌دهید و به یک حلقهٔ بی پایان می‌رسید.

نتیجه گیری: همیشه بررسی کنید و اطمینان حاصل کنید که شرط حلقه یک جایی غلط False بشود .

22.2. بازگشت به مسابقات دو با مانع!

نوبت شما!

به مسئله‌های با مانع ۱ و با مانع ۲ و با مانع ۳ برگردید و این بار با while و بدون repeat برنامه‌ای بنویسید که در هر سه تا محیط کار کند.

راهنمایی

برنامهٔتان می‌تواند این شکلی باشد:

 def  jump_over_hurdle():
    #تعریف مناسب

def  run_or_jump():
    # تعریف مناسب

while  not  at_goal():
    run_or_jump()

همین! دیگر نیازی به تکرارهای بی حساب و کتاب نیست! از این به بعد باید از repeat فقط موقعی استفاده کنید که دقیقاً می‌دانید یک تابع خاص چند دفعه باید تکرار شود.