آموزش پایتون, پایتون مقدماتی

حلقه while در پایتون؛ آموزش تکرار شرطی برای مبتدیان

حلقه while در پایتون

🗓 آخرین به‌روزرسانی:

حلقه while یکی از ابزارهای اصلی پایتون برای تکرار دستورها تا زمانی است که یک شرط برقرار باشد. این حلقه زمانی کاربرد دارد که از قبل نمی‌دانیم یک کار دقیقاً چند بار باید تکرار شود؛ برای مثال تا وقتی کاربر رمز درست را وارد کند، تا زمانی که موجودی حساب کافی باشد یا تا وقتی کاربر گزینه خروج را انتخاب کند.

این مطلب، درس دهم از دوره رایگان آموزش پایتون از صفر است. در درس قبلی با حلقه for و تابع range() آشنا شدیم. اکنون یاد می‌گیریم چگونه تکرار را براساس یک شرط کنترل کنیم.

حلقه while در پایتون چیست؟

واژه while به معنای «تا زمانی که» است. پایتون ابتدا شرط حلقه را بررسی می‌کند. اگر نتیجه شرط True باشد، دستورهای داخل حلقه اجرا می‌شوند. سپس شرط دوباره بررسی می‌شود و این روند تا زمانی ادامه پیدا می‌کند که شرط به False تبدیل شود.

count = 1

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

خروجی:

1
2
3
4
5

متغیر count از عدد ۱ شروع می‌شود. پس از هر بار اجرا یک واحد افزایش پیدا می‌کند. وقتی مقدار آن به ۶ برسد، شرط count <= 5 نادرست می‌شود و حلقه پایان می‌یابد.

ساختار اصلی حلقه while

ساختار عمومی حلقه while به شکل زیر است:

while condition:
    # دستورهایی که باید تکرار شوند

در این ساختار:

  • while آغاز حلقه است.
  • condition شرط ادامه تکرار است.
  • علامت دونقطه : پایان سرآیند حلقه را مشخص می‌کند.
  • دستورهای تورفته تا زمانی اجرا می‌شوند که شرط درست باشد.

سه بخش مهم یک حلقه شمارشی

در بسیاری از حلقه‌های while سه بخش اصلی وجود دارد:

  1. تعریف مقدار اولیه
  2. نوشتن شرط ادامه حلقه
  3. تغییر مقدار کنترل‌کننده در هر دور
number = 1          # مقدار اولیه

while number <= 3:  # شرط ادامه
    print(number)
    number += 1      # تغییر مقدار

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

اهمیت تورفتگی در حلقه while

پایتون با استفاده از تورفتگی مشخص می‌کند کدام دستورها داخل حلقه قرار دارند:

count = 1

while count <= 3:
    print("داخل حلقه")
    print(count)
    count += 1

print("حلقه تمام شد")

سه دستور تورفته در هر دور اجرا می‌شوند؛ اما پیام آخر فقط پس از پایان حلقه نمایش داده می‌شود.

نسخه زیر نادرست است:

count = 1
while count <= 3:
print(count)  # نادرست

این کد با خطای IndentationError روبه‌رو می‌شود.

شمارش صعودی با while

number = 1

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

در هر دور، مقدار متغیر number یک واحد افزایش پیدا می‌کند. می‌توان اندازه افزایش را تغییر داد:

number = 2

while number <= 10:
    print(number)
    number += 2

خروجی:

2
4
6
8
10

شمارش معکوس با while

برای شمارش معکوس، مقدار کنترل‌کننده را در هر دور کاهش می‌دهیم:

count = 5

while count > 0:
    print(count)
    count -= 1

print("شروع!")

خروجی:

5
4
3
2
1
شروع!

حلقه بی‌نهایت چیست؟

اگر شرط حلقه هیچ‌وقت نادرست نشود، حلقه برای همیشه ادامه پیدا می‌کند. به این وضعیت infinite loop یا حلقه بی‌نهایت گفته می‌شود.

count = 1

while count <= 5:
    print(count)

در این مثال مقدار count تغییر نمی‌کند؛ بنابراین شرط همیشه درست باقی می‌ماند و عدد ۱ به‌طور مداوم چاپ می‌شود.

نسخه درست:

count = 1

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

اگر هنگام تمرین به حلقه بی‌نهایت رسیدید، معمولاً می‌توانید اجرای برنامه را در ترمینال با کلیدهای Ctrl + C متوقف کنید.

حلقه while True

گاهی عمداً یک حلقه نامحدود می‌سازیم و خروج از آن را با یک شرط داخلی کنترل می‌کنیم:

while True:
    command = input("دستور را وارد کنید یا exit بنویسید: ").strip().lower()

    if command == "exit":
        break

    print("دستور دریافت شد:", command)

عبارت while True همیشه درست است؛ اما وقتی کاربر exit وارد کند، دستور break حلقه را متوقف می‌کند.

دستور break در حلقه while

دستور break حلقه را فوراً پایان می‌دهد:

number = 1

while number <= 10:
    if number == 6:
        break

    print(number)
    number += 1

خروجی:

1
2
3
4
5

وقتی مقدار number به ۶ می‌رسد، حلقه پیش از چاپ عدد ۶ متوقف می‌شود.

دستور continue در حلقه while

دستور continue ادامه همان دور را نادیده می‌گیرد و اجرای حلقه را از بررسی شرط دور بعدی ادامه می‌دهد.

number = 0

while number < 5:
    number += 1

    if number == 3:
        continue

    print(number)

خروجی:

1
2
4
5

عدد ۳ چاپ نمی‌شود، اما حلقه برای عددهای بعدی ادامه پیدا می‌کند.

نکته مهم درباره continue

در حلقه while باید مراقب باشیم دستور تغییر مقدار پیش از continue انجام شود. نسخه زیر ممکن است حلقه بی‌نهایت بسازد:

number = 1

while number <= 5:
    if number == 3:
        continue  # مقدار number دیگر تغییر نمی‌کند

    print(number)
    number += 1

وقتی مقدار به ۳ می‌رسد، برنامه همیشه به ابتدای حلقه برمی‌گردد و مقدار متغیر همان ۳ باقی می‌ماند.

بخش else در حلقه while

حلقه while می‌تواند بخش else داشته باشد. این بخش زمانی اجرا می‌شود که شرط حلقه به‌طور طبیعی نادرست شود:

count = 1

while count <= 3:
    print(count)
    count += 1
else:
    print("حلقه به‌طور کامل تمام شد")

اگر حلقه با break متوقف شود، بخش else اجرا نمی‌شود:

count = 1

while count <= 5:
    if count == 3:
        break

    print(count)
    count += 1
else:
    print("این پیام اجرا نمی‌شود")

دریافت ورودی تا زمان واردشدن مقدار معتبر

یکی از کاربردهای مهم while تکرار درخواست ورودی تا زمان دریافت مقدار معتبر است:

while True:
    age_text = input("سن خود را وارد کنید: ").strip()

    if age_text.isdigit():
        age = int(age_text)
        break

    print("لطفاً سن را فقط به‌صورت عدد وارد کنید.")

print("سن ثبت شد:", age)

اگر کاربر متن نامعتبر وارد کند، برنامه دوباره سؤال را نمایش می‌دهد. پس از واردشدن عدد معتبر، حلقه با break پایان می‌یابد.

اعتبارسنجی بازه عددی

while True:
    score = int(input("نمره‌ای بین صفر تا صد وارد کنید: "))

    if 0 <= score <= 100:
        break

    print("نمره باید بین صفر تا صد باشد.")

print("نمره معتبر:", score)

در برنامه حرفه‌ای بهتر است خطای تبدیل متن به عدد نیز با try و except مدیریت شود.

نمونه کامل مدیریت ورودی عددی

while True:
    try:
        number = int(input("یک عدد صحیح وارد کنید: "))
        break
    except ValueError:
        print("ورودی معتبر نیست. دوباره تلاش کنید.")

print("عدد ثبت‌شده:", number)

اگر ورودی قابل تبدیل به int نباشد، پیام خطا نمایش داده می‌شود و حلقه ادامه پیدا می‌کند.

برنامه ورود با تعداد تلاش محدود

correct_password = "python123"
attempts = 0
max_attempts = 3

while attempts < max_attempts:
    password = input("رمز عبور را وارد کنید: ")

    if password == correct_password:
        print("ورود موفق بود.")
        break

    attempts += 1
    remaining = max_attempts - attempts
    print("رمز نادرست است. تلاش باقی‌مانده:", remaining)
else:
    print("حساب به دلیل تلاش‌های ناموفق موقتاً مسدود شد.")

اگر رمز درست وارد شود، حلقه با break پایان می‌یابد. اگر سه تلاش ناموفق انجام شود، شرط حلقه نادرست شده و بخش else اجرا می‌شود.

ساخت منوی تعاملی با while

حلقه while برای برنامه‌هایی که باید تا انتخاب گزینه خروج ادامه پیدا کنند بسیار مناسب است:

while True:
    print("\n1. نمایش پیام")
    print("2. جمع دو عدد")
    print("3. خروج")

    choice = input("گزینه را انتخاب کنید: ").strip()

    if choice == "1":
        print("به برنامه پایتون خوش آمدید.")
    elif choice == "2":
        first = float(input("عدد اول: "))
        second = float(input("عدد دوم: "))
        print("حاصل جمع:", first + second)
    elif choice == "3":
        print("خروج از برنامه")
        break
    else:
        print("گزینه نامعتبر است.")

منو پس از انجام هر عملیات دوباره نمایش داده می‌شود و فقط با انتخاب گزینه ۳ پایان می‌یابد.

محاسبه مجموع عددها تا ورود صفر

total = 0

while True:
    number = float(input("عدد وارد کنید؛ برای پایان صفر بزنید: "))

    if number == 0:
        break

    total += number

print("مجموع عددها:", total)

در این مثال، صفر یک مقدار پایانی یا sentinel value است که پایان دریافت داده‌ها را مشخص می‌کند.

محاسبه تعداد و میانگین ورودی‌ها

total = 0
count = 0

while True:
    number = float(input("عدد وارد کنید؛ برای پایان صفر بزنید: "))

    if number == 0:
        break

    total += number
    count += 1

if count > 0:
    average = total / count
    print("تعداد:", count)
    print("مجموع:", total)
    print("میانگین:", average)
else:
    print("هیچ عددی وارد نشد.")

بررسی count > 0 از تقسیم بر صفر جلوگیری می‌کند.

حلقه‌های while تو در تو

می‌توان یک حلقه while را داخل حلقه دیگری قرار داد:

row = 1

while row <= 3:
    column = 1

    while column <= 3:
        print(f"سطر {row}، ستون {column}")
        column += 1

    row += 1

حلقه داخلی برای هر دور حلقه بیرونی به‌طور کامل اجرا می‌شود. در استفاده از حلقه‌های تو در تو باید مقدارهای کنترل‌کننده هر حلقه را جداگانه مدیریت کرد.

ساخت الگوی ستاره با while

row = 1

while row <= 5:
    print("*" * row)
    row += 1

خروجی:

*
**
***
****
*****

تفاوت حلقه for و while

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

برای نمایش عددهای ۱ تا ۱۰ معمولاً for انتخاب ساده‌تری است. برای درخواست رمز تا زمان دریافت پاسخ درست، while مناسب‌تر است.

خطاهای رایج در حلقه while

۱. فراموش‌کردن تغییر متغیر کنترل‌کننده

count = 1
while count <= 5:
    print(count)

این کد حلقه بی‌نهایت ایجاد می‌کند. باید مقدار count در هر دور تغییر کند.

۲. استفاده از شرط اشتباه

count = 1
while count >= 5:
    print(count)
    count += 1

شرط از همان ابتدا نادرست است؛ بنابراین حلقه حتی یک بار هم اجرا نمی‌شود.

۳. قراردادن تغییر مقدار در جای نادرست

اگر افزایش یا کاهش متغیر فقط داخل بعضی شاخه‌های شرط انجام شود، ممکن است در یک حالت خاص حلقه متوقف نشود.

۴. استفاده نادرست از continue

اگر continue پیش از تغییر متغیر اجرا شود، کنترل حلقه ممکن است روی یک مقدار ثابت بماند.

۵. فراموش‌کردن دونقطه یا تورفتگی

while count <= 5  # دونقطه فراموش شده
    print(count)

این اشتباه باعث خطای SyntaxError می‌شود.

۶. تبدیل‌نکردن ورودی عددی

number = input("عدد: ")
while number < 10:
    print(number)

خروجی input() رشته است و نمی‌توان آن را مستقیماً با عدد مقایسه کرد. باید از int() یا float() استفاده شود.

پروژه عملی: بازی حدس عدد

در این پروژه، برنامه یک عدد ثابت دارد و کاربر تا زمان حدس درست می‌تواند تلاش کند:

secret_number = 7
attempts = 0

while True:
    guess = int(input("یک عدد بین 1 تا 10 حدس بزنید: "))
    attempts += 1

    if guess == secret_number:
        print("آفرین! عدد را درست حدس زدید.")
        print("تعداد تلاش‌ها:", attempts)
        break
    elif guess < secret_number:
        print("عدد موردنظر بزرگ‌تر است.")
    else:
        print("عدد موردنظر کوچک‌تر است.")

این پروژه مفاهیم while، break، ورودی کاربر، شمارنده و شرط‌های چندشاخه را ترکیب می‌کند.

پروژه عملی: دستگاه خودپرداز ساده

balance = 1_000_000

