حلقه‌ها (Loops)؛ وقتی می‌خوای حوصلهٔ تکرار رو به ماشین بدی
تا حالا شده که بخوای یه کاری رو صد بار انجام بدی؟ مثلاً صد بار بنویسی «دیگه دیر نکنم»، یا صد تا عدد رو چاپ کنی؟ آدمیزاد از تکرار خسته می‌شه، ولی کامپیوتر عاشق تکراره. حلقه‌ها اون ابزار جادویی‌ای هستن که به برنامه می‌گن: «این کار رو بگیر، این‌قدر تکرار کن تا من بگم بسّه.» تو این مقاله قراره با هم سوار چرخ‌وفلک حلقه‌ها بشیم، از while ساده شروع کنیم، بعد بریم سراغ for همه‌کاره، با range دوست بشیم، و یاد بگیریم کی باید جلوی حلقه رو با break بگیریم و کی با continue از بعضی دورها رد بشیم. کمربند رو ببند؛ قراره تکرار کنیم، اما خسته نشیم!

چرا حلقه؟ چون زندگی تکراری نیست، ولی کد هست
تصور کن می‌خوای اعداد ۱ تا ۱۰ رو چاپ کنی. بدون حلقه مجبوری ده خط print(1), print(2) و... بنویسی. حالا اگه تا ۱۰۰۰ بود چی؟ دیوانه می‌شدی. اینجاست که حلقه مثل یه دستیار باحال میاد و می‌گه: «ولم کن، من برات تکرار می‌کنم.»

پایتون دو نوع حلقهٔ اصلی داره:

while : تا وقتی یه شرط برقراره، ادامه بده.

for : روی اعضای یه مجموعه (مثل لیست، رشته، یا اعداد) پرسه بزن.

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

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


count = 1
while count <= 5:
    print(f"دور شماره {count}")
    count += 1   # خیلی مهم: باید یه جایی شرط رو بشکنی، وگرنه حلقهٔ بی‌نهایت می‌سازی!
print("حلقه تموم شد!")


خروجی:


دور شماره 1
دور شماره 2
دور شماره 3
دور شماره 4
دور شماره 5
حلقه تموم شد!


سه نکتهٔ طلایی:

اگه count += 1 رو فراموش کنی، count همیشه 1 می‌مونه و شرط count <= 5 تا ابد برقراره. این یعنی حلقهٔ بی‌نهایت! برنامه قفل می‌کنه و باید با Ctrl+C نجاتش بدی. مثل آسانسوری که دکمه‌ش گیر کرده، هی می‌ره بالا تا سقف.

شرط می‌تونه هر عبارت منطقی‌ای باشه، حتی مستقیم یه متغیر یا تابع: while True: یعنی تا ابد ادامه بده (باید با break ازش خارج شی).

تورفتگی یادت نره: هر چی زیر while باشه که فاصله خورده، عضو حلقه‌ست.

حلقهٔ for – گردشگر حرفه‌ای
for از اون حلقه‌هاست که بهت می‌گه: «بذار این لیستو یه دور بزنم.» به‌جای اینکه نگران شرط و افزایش شمارنده باشی، مستقیم روی یه مجموعه (مثل رشته، لیست، تاپل و...) می‌ره و تک‌تک اعضا رو برمی‌داره.


fruits = ["سیب", "موز", "گیلاس"]
for fruit in fruits:
    print(f"میوهٔ الان: {fruit}")
print("دیگه میوه‌ای نمونده.")


خروجی:

[/code]

for روی رشته هم کار می‌کنه و کاراکترها رو یکی‌یکی تحویل می‌ده:


for char in "سلام":
    print(char)
# س
# ل
# ا
# م


برتری for نسبت به while اینه که خطر حلقهٔ بی‌نهایت رو از بین می‌بره، چون دقیقاً به اندازهٔ تعداد اعضای اون مجموعه تکرار می‌شه. تمیز، امن و خوشگل.

تابع range() – دستگاه تولید اعداد
خب، for روی لیست که عالی بود. اما اگه بخوایم ۱۰۰ بار یه کاری رو تکرار کنیم، که قرار نیست یه لیست ۱۰۰ تایی رو دستی بنویسیم. اینجا range() مثل یه کارخانهٔ کوچک اعداد وارد عمل می‌شه. سه شکل داره:

1. range(stop) : اعداد از ۰ تا یکی کمتر از stop.

range(start, stop) .2 : از start تا یکی کمتر از stop.

