Table of Contents
آشنایی عمیقتر با حلقهٔ `while`
در این بخش با جزئیات عملی حلقهٔ while در پایتون کار میکنیم و میبینیم چطور میتوانیم تکرار را بر اساس یک «شرط» کنترل کنیم.
ساختار کلی حلقهٔ `while`
ساختار کلی حلقهٔ while به این شکل است:
while شرط:
دستور_۱
دستور_۲
...معنی آن:
- تا زمانی که
شرطمقدارTrueداشته باشد، - دستورات داخل بلوک
whileبارها و بارها اجرا میشوند. - به محض اینکه
شرطFalseشود، حلقه متوقف میشود و برنامه از خط بعد از حلقه ادامه پیدا میکند.
مثال ساده:
count = 1
while count <= 5:
print("عدد:", count)
count = count + 1
print("پایان حلقه")خروجی:
عدد: 1
عدد: 2
عدد: 3
عدد: 4
عدد: 5
پایان حلقهنکات مهم:
- متغیر
countقبل از حلقه مقداردهی شده است. - درون حلقه مقدار
countتغییر میکند (count = count + 1). - اگر مقدار
countرا تغییر ندهیم، شرط ممکن است همیشهTrueبماند و حلقه هیچوقت تمام نشود.
نقش «شرط» در حلقهٔ `while`
حلقهٔ while کاملاً به شرط وابسته است. این شرط میتواند از:
- عملگرهای مقایسهای (مثل
==,<,>,<=,>=,!=) - عملگرهای منطقی (مثل
and,or,not) - ترکیبی از چند مقایسه
ساخته شود.
مثال: تکرار تا وقتی کاربر عدد مثبت وارد کند:
number = int(input("یک عدد (مثبت برای ادامه، صفر یا منفی برای خروج): "))
while number > 0:
print("شما عدد مثبت وارد کردید:", number)
number = int(input("یک عدد دیگر: "))
print("برنامه تمام شد.")در اینجا:
- شرط حلقه
number > 0است. - هر بار داخل حلقه ورودی جدید میگیریم تا شرط دوباره بررسی شود.
حلقهٔ `while` و شمارنده (counter)
الگوی بسیار رایج در استفاده از while، داشتن یک «شمارنده» است که تعداد دفعات تکرار را کنترل میکند.
مثال: چاپ ۱۰ بار یک پیام
i = 0 # مقدار شروع
while i < 10: # تا وقتی i کمتر از ۱۰ است
print("سلام", i)
i = i + 1 # افزایش شمارنده
print("حلقه تمام شد.")این الگو را زیاد خواهید دید:
i = مقدار_شروع
while شرط_مربوط_به_i:
...
i = i + 1
میتوانید با i = i - 1 از بالا به پایین هم بشمارید:
i = 5
while i > 0:
print(i)
i = i - 1
print("تمام")حلقهٔ `while` و ورودی کاربر (Loop تا زمان خواستهٔ کاربر)
یک کاربرد مهم while این است که برنامه را «تعاملی» کند؛ یعنی تا وقتی کاربر بخواهد، برنامه ادامه دهد.
مثال: منوی ساده
choice = ""
while choice != "3":
print("منو:")
print("1. سلام کردن")
print("2. جمع دو عدد")
print("3. خروج")
choice = input("گزینه را انتخاب کنید: ")
if choice == "1":
print("سلام کاربر عزیز!")
elif choice == "2":
a = int(input("عدد اول: "))
b = int(input("عدد دوم: "))
print("جمع:", a + b)
elif choice == "3":
print("در حال خروج...")
else:
print("گزینه نامعتبر!")
print("برنامه بسته شد.")در این برنامه:
- تا زمانی که کاربر گزینهٔ
"3"را انتخاب نکند، منو به نمایش در میآید. - شرط توقف حلقه، وابسته به ورودی کاربر است، نه فقط یک شمارندهٔ عددی.
حلقههای `while` بینهایت و کنترل دستی خروج
گاهی میخواهیم حلقه «از نظر تئوری» بینهایت باشد و خودمان با break (که در فصل مربوط توضیح داده میشود) یا با یک شرط داخلی آن را قطع کنیم. این الگو را خیلی میبینید:
while True:
command = input("دستور را وارد کنید (exit برای خروج): ")
if command == "exit":
print("خروج از برنامه")
break
print("شما نوشتید:", command)در اینجا:
- شرط
while Trueیعنی حلقه همیشه باید ادامه داشته باشد. - ولی داخل حلقه، اگر کاربر
"exit"بنویسد، باbreakاز حلقه بیرون میرویم. - این ترکیب در برنامههای تعاملی و سرورها و … کاربرد زیادی دارد.
(جزئیات break و continue در بخش مخصوص خودشان بررسی میشود.)
حلقهٔ `while` با شرطهای ترکیبی
میتوانید شرطهای پیچیدهتری بسازید؛ مثلاً هم حواستان به تعداد دفعات تکرار باشد، هم به ورودی کاربر.
مثال: حداکثر ۳ بار فرصت ورود رمز:
correct_password = "python123"
tries = 0
max_tries = 3
password = input("رمز عبور را وارد کنید: ")
while password != correct_password and tries < max_tries - 1:
print("رمز اشتباه است. دوباره تلاش کنید.")
tries = tries + 1
password = input("رمز عبور را وارد کنید: ")
if password == correct_password:
print("ورود موفق!")
else:
print("تعداد تلاشها تمام شد. دسترسی مسدود شد.")در این مثال:
- شرط حلقه این است که هم رمز اشتباه باشد، هم هنوز به حداکثر تلاش نرسیده باشیم.
- از عملگر منطقی
andبرای ترکیب دو شرط استفاده شده است.
حلقهٔ `while` و تغییر حالت (state)
بعضی وقتها از while برای شبیهسازی یک وضعیت (state) در برنامه استفاده میکنیم. یعنی متغیرهایی داریم که وضعیت فعلی را نشان میدهند و تا وقتی وضعیت به حالت خاصی نرسد، برنامه ادامه میدهد.
مثال: شمارش پسانداز تا رسیدن به هدف
فرض کنید هر ماه مقدار ثابتی پول ذخیره میکنید و میخواهید بدانید چند ماه طول میکشد تا به هدف برسید.
target = 1000000 # هدف: یک میلیون
balance = 0 # موجودی فعلی
monthly_save = 120000
months = 0
while balance < target:
balance = balance + monthly_save
months = months + 1
print("ماه", months, "- موجودی:", balance)
print("در", months, "ماه به هدف رسیدید.")اینجا:
- وضعیت سیستم با
balance(موجودی) وmonths(تعداد ماهها) مشخص میشود. - تا وقتی وضعیت به هدف نرسیده (
balance < target)، حلقه ادامه دارد.
خطای رایج: حلقهٔ بینهایت ناخواسته
یکی از اشتباهات متداول در استفاده از while، درست نکردن شرط بهدرستی است؛ طوری که حلقه هیچوقت تمام نشود.
مثال بد:
x = 0
while x < 5:
print(x)
# x را تغییر نمیدهیم!در این کد:
- مقدار
xهمیشه0میماند. - شرط
x < 5همیشهTrueاست. - برنامه بیوقفه
0را چاپ میکند و تمام نمیشود.
راهحل
۱. همیشه بررسی کنید که:
- کدام متغیر در شرط آمده؟
- آیا داخل حلقه مقدار این متغیر تغییر میکند؟
۲. اگر از کاربران ورودی میگیرید، مطمئن شوید در هر تکرار که لازم است، ورودی جدید میگیرید؛ وگرنه شرط بر همان مقدار قبلی «گیر میکند».
مثال اصلاحشده:
x = 0
while x < 5:
print(x)
x = x + 1حلقههای `while` تو در تو (مقدماتی)
ممکن است یک حلقهٔ while را درون حلقهٔ while دیگر قرار دهید. این کار زمانی مفید است که با ساختارهای تکراری دوبخشی سر و کار دارید (مثلاً سطر و ستون).
مثال بسیار ساده:
row = 1
while row <= 3:
col = 1
while col <= 4:
print("row:", row, "col:", col)
col = col + 1
row = row + 1خروجی:
row: 1 col: 1
row: 1 col: 2
row: 1 col: 3
row: 1 col: 4
row: 2 col: 1
...
row: 3 col: 4نکتهها:
- در هر تکرار حلقهٔ بیرونی، حلقهٔ درونی کامل اجرا میشود.
- باید حواستان به دو شمارندهٔ جدا (
rowوcol) و شرطهایشان باشد. - حلقههای تو در تو را ساده و قابلفهم نگه دارید تا گیج نشوید.
چند تمرین پیشنهادی با حلقهٔ `while`
برای تثبیت یادگیری، چند ایدهٔ تمرینی:
- برنامهای بنویسید که:
- از کاربر عدد بگیرد،
- تا وقتی عدد مثبت است، مجموع آنها را ذخیره کند،
- به محض اینکه عدد صفر یا منفی وارد شد، مجموع اعداد مثبت را چاپ کند.
- جدول ضرب یک عدد را با
whileچاپ کنید. مثلاً اگر کاربر6را وارد کرد، خروجی چیزی مثل این باشد:
6 x 1 = 6
6 x 2 = 12
...
6 x 10 = 60- برنامهای شبیه حدس عدد بسازید:
- یک عدد ثابت در نظر بگیرید (مثلاً
23). - از کاربر بخواهید عددی حدس بزند.
- تا وقتی حدس کاربر اشتباه است، پیام مناسب چاپ کنید (بگوید بزرگتر حدس بزند یا کوچکتر) و دوباره حدس بگیرد.
- وقتی درست حدس زد، تعداد تلاشها را اعلام کنید.
در این فصل یاد گرفتید که چطور با استفاده از while، تکرار را بر اساس شرط کنترل کنید و حلقههایی بنویسید که تا رسیدن به یک وضعیت خاص ادامه مییابند. در بخشهای بعدی، با دیگر انواع حلقهها و کنترل بیشتر روی جریان اجرای آنها آشنا میشوید.