پرهیز از حلقه‌های بی‌پایان

هر حلقه‌ی while به روشی برای توقّف اجرا نیاز دارد تا اجرای آن برای همیشه ادامه نیابد. برای مثال این حلقه‌ی شمارنده باید از ۱ تا ۵ بشمارد:

1
2
3
4
5
x = 1

while x <= 5:
    print(x)
    x += 1

امّا اگر همان‌طور که در ادامه می‌آید، سهواً خط x += 1 را حذف کنید حلقه تا ابد اجرا می‌شود:

1
2
3
4
5
# This loop runs forever!
x = 1

while x <= 5:
    print(x)

اکنون مقدار x از ۱ شروع می‌شود امّا هرگز تغییر نمی‌کند. در نتیجه آزمون شرطی x <= 5 همواره True ارزیابی می‌شود و حلقه‌ی while برای همیشه اجرا شده و دنباله‌ای از ۱ها چاپ می‌کند:

1
2
3
4
5
1
1
1
1
--snip--

هر برنامه‌نویسی گاه به گاه و به صورت اتّفاقی حلقه‌ی while بی‌پایان می‌نویسد، به ویژه زمانی که حلقه‌های برنامه شرط‌های خروج ظریف و دیرفهمی دارند. اگر برنامه‌ی شما در یک حلقه‌ی بی‌پایان گیر کرد CTRL-C را فشار دهید یا به سادگی پنجره‌ی ترمینالی را که خروجی‌ برنامه را نشان می‌دهد ببندید.

برای پرهیز از نوشتن حلقه‌های بی‌پایان، هر حلقه‌ی while را بیازمایید و مطمئن شوید اجرای آن در زمانی که شما انتظار دارید متوقّف می‌شود. اگر از برنامه می‌خواهید که با دریافت یک ورودی مشخّص پایان یابد، آن را اجرا کنید و آن مقدار را وارد کنید. اگر برنامه پایان نیافت، روش برنامه را پایان دادنِ به حلقه، موشکافانه مورد بررسی قرار دهید.

نکته
Sublime Text و برخی دیگر از ویرایشگرها یک پنجره‌ی خروجی درونی دارند که ممکن است متوقّف کردن یک حلقه‌ی بی‌پایان را مشکل کند و شما را مجبور کند که خود ویرایشگر را برای پایان دادن به حلقه ببندید. سعی کنید پیش از فشردن CTRL+C روی ناحیه‌ی پنجره‌ی خروجی کلیک کنید تا قادر باشید حلقه‌ی بی‌پایان را متوقّف کنید.

خودآزمایی

مواد روی پیتزا

حلقه‌ای بنویسید که از کاربران بخواهد پیش از وارد کردن مقدار ‘quit’، مجموعه‌ای از مواد روی پیتزا را وارد کنند. همزمان که موارد را وارد می‌کنند، پیامی چاپ کنید که می‌گوید شما آن مورد را به پیتزا اضافه خواهید کرد.

بلیت‌های سینما

یک سالن سینما قیمت بلیت‌ها را بر اساس سنّ فرد تعیین می‌کند. اگر فرد کمتر از ۳ سال سن داشته باشد، بلیت او رایگان است؛ اگر بین ۳ تا ۱۲ سال داشته باشند باید ۱۰ دلار بپردازند و اگر بیش از ۱۲ سال سن داشته باشند بلیت آن‌ها ۱۵ دلار خواهد بود. حلقه‌ای بنویسید که در آن سن کاربران پرسیده شده و سپس قیمت بلیت آن‌ها اعلام می‌شود.

سه خروجی

نسخه‌های متفاوتی از تمرین ۷-۴ یا ۷-۵ بنویسید که کارهای زیر را حدّاقل یک بار انجام دهد:

  • در عبارت while یک آزمون شرطی بیاورید که اجرای حلقه را متوقّف کند.
  • از یک متغیّر فعّال بودن استفاده کنید تا مدّت زمان اجرای حلقه را کنترل کنید.
  • هنگامی که کاربر مقدار ‘quit’ را وارد می‌کند، از یک عبارت break برای خروج از حلقه استفاده کنید.

بی‌پایانی

حلقه‌ای بنویسید که هیچ‌گاه پایان نمی‌یابد و آن را اجرا کنید. (برای پایان دادن به این حلقه CTRL+C را فشار دهید یا پنجره‌ای که خروجی را نشان می‌دهد ببندید.)