range(start, stop, step) .3 : با گام step (می‌تونه منفی هم باشه).


# ۱. فقط پایان
for i in range(5):
    print(i, end=" ")   # 0 1 2 3 4

# ۲. شروع و پایان
for i in range(2, 6):
    print(i, end=" ")   # 2 3 4 5

# ۳. با گام
for i in range(1, 10, 2):   # اعداد فرد 1 تا 9
    print(i, end=" ")       # 1 3 5 7 9

# شمارش معکوس
for i in range(10, 0, -1):
    print(i, end=" ")   # 10 9 8 7 6 5 4 3 2 1


نکتهٔ مهم: range(stop) هرگز خود stop رو شامل نمی‌شه. انگار که در نیمه‌باز باشه: [0, stop). پس range(5) اعداد 0,1,2,3,4 رو می‌ده.

حالا ترکیبش با for:


# چاپ اعداد ۱ تا ۱۰
for num in range(1, 11):
    print(num)


حالا می‌فهمی چرا پایتون انقدر محبوبه؛ با for و range می‌تونی پیچیده‌ترین تکرارها رو به ساده‌ترین شکل ممکن بنویسی.

break – دکمهٔ فرار اضطراری
گاهی وسط حلقه می‌فهمی که «بسه دیگه، زود باش خارج شیم!» break همون دکمهٔ قرمز فراره. به محض اینکه پایتون به break برسه، مثل موشک از حلقه می‌پره بیرون، حتی اگه شرط یا تعداد اعضا هنوز تموم نشده باشه.


# جستجوی یه گنج
treasures = ["جعبهٔ خالی", "سکهٔ قدیمی", "شمش طلا", "اژدها!"]
for item in treasures:
    print(f"بررسی: {item}")
    if item == "اژدها!":
        print("وای! اژدها! فرار کن!")
        break
    print("بی‌خطره، ادامه بده.")
print("از حلقه خارج شدیم.")


خروجی:


بررسی: جعبهٔ خالی
بی‌خطره، ادامه بده.
بررسی: سکهٔ قدیمی
بی‌خطره، ادامه بده.
بررسی: شمش طلا
بی‌خطره، ادامه بده.
بررسی: اژدها!
وای! اژدها! فرار کن!
از حلقه خارج شدیم.


break خیلی تو حلقه‌های while True کاربرد داره که عمداً حلقه رو بی‌نهایت می‌کنیم و بعداً با شرط و break خارج می‌شیم:


while True:
    answer = input("رمز رو بگو (برای خروج بنویس 'خروج'): ")
    if answer == "خروج":
        print("خدانگهدار!")
        break
    print(f"رمز {answer} اشتباهه. دوباره تلاش کن.")


continue – رد کردن یک دور خاص
continue به پایتون می‌گه: «ای دور رو بی‌خیال، بپر سراغ دور بعد.» با break که کلاً می‌ره بیرون فرق داره. continue فقط اجرای ادامهٔ آن دور خاص را متوقف می‌کند و می‌رود به تکرار بعدی.


# فقط اعداد زوج رو چاپ کن
for i in range(1, 11):
    if i % 2 != 0:   # فرد باشه
        continue      # بی‌خیالش، برو بعدی
    print(i, end=" ")   # 2 4 6 8 10


یا یه مثال بامزه‌تر:


tasks = ["خرید نان", "دزدگیر", "پخت کیک", "مار سمی", "آب دادن گلدون"]
for task in tasks:
    if task == "مار سمی":
        print("اِووووه! از این یکی رد می‌شیم!")
        continue
    print(f"انجام می‌دم: {task}")


else در حلقه‌ها – یه خداحافظی خاص
شاید نشناسی، ولی حلقه‌های پایتون یه else مخفی دارن که خیلی باحاله. این else وقتی اجرا می‌شه که حلقه به‌طور طبیعی (بدون break) تموم بشه. انگار حلقه بگه: «خب، همه رو گشتم، چیزی که می‌خواستی نبود!»


# جستجوی یه عدد
numbers = [1, 3, 5, 7, 9]
search = 6
for num in numbers:
    if num == search:
        print("پیداش کردم!")
        break
else:
    print(f"{search} توی لیست نبود.")


چون search پیدا نشد، break نخورد و else اجرا شد. اگه پیدا می‌شد، break اجرا می‌شد و else نادیده گرفته می‌شد.

حلقه‌های تو در تو – وقتی تکرار، تکرار می‌شه
هیچ‌کس جلودار نیست که یه حلقه داخل یه حلقهٔ دیگه بذاری. مثل ساعت که عقربهٔ ثانیه‌شمار هی می‌چرخه توی هر دقیقه. پرکاربرد برای جداول ضرب، ماتریس‌ها و ترکیب‌ها:


for i in range(1, 4):
    for j in range(1, 4):
        print(f"({i},{j})", end=" ")
    print()   # یه خط جدید بعد از هر دور i


خروجی:


(1,1) (1,2) (1,3) 
(2,1) (2,2) (2,3) 
(3,1) (3,2) (3,3) 


برای جدول ضرب ساده:


for i in range(1, 11):
    for j in range(1, 11):
        print(i*j, end="\t")
    print()


با \t فاصلهٔ تب داریم خروجی مرتب می‌شه.

یک نمایش بزرگ: ماجرای نینجا و موانع
حالا همهٔ این ابزارها رو می‌ریزیم تو یه برنامهٔ باحال که یه نینجا از موانع رد می‌شه:


import random

# مسیر پر از موانع تصادفی
path = ["چاله", "سنگ", "گُل", "سنگ", "خار", "گُل", "چاله", "سنگ", "دشمن", "گُل"]
energy = 100

print("🥷 نینجا وارد مسیر شد! انرژی: 100")
print("مسیر:", " → ".join(path))

for i, obstacle in enumerate(path, start=1):
    print(f"\nگام {i}: به {obstacle} رسیدیم.")
    
    if obstacle == "دشمن":
        print("⚔️ دشمن ظاهر شد! جنگیدیم و انرژی کم شد...")
        energy -= 30
        if energy <= 0:
            print("💀 انرژی تموم شد. نینجا شکست خورد!")
            break
        else:
            print("دشمن رو شکست دادیم، ادامه می‌دیم.")
    elif obstacle == "گُل":
        print("🌸 اینجا یه گل زیباست، انرژی نمی‌گیره. رد می‌شیم.")
        continue   # عملاً بدون تغییر رد می‌شه، ولی نشون دادیم که continue رو می‌شناسیم
    elif obstacle in ("چاله", "سنگ", "خار"):
        damage = 10 if obstacle == "سنگ" else 5
        print(f"💢 برخورد با {obstacle}! {damage} انرژی کم شد.")
        energy -= damage
        if energy <= 0:
            print("💀 انرژی تموم شد. نینجا افتاد توی چاله!")
            break
    print(f"انرژی باقی‌مانده: {energy}")

else:
    print(f"\n🎉 نینجا مسیر رو با موفقیت طی کرد! انرژی باقی‌مانده: {energy}")


اینجا enumerate که شمارنده می‌سازه (از ۱ شروع کردیم)، break برای توقف در صورت شکست، continue برای نمایش آموزشی، و else حلقه رو استفاده کردیم که فقط در صورت تمام شدن طبیعی مسیر (بدون break) پیام موفقیت رو نشون می‌ده.

نکتهٔ خفن: تکرار روی دیکشنری‌ها
بعداً کامل یاد می‌گیری، ولی الانم می‌تونی بدونی که for روی دیکشنری هم کار می‌کنه. به‌صورت پیش‌فرض کلیدها رو برمی‌گردونه:


student = {"name": "سارا", "age": 20, "grade": "A"}
for key in student:
    print(f"{key}: {student[key]}")


یا با .items() هم کلید و هم مقدار:


for k, v in student.items():
    print(f"{k} -> {v}")


جمع‌بندی: برای همیشه از تکرار دستی خلاص شو
حلقه‌ها اسلحهٔ سری برنامه‌نویس برای انجام کارهای تکراری‌اند. با while می‌تونی تا وقتی شرط برقراره پیش بری، با for روی مجموعه‌ها گشت بزنی، range اعداد رو مثل آب خوردن تحویلت می‌ده. break و continue هم فرمان کنترل اوضاع رو دستت می‌دن. حلقه‌های تو در تو هم دنیای جدیدی از الگوها رو باز می‌کنن.

دفعهٔ بعد که حوصله نداشتی کاری رو هزار بار دستی انجام بدی، یه حلقه بساز و بذار پایتون عرق بریزه. این تازه شروع قدرتنمایی تو با تکراره. حلقه بزن، انرژی بگیر، و کدهای خفن بنویس! 🔁🐍✨