while True:
    print("\n1. نمایش موجودی")
    print("2. برداشت وجه")
    print("3. واریز وجه")
    print("4. خروج")

    choice = input("انتخاب شما: ").strip()

    if choice == "1":
        print("موجودی:", balance)

    elif choice == "2":
        amount = int(input("مبلغ برداشت: "))

        if amount <= 0:
            print("مبلغ باید بیشتر از صفر باشد.")
        elif amount > balance:
            print("موجودی کافی نیست.")
        else:
            balance -= amount
            print("برداشت انجام شد. موجودی جدید:", balance)

    elif choice == "3":
        amount = int(input("مبلغ واریز: "))

        if amount > 0:
            balance += amount
            print("واریز انجام شد. موجودی جدید:", balance)
        else:
            print("مبلغ نامعتبر است.")

    elif choice == "4":
        print("خدانگهدار")
        break

    else:
        print("گزینه نامعتبر است.")

تمرین‌های درس حلقه while

  1. با استفاده از while عددهای ۱ تا ۲۰ را نمایش دهید.
  2. عددهای زوج بین ۲ تا ۳۰ را چاپ کنید.
  3. از عدد ۱۰ تا ۱ شمارش معکوس انجام دهید.
  4. یک عدد از کاربر بگیرید و مجموع عددهای ۱ تا آن عدد را محاسبه کنید.
  5. تا زمانی که کاربر عبارت stop را وارد نکرده است، متن‌های او را نمایش دهید.
  6. رمزی ثابت تعریف کنید و تا دریافت رمز درست، ورودی را تکرار کنید.
  7. برنامه‌ای بسازید که فقط عددی بین ۱ تا ۵ را قبول کند.
  8. مجموع عددهای واردشده را تا زمان ورود عدد صفر محاسبه کنید.
  9. بازی حدس عدد را با حداکثر پنج تلاش پیاده‌سازی کنید.

📌 همچنین بخوانید: بازار کار پایتون در ایران، نصب و تنظیم پایتون در VS Code و برنامه‌نویسی پایتون با گوشی

پرسش‌های متداول

حلقه while چه زمانی استفاده می‌شود؟

زمانی که تکرار باید تا برقرار بودن یک شرط ادامه پیدا کند و تعداد دقیق دفعات از قبل مشخص نیست.

چرا حلقه while من متوقف نمی‌شود؟

احتمالاً شرط همیشه درست باقی مانده یا متغیر کنترل‌کننده داخل حلقه تغییر نمی‌کند.

تفاوت break و continue چیست؟

break کل حلقه را پایان می‌دهد، اما continue فقط ادامه دور فعلی را نادیده می‌گیرد و به دور بعد می‌رود.

آیا while True اشتباه است؟

خیر. این ساختار برای منوها و برنامه‌های تعاملی رایج است، به شرط آنکه مسیر مشخصی مانند break برای خروج وجود داشته باشد.

آیا حلقه while بخش else دارد؟

بله. بخش else زمانی اجرا می‌شود که حلقه بدون اجرای break و به دلیل نادرست‌شدن شرط پایان یابد.

جمع‌بندی درس

در این درس آموختیم حلقه while تا زمانی اجرا می‌شود که شرط آن درست باشد. با شمارنده‌ها، حلقه بی‌نهایت، while True، دستورهای break و continue، بخش else، اعتبارسنجی ورودی، منوی تعاملی و حلقه‌های تو در تو آشنا شدیم. مهم‌ترین اصل در کار با while این است که همیشه مشخص کنیم شرط حلقه چگونه و در چه زمانی نادرست خواهد شد.


درس قبلی: حلقه for در پایتون

درس بعدی: لیست‌ها در پایتون؛ ساخت، دسترسی و تغییر عناصر

مشاهده فهرست کامل دوره آموزش پایتون از صفر

ادامه مسیر یادگیری پایتون

برای یادگیری منظم، آموزش‌های مرتبط زیر را به‌ترتیب دنبال کنید:

می‌خواهی پیشرفتت ذخیره شود؟با ورود یا ثبت‌نام رایگان، درس‌های تمام‌شده را علامت بزن و درصد پیشرفتت را در حساب کاربری ببین.ورود / ثبت‌نام برای ذخیره پیشرفت
درس بعدی · دوره رایگان پایتون (مقدماتی) (11 از 16)دستورهای break، continue و pass در پایتون؛ کنترل حلقه‌ها ←
آموزش‌های تازه، کد آماده و رفع خطاهر هفته در کانال Dev Source؛ رایگان.
🧭 مسیر یادگیری پایتون از صفر
ماژول 3: شرط و حلقه — درس 11 از 44

برای ذخیره پیشرفت در همه دستگاه‌ها و دریافت گواهی پایان مسیر، رایگان ثبت‌نام کن یا وارد شو.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *