فصل ۵: حلقهها و تکرارها در پایتون

حلقهها (Loops) ابزار برنامهنویس برای انجام کارهای تکراری هستند. با حلقه میتوانید بخشی از کد را به تعداد دلخواه و کنترل شده اجرا کنید، کاری که بدون حلقهها علاوه بر ناخوانایی نیازمند صدها خط کد تکراری است! دو نوع اصلی حلقه در پایتون وجود دارد:
۱. حلقه while
۲. حلقه for
در این فصل ضمن معرفی انواع حلقهها، کاربرد هرکدام، کنترل جریان اجرای حلقه (با break و continue)، ساخت حلقههای تودرتو، تمرینات کاربردی، نکات مهم و حتی پاسخ به سوالات رایج آورده شده است.
۵.۱ | حلقه while چیست و چه کاربردی دارد؟
مفهوم:
حلقه while تا زمانی که یک شرط برقرار باشد، کد داخل خودش را اجرا میکند. مثل یک نگهبان که تا وقتی در باز است، اجازه عبور میدهد.
ساختار:
while شرط:
# کد اجرا میشود تا شرط برقرار باشد
مثال روزمره:
مثلاً تصور کنید میخواهید مقدار پسانداز خود را تا زمانی افزایش دهید که به ۵ میلیون تومان برسد:
saved = 0
while saved < 5000000:
saved += 500000 # هر ماه پسانداز میکنیم
print("پسانداز فعلی:", saved)
نکته:
اگر کدی باشد که شرط هیچوقت False نشود، برنامه وارد یک حلقه بیپایان (infinite loop) میشود. حواستان باشد متغیر کنترلکننده (مثل saved یا count) حتماً تغییر کند.
اشتباه رایج:
نوشتن کد بدون تغییر متغیر حلقه:
count = 0
while count < 5:
print(count) # منجر به حلقه بیپایان میشود!
این کد متغیر را افزایش نمیدهد و هیچوقت تمام نمیشود.
تمرین کدنویسی ۱: شمارش معکوس کاربر
برنامهای بنویسید که عددی از کاربر بگیرد (مثلاً ۸) و از آن عدد تا ۱ به صورت معکوس بشمارد و هر عدد را چاپ کند.
پاسخ پیشنهادی:
number = int(input("یک عدد وارد کنید: "))
while number > 0:
print(number)
number -= 1
print("تمام شد!")
سوالات متداول (FAQ) درباره حلقه while:
۱. چه زمانی از while استفاده کنیم و چه زمانی از for؟
- اگر نمیدانید چند بار باید تکرار انجام شود و فقط شرط پایان دارید (مثلاً دریافت پسورد صحیح)، از while استفاده کنید.
- اگر شمارش یا تکرار محدود و مشخص بر اساس لیست یا تعداد خاص دارید، for مناسبتر است.
۲. اگر عبارت while True بنویسیم چه اتفاقی میافتد؟
حلقه بیپایان ساخته میشود که فقط با break یا خطا متوقف میشود.
۳. چرا حلقه while گاهی اجرا نمیشود؟
اگر شرط اولیه False باشد، حلقه حتی یکبار هم اجرا نمیشود.
۵.۲ | حلقه for و کاربرد حرفهای آن
مفهوم:
حلقه for برای تکرار روی اعضای یک مجموعه مثل لیست، رشته و … استفاده میشود؛ مثلاً “هر دوست در لیست دوستان را سلام بده!”
ساختار عمومی:
for متغیر in مجموعه:
# اجرای کد برای هر عضو مجموعه
مثال:
names = ["علی", "نگین", "محمد"]
for name in names:
print("سلام", name)
نکته پیشرفته:
با توابعی مثل range یک توالی عددی میسازیم:
for i in range(1, 6):
print(i) # 1 تا 5 چاپ میکند
و اگر بخواهیم لیست را از انتها مرور کنیم:
for fruit in reversed(["سیب", "پرتقال", "موز"]):
print(fruit)
اشتباه متداول:
مثلاً اشتباهاً جای متغیر و مجموعه را عوض کنیم:
for fruits in fruit: # اشتباه
تمرین کدنویسی ۲: محاسبه میانگین نمرات
لیست نمرهها به شما داده شده است. میانگین را پیدا و چاپ کنید.
پاسخ پیشنهادی:
grades = [15, 18, 17, 20, 13]
sum_grades = 0
for g in grades:
sum_grades += g
average = sum_grades / len(grades)
print("میانگین نمرات:", average)
سوالات متداول (FAQ) حلقه for:
۱. آیا میتوان رشته را با for پیمایش کرد؟
بله، هر کاراکتر رشته یک بار خوانده میشود:
for char in "پایتون":
print(char)
۲. کاربرد range چیست؟
برای ساختن اعداد از مقدار شروع تا پایان (پایان را شامل نمیشود) و همینطور تعیین گام استفاده میشود.
۵.۳ | کنترل حلقه با break و continue
مفهوم:
- break ← خروج فوری از حلقه
- continue ← پرش به دور بعدی حلقه (بقیه کد آن دور اجرا نمیشود)
مثال با break:
for n in range(1, 20):
if n == 10:
break
print(n) # چاپ 1 تا 9
مثال با continue:
for n in range(1, 6):
if n == 3:
continue
print(n) # چاپ میکند: 1 2 4 5
نکته کاربردی:
تفاوت break با continue مهم است؛ break کل حلقه را میشکند، continue فقط آن دور را رد میکند.
تمرین کدنویسی ۳: تشخیص اعداد زوج و فرد تا عدد ۲۰ (با پرش)
برنامهای بنویسید که فقط اعداد فرد ۱ تا ۲۰ را چاپ کند؛ اگر به عدد ۱۵ رسید برنامه را تمام کند.
پاسخ پیشنهادی:
for i in range(1, 21):
if i == 15:
break
if i % 2 == 0:
continue
print(i)
سوالات متداول (FAQ) break و continue
۱. اگر چند حلقه تو در تو داشته باشیم، break کدام حلقه را میشکند؟
فقط داخلیترین حلقهای که در آن break قرار دارد متوقف میشود.
۲. آیا بعد از break کدهای بعدی آن دور اجرا میشود؟
خیر. break حلقه را همانجا قطع کرده و بقیه کدها در آن دور اجرا نخواهد شد.
۵.۴ | حلقههای تو در تو (Nested Loops)
مفهوم:
گاهی باید چندین حلقه را داخل هم بگذاریم؛ مثلاً ساخت جدول ضرب، پردازش لیست دوبعدی، یا ساخت یک الگو.
مثال: جدول کوچک ضرب ۱ تا ۳
for i in range(1, 4):
for j in range(1, 4):
print(i, "x", j, "=", i*j)
print('---')
اشتباه رایج:
استفاده از متغیر نادرست در حلقه داخلی که باعث نتایج غیرمنتظره میشود.
تمرین کدنویسی ۴: ساخت الگو ستارهای
کدی بنویسید که به ازای هر سطر از ۱ تا ۵، در هر سطر بهاندازه شماره آن سطر ستاره چاپ کند:
*
**
***
****
*****
پاسخ پیشنهادی:
for i in range(1, 6):
for j in range(i):
print('*', end='')
print()
۵.۵ | تمرین ترکیبی (چالش فصل)
برنامهای بنویسید که اعداد ۱ تا ۱۰ را بررسی کند:
- اگر عدد زوج است، فقط همان عدد را چاپ کند.
- اگر عدد فرد است، کنار عدد بنویسد: “عدد فرد است.”
پاسخ پیشنهادی:
for i in range(1, 11):
if i % 2 == 0:
print(i)
else:
print(i, "عدد فرد است.")
سوالات متداول کلی فصل پنج (FAQ عمومی)
۱. آیا میتوان حلقه for را در حلقه while گذاشت یا برعکس؟
بله، ترکیب هر نوع حلقه و لانهگذاری آنها در هم ممکن است.
۲. اگر از حلقه خروج نکنم چه اتفاقی میافتد؟
در اکثر موارد کد شما وارد حلقه بیپایان میشود و باید برنامه را دستی متوقف کنید.
۳. کجا میتوان کاربرد عملی حلقهها را مشاهده کرد؟
در مثالهایی همچون بررسی سن افراد، اسکن فایلها، ساخت نمودار، ارسال ایمیل گروهی، ساخت الگوهای متنی و بسیاری پروژههای واقعی!
اشتباهات متداول و توصیههای تجربی
- فراموش کردن تغییر مقدار متغیر شرط حلقه while
- جایگزینی تصادفی متغیرهای حلقه for و while
- استفاده بیمورد از break و continue که خوانایی را کاهش میدهد
- وارد شدن به حلقه بیپایان به علت اشتباه شرط
- چاپ خروجی با فرمت نامناسب (مثلاً عدم استفاده از end=” برای چاپ در یک خط)
توصیه مهم:
برای فهم بهتر، خروجی هر حلقه را قدمبهقدم اجرا و بررسی کنید. اگر حلقهها تو در تو نوشتید، پیش از اجرای کد روی کاغذ مراحل را پیشبینی کنید تا دچار سردرگمی نشوید!
جمعبندی
در این فصل، با قلب تپنده انجام کارهای تکراری در برنامهنویسی یعنی حلقه while، حلقه for، کنترل حلقه با break و continue و حلقههای تو در تو آشنا شدید.
تمام تمرینها را اجرا کنید، اشتباهات رایج را مرور کنید و همیشه قبل از اجرا فکر کنید که شرط حلقه چه زمانی متوقف میشود.