دستورهای break، continue و pass در پایتون؛ کنترل حلقهها

🗓 آخرین بهروزرسانی:
حلقهها به ما اجازه میدهند یک کار را بارها تکرار کنیم؛ اما در برنامههای واقعی همیشه نمیخواهیم حلقه تا آخرین مرحله ادامه پیدا کند. گاهی جواب را پیدا کردهایم و باید فوراً از حلقه خارج شویم، گاهی میخواهیم یک مورد خاص را نادیده بگیریم و سراغ بعدی برویم، و گاهی فقط به یک «جای خالی» در کد نیاز داریم. پایتون برای این سه موقعیت سه دستور ساده دارد: break، continue و pass.
این درس ادامه آموزشهای حلقه for در پایتون و حلقه while در پایتون از دوره رایگان آموزش پایتون از صفر است.
دستور break؛ خروج فوری از حلقه
وقتی پایتون به break میرسد، حلقهای که break داخل آن است بلافاصله تمام میشود و اجرای برنامه از اولین خط بعد از حلقه ادامه پیدا میکند.
numbers = [4, 9, 15, 22, 7, 30]
for n in numbers:
if n > 20:
print(f"First number above 20: {n}")
break
print(f"Checked {n}")
print("Loop finished")خروجی:
Checked 4
Checked 9
Checked 15
First number above 20: 22
Loop finishedبا اینکه ۷ و ۳۰ هنوز در لیست بودند، بعد از پیدا شدن ۲۲ دیگر بررسی نشدند. این کار در لیستهای بزرگ باعث صرفهجویی در زمان اجرا میشود.
break در حلقه while True
رایجترین کاربرد break در حلقههای بینهایت while True است؛ حلقه تا وقتی کاربر دستور خروج ندهد ادامه پیدا میکند:
while True:
command = input("Enter a command (q to quit): ").strip().lower()
if command == "q":
print("Goodbye!")
break
print(f"You entered: {command}")این الگو پایه منوهای متنی، بازیها و رباتهاست. در پروژه بازی حدس عدد با پایتون هم از همین روش برای پایان بازی پس از حدس درست استفاده شده است.
دستور continue؛ رد شدن از تکرار فعلی
continue حلقه را تمام نمیکند؛ فقط بقیه کدهای همین دور را اجرا نمیکند و مستقیم سراغ دور بعدی میرود.
for i in range(1, 11):
if i % 2 == 0:
continue
print(i, end=" ")
# 1 3 5 7 9هر بار که i زوج است، continue اجرا میشود و print نادیده گرفته میشود.
مثال کاربردی: نادیده گرفتن داده نامعتبر
raw_scores = ["18", "abc", "15", "", "20", "-3"]
valid = []
for item in raw_scores:
if not item.isdigit():
print(f"Skipped invalid value: {item!r}")
continue
valid.append(int(item))
print(f"Valid scores: {valid}")
print(f"Average: {sum(valid) / len(valid):.2f}")خروجی:
Skipped invalid value: 'abc'
Skipped invalid value: ''
Skipped invalid value: '-3'
Valid scores: [18, 15, 20]
Average: 17.67متد isdigit() را در درس متدهای رشته دیدیم و قالب :.2f را در درس f-string در پایتون. continue باعث شد کد اصلی بدون تو در تو شدن شرطها تمیز باقی بماند.
مراقب continue در حلقه while باشید
اگر شمارنده حلقه while بعد از continue افزایش پیدا کند، حلقه بینهایت میشود:
# Wrong: infinite loop when i == 3
i = 0
while i < 5:
if i == 3:
continue
print(i)
i += 1
# Correct: update the counter before continue
i = 0
while i < 5:
i += 1
if i == 3:
continue
print(i) # 1 2 4 5دستور pass؛ دستوری که هیچ کاری نمیکند
در پایتون بدنه if، حلقه، تابع یا کلاس نمیتواند خالی باشد. وقتی هنوز کد آن بخش را ننوشتهاید ولی ساختار برنامه را میخواهید، pass را بهعنوان جاینگهدار میگذارید:
def send_email(user):
pass # TODO: implement later
class Product:
pass
for n in range(5):
if n == 2:
pass # nothing special for 2 yet
else:
print(n)بدون pass با خطای IndentationError: expected an indented block روبهرو میشوید. تفاوت مهم: pass روی جریان حلقه هیچ اثری ندارد و اجرای خطوط بعدی را متوقف نمیکند؛ در حالی که continue به دور بعد میپرد.
مقایسه break، continue و pass
| دستور | کار | بعد از اجرا | کاربرد رایج |
|---|---|---|---|
break | پایان کامل حلقه | اولین خط بعد از حلقه | پیدا شدن جواب، دستور خروج کاربر |
continue | رد شدن از دور فعلی | شروع دور بعدی | نادیده گرفتن داده نامعتبر |
pass | هیچ کاری | خط بعدی همان بلوک | جاینگهدار کد ناتمام |
break در حلقههای تو در تو
break فقط نزدیکترین حلقه را تمام میکند، نه همه حلقهها را:
for i in range(1, 4):
for j in range(1, 4):
if j == 2:
break
print(f"i={i}, j={j}")
# i=1, j=1
# i=2, j=1
# i=3, j=1حلقه بیرونی هر سه دور را کامل میکند. اگر بخواهید از هر دو حلقه خارج شوید، سادهترین راه این است که کد را داخل یک تابع بگذارید و از return استفاده کنید؛ با این موضوع در درس توابع در پایتون آشنا شدهایم:
def find_pair(target):
for i in range(1, 10):
for j in range(1, 10):
if i * j == target:
return i, j
return None
print(find_pair(12)) # (2, 6)بخش else در حلقهها
یک ویژگی کمتر شناختهشده پایتون این است که حلقههای for و while میتوانند else داشته باشند. بلوک else فقط وقتی اجرا میشود که حلقه بدون break تمام شده باشد:
n = 29
for d in range(2, n):
if n % d == 0:
print(f"{n} is not prime (divisible by {d})")
break
else:
print(f"{n} is prime")
# 29 is primeاگر مقسومعلیهی پیدا شود، break اجرا میشود و else نادیده گرفته میشود. این الگو برای «جستجو و گزارش پیدا نشدن» بسیار تمیزتر از تعریف یک متغیر پرچم است.
مثال جامع: سیستم ورود با سه بار فرصت
PASSWORD = "python123"
attempts = 3
while attempts > 0:
entered = input("Password: ")
if entered == "":
print("Empty input is not counted, try again.")
continue
if entered == PASSWORD:
print("Welcome!")
break
attempts -= 1
print(f"Wrong password. {attempts} attempt(s) left.")
else:
print("Account locked.")در این برنامه هر سه دستور نقش دارند: continue ورودی خالی را بدون کم کردن فرصت نادیده میگیرد، break بعد از ورود موفق حلقه را تمام میکند و else حلقه فقط وقتی اجرا میشود که همه فرصتها از دست رفته باشد.
اشتباهات رایج
- استفاده از break بیرون از حلقه: خطای
SyntaxError: 'break' outside loopمیدهد؛ برای خروج از تابع ازreturnاستفاده کنید. - اشتباه گرفتن pass با continue:
passچیزی را رد نمیکند و خطوط بعدی همان دور اجرا میشوند. - انتظار خروج از همه حلقهها با یک break: فقط داخلیترین حلقه تمام میشود.
- حلقه بینهایت با continue: در
whileشمارنده را قبل ازcontinueبهروز کنید.
تمرین
- از کاربر عدد بگیرید و جمع آنها را حساب کنید تا وقتی که عدد ۰ وارد شود (با
break). - عددهای ۱ تا ۵۰ را چاپ کنید، بهجز مضربهای ۷ (با
continue). - با
for ... elseبررسی کنید آیا کلمهای که کاربر وارد میکند در یک لیست وجود دارد یا نه.
📌 همچنین بخوانید: بازار کار پایتون در ایران، نصب و تنظیم پایتون در VS Code و برنامهنویسی پایتون با گوشی
سؤالات متداول
تفاوت break و continue در پایتون چیست؟
break کل حلقه را تمام میکند، اما continue فقط باقیمانده دور فعلی را رد میکند و حلقه با دور بعدی ادامه پیدا میکند.
چطور از دو حلقه تو در تو با هم خارج شویم؟
بهترین راه قرار دادن حلقهها در یک تابع و استفاده از return است. روش دیگر استفاده از یک متغیر پرچم (مثلاً found = True) و بررسی آن در حلقه بیرونی است.
آیا pass روی سرعت برنامه اثر دارد؟
خیر. pass عملاً هیچ هزینهای ندارد و فقط برای درست بودن ساختار کد استفاده میشود.
جمعبندی
با break حلقه را زودتر تمام میکنیم، با continue از یک دور رد میشویم و با pass یک بلوک خالی اما معتبر میسازیم. همچنین دیدیم break فقط نزدیکترین حلقه را متوقف میکند و else حلقه فقط در صورت تمام شدن بدون break اجرا میشود. این دستورها را در پروژههایی مثل بازی حدس عدد به کار ببرید تا کاملاً در ذهنتان بنشینند.
درس قبلی: قالببندی رشته با f-string در پایتون
بازگشت به فهرست کامل دوره آموزش پایتون از صفر
برای ذخیره پیشرفت در همه دستگاهها و دریافت گواهی پایان مسیر، رایگان ثبتنام کن یا وارد شو.