مقدمه

ساختارهای تکرار یکی از مهمترین و کلیدی‌ترین مؤلفه‌های یک زبان برنامه‌نویسی مثل پایتون محسوب می‌شوند. با یکی از این ساختارها، یعنی حلقه‌ی تکرار for، در درس‌های قبلی آشنا شدیم و در اینجا قصد داریم یک ساختار تکرار دیگر در پایتون، یعنی حلقه‌ی تکرار while را مورد بررسی قرار دهیم.

سینتکس حلقه while

دیدیم که حلقه‌ی for برای پیمایش روی کالکشن‌ها کاربرد دارد؛ یعنی مجموعه‌ی مشخصی از دستورات را به ازای هر عضو یک کالکشن، یک بار تکرار می‌کند. اما حلقه‌ی while مجموعه‌ای از دستورات را تا زمانی که شرط مشخصی برقرار باشد، تکرار می‌کند. ساختار کلی حلقه‌ی while به صورت زیر است.

while condition: 
  // loop body

در این سینتکس، اگر condition یک عبارت Truthy باشد، دستور یا دستورات مربوط به بلاک while اجرا می‌شوند. سپس، یک بار دیگر عبارت condition ارزیابی شده و اگر Truthy باشد، دستورات یک بار دیگر اجرا می‌شوند. وقتی condition یک مقدار Falsy باشد، حلقه متوقف می‌شود.

حلقه‌ی زیر باعث چاپ اعداد ۱ تا ۵ در خروجی می‌شود.

Copy Icon while_loops.py
number = 1 

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

در این مثال، وقتی برنامه به حلقه‌ی while می‌رسد، مقدار متغیر number برابر با 1 است و بنابراین، شرط حلقه برقرار است و نتیجتاً دو دستور بلاک حلقه اجرا می‌شوند. به این ترتیب، ابتدا مقدار 1 در خروجی چاپ شده و سوس، یک واحد به متغیر number اضافه می‌شود. حالا این متغیر دارای مقدار 2 است و بنابراین، شرط حلقه همچنان برقرار است و از این‌رو، دستورات حلقه یک بار دیگر اجرا می‌شوند. وقتی مقدار متغیر number به 6 می‌رسد، شرط حلقه دیگر برقرار نیست و بنابراین، برنامه از حلقه خارج می‌شود.

در مثال بالا شرط حلقه یک عبارت بولین است؛ یعنی عبارتی که با یکی از دو مقدار True یا False ارزیابی می‌شود. اما عبارات غیر بولین هم می‌توانند به عنوان شرط حلقه به کار روند. در این صورت، این عبارت به طور ضمنی به بولین تبدیل می‌شود. مثال زیر را ببینید.

Copy Icon while_loops.py
number = 5 

while number: 
  print(number)
  number -= 1

در اینجا شرط حلقه به یک مقدار صحیح ارزیابی می‌شود و می‌دانیم که صفر تنها عدد صحیح Falsy است. بنابراین، این حلقه تا زمانی که متغیر number به مقدار صفر نرسیده باشد، اجرا می‌شود. پس، خروجی کد بالا، اعداد 5 تا 1 است.

یادآوری می‌کنم که صفر، None، False و کالکشن‌های خالی مقادیر Falsy هستند و هر مقدار دیگری یک مقدار Truthy است.

تعیین زمان توقف برنامه توسط کاربر

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

Copy Icon 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 این مورد را اصلاح می‌کنیم.

Copy Icon 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 می‌توانیم حلقه‌هایی داشته باشیم که علاوه بر ابتدا و انتهای بلاک، بتوانند در هر نفطه‌ی دیگر از بلاک نیز متوقف شوند. مثال زیر را ببینید.

Copy Icon 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 برای چاپ اعداد فرد یک‌رقمی استفاده شده است.

Copy Icon while_loops.py
number = 0
while number < 10:
  number += 1
  if number % 2 == 0:
    continue
             
  print(number)