مقدمه

دیدیم که حلقه‌ی for برای پیمایش روی لیست‌ها و دیکشنری‌ها خیلی مفید است. اما اگر بخواهیم یک لیست را در حین پیمایش با for تغییر دهیم و مثلاً عنصری به آن اضاقه یا از آن حذف کنیم، این کار می‌تواند مشکلاتی را به بار بیاورد. زیرا در حالی که پایتون در حال پیمایش روی لیست است، با تغییراتی در طول یا ترتیب عناصر لیست مواجه می‌شود که می‌تواند باعث تولید نتایج غیر منتظره‌ای شود. بنابراین، توصیه شده که در چنین مواردی از حلقه‌ی while استفاده کنیم که به ما امکان می‌دهد کنترل بهتری روی شرایط و پایان حلقه داشته باشیم. علاوه بر این، با استفاده از حلقه‌ی while به همراه لیست‌ها و دیکشنری‌ها، می‌توانیم اطلاعات زیادی را از ورودی دریافت کنیم و آنها را پردازش کنیم.

انتقال آیتم‌های یک لیست به لیستی دیگر

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

فرض کنید لیستی داریم از کاربرانی که در سایت ما عضو شده‌اند اما هنوز عضویت آنها تأیید نشده است. می‌خواهیم بعد از تأیید، این کاربران به یک لیست دیگر منتقل شوند، به‌گونه‌ای که لیست اول خالی شود. در کد زیر، لیست کاربران عضو شده را registered_users نامیده‌ایم و لیست مقصد را که کاربران بعد از تأیید به آنجا منتقل می‌شوند، confirmed_users نامیده‌ایم.

Copy Icon while_with_collections.py
registered_users = ["david", "jane", "alice"]
confimed_users = []
            
while registered_users:
  item = registered_users.pop()
  confimed_users.append(item)
            
print(f"Registered Users: {registered_users}")
print(f"Confirmed Users: {confimed_users}")

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

Registered Users: []
Confirmed Users: ['alice', 'jane', 'david']
          

حذف یک مقدار مشخص از لیست

در فصل سوم دیدیم که با استفاده از تابع remove() می‌توانیم آیتمی با یک مقدار مشخص را از یک لیست حذف کنیم. اما اگر آیتم مورد نظر بیش از یک بار در لیست تکرار شده باشد و بخواهیم همه‌ی این آیتم‌ها را حذف کنیم، می‌توانیم این کار را به کمک یک حلقه‌ی while انجام دهیم.

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

Copy Icon while_with_collections.py
pets = ['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
print(pets)
             
while 'cat' in pets:
  pets.remove('cat')
                
print(pets)

به این ترتیب، هر آیتمی که مقدارش cat باشد، از لیست حذف می‌شود و بنابراین، خروجی این کد به صورت زیر خواهد بود.

['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
['dog', 'dog', 'goldfish', 'rabbit']
          

ذخیره ورودی‌های کاربر در یک دیکشنری

یکی دیگر از مزایای استفاده از while به همراه کالکشن‌ها این است که می‌توانیم هر تعداد ورودی را از کاربر دریافت کنیم و آنها را در یک کالکشن مثل دیکشنری ذخیره کنیم.

فرض کنید قصد داریم یک نظرسنجی در مورد بهترین فوتبالیست تاریخ انجام دهیم و در پایان، پاسخ‌ها را نمایش دهیم. به کد زیر دقت کنید.

Copy Icon while_with_collections.py
responses = {}
polling_active = True
            
while polling_active:
  name = input("\nWhat is your name? ")
  response = input("Who is the best football player? ")
  responses[name] = response
  repeat = input("Would you like to let another person respond? (yes/ no) ")
  if repeat == 'no':
    polling_active = False
                
print("\n--- Poll Results ---")
for name, response in responses.items():
  print(f"{name} selects {response}.")

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