سینتکس حلقه while
دیدیم که حلقهی for برای پیمایش روی کالکشنها کاربرد دارد؛
یعنی مجموعهی مشخصی از دستورات را به ازای هر عضو یک کالکشن، یک بار تکرار میکند.
اما حلقهی while مجموعهای از دستورات را تا زمانی که شرط مشخصی برقرار باشد، تکرار
میکند.
ساختار کلی حلقهی while به صورت زیر است.
در این سینتکس، اگر condition یک عبارت Truthy باشد، دستور یا دستورات
مربوط به بلاک while اجرا میشوند. سپس، یک بار دیگر عبارت
condition ارزیابی شده و اگر Truthy باشد، دستورات یک بار دیگر
اجرا میشوند. وقتی condition یک مقدار Falsy باشد،
حلقه متوقف میشود.
حلقهی زیر باعث چاپ اعداد ۱ تا ۵ در خروجی میشود.
while_loops.py
number = 1
while number <= 5:
print(number)
number += 1
در این مثال، وقتی برنامه به حلقهی while میرسد، مقدار متغیر number برابر با 1
است و
بنابراین، شرط حلقه برقرار است و نتیجتاً دو دستور بلاک حلقه اجرا میشوند. به این ترتیب،
ابتدا مقدار 1 در خروجی چاپ شده و سوس، یک واحد به متغیر number اضافه میشود.
حالا این متغیر دارای مقدار 2 است و بنابراین، شرط حلقه همچنان برقرار است و از اینرو،
دستورات حلقه یک بار دیگر اجرا میشوند. وقتی مقدار متغیر number به 6 میرسد، شرط
حلقه دیگر برقرار نیست و بنابراین، برنامه از حلقه خارج میشود.
در مثال بالا شرط حلقه یک عبارت بولین است؛ یعنی عبارتی که با یکی از دو مقدار True یا
False ارزیابی میشود. اما عبارات غیر بولین هم میتوانند به عنوان شرط حلقه
به کار روند. در این صورت، این عبارت به طور ضمنی به بولین تبدیل میشود. مثال زیر را ببینید.
while_loops.py
number = 5
while number:
print(number)
number -= 1
در اینجا شرط حلقه به یک مقدار صحیح ارزیابی میشود و میدانیم که
صفر تنها عدد صحیح Falsy است. بنابراین، این حلقه تا زمانی که
متغیر number به مقدار صفر نرسیده باشد، اجرا میشود.
پس، خروجی کد بالا، اعداد 5 تا 1 است.
یادآوری میکنم که صفر، None، False و کالکشنهای خالی مقادیر Falsy
هستند
و هر مقدار دیگری یک مقدار Truthy است.
تعیین زمان توقف برنامه توسط کاربر
حالا فرض کنید میخواهیم برنامهای بنویسیم که یک عبارت متنی را از
کاربر دریافت کند و آن را در خروجی نمایش دهد و این کار را تا زمانی که
کاربر عبارت مشخصی مثل quit را وارد نکرده، ادامه دهیم.
این برنامه را میتوانیم با استفاده از یک حلقهی while به صورت زیر پیادهسازی کنیم.
while_loops.py
prompt = "\nTell me something, and I will repeat it back to you:"
prompt += "\nEnter 'quit' to end the program. "
message = ""
while message != 'quit':
message = input(prompt)
print(message)
در اینجا وقتی برنامه به حلقهی while میرسد، مقدار متغیر message یک
رشتهی خالی است. بنابراین، شرط حلقه یعنی یکی نبودن مقدار message و رشتهی quit برقرار
است و نتیجتاً بلاک حلقه اجرا میشود. در نتیجه، مقدار متغیر
prompt در خروجی نمایش داده شده و ورودی کاربر در متغیر message ذخیره میشود.
تا زمانی که هر مقداری غیر از quit توسط کاربر وارد شود، شرط حلقه همچنان
برقرار است اما وقتی کاربر مقدار quit را وارد کند، حلقه متوقف شده
و برنامه به پایان میرسد.
این برنامه یک ایراد جزئی دارد و آن این است که وقتی کاربر
عبارت quit را وارد کند، ابتدا این عبارت چاپ شده و سپس، برنامه خاتمه مییابد.
بهتر است که عبارت quit در خروجی نمایش داده نشود. با استفاده از یک
گزارهی if این مورد را اصلاح میکنیم.
while_loops.py
prompt = "\nTell me something, and I will repeat it back to you:"
prompt += "\nEnter 'quit' to end the program. "
message = ""
while message != 'quit':
message = input(prompt)
if message != 'quit':
print(message)
کاربرد break و continue
با استفاده از گزارهی break میتوانیم در هر جایی از حلقه که مایلیم،
دستور توقف حلقه را صادر کنیم. در واقع، پایتون با دیدن یک گزارهی break،
بدون توجه به برقرار بودن یا نبودن شرط حلقه، آن را به پایان میرساند.
با تزکیب حلقههای نامتناهی، یعنی حلقههایی که شرطشان همواره برقرار است، با
گزارهی break میتوانیم حلقههایی داشته باشیم که علاوه بر ابتدا و انتهای بلاک،
بتوانند در هر نفطهی دیگر از بلاک نیز
متوقف شوند. مثال زیر را ببینید.
while_loops.py
prompt = "\nPlease enter the name of a city you have visited:"
prompt += "\n(Enter 'quit' when you are finished.) "
while True:
city = input(prompt)
if city == 'quit':
break
else:
print(f"I'd love to go to {city.title()}!")
در اینجا از کاربر خواسته میشود تا نام یک شهر را که تجربهی سفر به
آن را دارد، وارد کند. اگر کاربر عبارت quit را وارد
کند، حلقه بلافاصله به پایان میرسد اما در غیر این صورت،
پیامی در خروجی نمایش داده میشود.
گزارهی continue یک ورژن لایت از break محسوب میشود. چون
بر خلاف break که حکم به توقف کل حلقه میدهد، گزارهی continue
تکرار جاری را متوقف میکند و حلقه را به تکرار بعدی میفرستند.
در حلقهی زیر از یک گزارهی continue برای چاپ اعداد فرد یکرقمی استفاده شده است.
while_loops.py
number = 0
while number < 10:
number += 1
if number % 2 == 0:
continue
print(number)