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

حلقه for در پایتون؛ آموزش تکرار، range و پیمایش داده‌ها

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

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

حلقه for یکی از مهم‌ترین ابزارهای پایتون برای تکرار خودکار دستورهاست. با استفاده از آن می‌توان یک کار را چند بار انجام داد، روی حروف یک متن حرکت کرد، مجموعه‌ای از مقدارها را بررسی کرد یا جدول ضرب و گزارش‌های ساده ساخت.

این مطلب، درس نهم از دوره رایگان آموزش پایتون از صفر است. در درس قبلی با شرط‌های if، elif و else آشنا شدیم. اکنون یاد می‌گیریم چگونه یک بخش از برنامه را به‌صورت کنترل‌شده تکرار کنیم.

حلقه در برنامه‌نویسی چیست؟

حلقه یا loop ساختاری است که یک یا چند دستور را چند بار اجرا می‌کند. بدون حلقه، برای نمایش عددهای ۱ تا ۵ باید پنج دستور جداگانه بنویسیم:

print(1)
print(2)
print(3)
print(4)
print(5)

با حلقه for می‌توان همین کار را کوتاه‌تر و انعطاف‌پذیرتر انجام داد:

for number in range(1, 6):
    print(number)

خروجی:

1
2
3
4
5

اگر بعداً بخواهیم عددهای ۱ تا ۱۰۰ را نمایش دهیم، فقط محدوده range() را تغییر می‌دهیم و نیازی به نوشتن صد خط کد نیست.

ساختار اصلی حلقه for در پایتون

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

for variable in iterable:
    # دستورهایی که باید تکرار شوند

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

  • for آغاز حلقه است.
  • variable متغیری موقت است که در هر دور، مقدار جدیدی دریافت می‌کند.
  • in مشخص می‌کند از کدام مجموعه مقدارها استفاده شود.
  • iterable یک داده قابل پیمایش مانند رشته، range یا فهرست است.
  • علامت دونقطه : پایان سرآیند حلقه را مشخص می‌کند.
  • دستورهای تورفته در هر دور اجرا می‌شوند.

اولین مثال حلقه for

for number in [10, 20, 30]:
    print(number)

خروجی:

10
20
30

در دور اول، متغیر number مقدار ۱۰ دارد. در دور دوم مقدار آن ۲۰ و در دور سوم مقدار آن ۳۰ است. پس از تمام‌شدن مقدارها، حلقه پایان می‌یابد.

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

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

for number in range(3):
    print("داخل حلقه")
    print(number)

print("پایان برنامه")

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

نسخه زیر نادرست است و ممکن است خطای IndentationError ایجاد کند:

for number in range(3):
print(number)  # نادرست

تابع range در پایتون چیست؟

تابع range() دنباله‌ای از عددهای صحیح تولید می‌کند و معمولاً برای کنترل تعداد تکرارهای حلقه به کار می‌رود.

حالت اول: range(stop)

for number in range(5):
    print(number)

خروجی:

0
1
2
3
4

در range(5) شمارش از صفر آغاز می‌شود و عدد ۵ در محدوده قرار نمی‌گیرد. بنابراین پنج مقدار از صفر تا چهار تولید می‌شود.

حالت دوم: range(start, stop)

for number in range(1, 6):
    print(number)

خروجی:

1
2
3
4
5

مقدار شروع داخل محدوده است، اما مقدار پایان داخل محدوده نیست.

حالت سوم: range(start, stop, step)

for number in range(2, 11, 2):
    print(number)

خروجی:

2
4
6
8
10

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

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

برای شمارش معکوس باید گام منفی تعریف کنیم:

for number in range(5, 0, -1):
    print(number)

print("شروع!")

خروجی:

5
4
3
2
1
شروع!

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

تکرار یک دستور به تعداد مشخص

گاهی فقط تعداد تکرار مهم است و به مقدار متغیر حلقه نیاز نداریم:

for _ in range(3):
    print("در حال تمرین پایتون هستم")

زیرخط _ قراردادی رایج برای متغیری است که مقدار آن استفاده نمی‌شود.

پیمایش رشته با حلقه for

رشته‌ها قابل پیمایش هستند؛ یعنی حلقه می‌تواند حروف آن‌ها را یکی‌یکی بررسی کند:

word = "Python"

for character in word:
    print(character)

خروجی:

P
y
t
h
o
n

در هر دور، متغیر character یکی از نویسه‌های رشته را دریافت می‌کند.

شمارش یک حرف در متن

text = "programming"
count = 0

for character in text:
    if character == "m":
        count += 1

print("تعداد حرف m:", count)

حلقه تمام حروف را بررسی می‌کند و هر بار که حرف m دیده شود، شمارنده یک واحد افزایش می‌یابد.

استفاده از شرط داخل حلقه for

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

for number in range(1, 11):
    if number % 2 == 0:
        print(number, "زوج است")

خروجی:

2 زوج است
4 زوج است
6 زوج است
8 زوج است
10 زوج است

نمایش زوج یا فرد بودن همه عددها

for number in range(1, 6):
    if number % 2 == 0:
        print(number, "زوج")
    else:
        print(number, "فرد")

محاسبه مجموع عددها با حلقه

یکی از کاربردهای مهم حلقه، جمع‌کردن چند مقدار است. برای این کار یک متغیر انباشته‌کننده تعریف می‌کنیم:

total = 0

for number in range(1, 6):
    total += number

print("مجموع:", total)

خروجی:

مجموع: 15

متغیر total ابتدا صفر است. در هر دور، عدد جدید به مقدار قبلی آن اضافه می‌شود.

محاسبه میانگین چند نمره

scores = [18, 15, 20, 17]
total = 0

for score in scores:
    total += score

average = total / len(scores)
print("میانگین:", average)

در این مثال از یک فهرست ساده استفاده شده است. ساختار لیست‌ها را در یکی از درس‌های آینده کامل بررسی می‌کنیم.

ساخت جدول ضرب با for

number = int(input("عدد موردنظر را وارد کنید: "))

for multiplier in range(1, 11):
    result = number * multiplier
    print(f"{number} × {multiplier} = {result}")

اگر کاربر عدد ۵ را وارد کند، برنامه جدول ضرب ۵ را از ۱ تا ۱۰ نمایش می‌دهد.

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

دستور break حلقه را فوراً متوقف می‌کند، حتی اگر مقدارهای دیگری باقی مانده باشند:

for number in range(1, 11):
    if number == 6:
        break
    print(number)

خروجی:

1
2
3
4
5

به‌محض رسیدن عدد به ۶، حلقه پایان می‌یابد و عددهای بعدی پردازش نمی‌شوند.

جست‌وجوی یک مقدار

names = ["علی", "سارا", "مهران", "رضا"]
target = "مهران"

for name in names:
    if name == target:
        print("نام پیدا شد")
        break

break باعث می‌شود پس از پیدا‌شدن مقدار موردنظر، جست‌وجوی اضافی انجام نشود.

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

دستور continue فقط دور فعلی را متوقف می‌کند و حلقه با مقدار بعدی ادامه می‌یابد:

for number in range(1, 6):
    if number == 3:
        continue
    print(number)

خروجی:

1
2
4
5

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

ردکردن مقدارهای نامعتبر

scores = [18, -2, 15, 105, 20]

for score in scores:
    if score < 0 or score > 100:
        continue
    print("نمره معتبر:", score)

تفاوت break و continue

دستوررفتار
breakکل حلقه را متوقف می‌کند.
continueفقط دور فعلی را رد می‌کند و وارد دور بعدی می‌شود.

بخش else در حلقه for

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

for number in range(1, 4):
    print(number)
else:
    print("حلقه کامل شد")

نمونه کاربردی در جست‌وجو:

names = ["علی", "سارا", "رضا"]
target = "مهران"

for name in names:
    if name == target:
        print("نام پیدا شد")
        break
else:
    print("نام پیدا نشد")

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

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

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

for row in range(1, 4):
    for column in range(1, 4):
        print(row, column)

حلقه داخلی برای هر دور حلقه خارجی به‌طور کامل اجرا می‌شود.

ساخت جدول ضرب کامل

for first_number in range(1, 6):
    for second_number in range(1, 6):
        print(f"{first_number} × {second_number} = {first_number * second_number}")
    print("---")

حلقه‌های تو در تو قدرتمند هستند، اما تعداد اجرای دستورها را زیاد می‌کنند؛ بنابراین باید آگاهانه استفاده شوند.

ساخت الگو با حلقه for

for count in range(1, 6):
    print("*" * count)

خروجی:

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

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

دسترسی به شماره و مقدار با enumerate

گاهی علاوه بر خود مقدار، به شماره آن نیز نیاز داریم. تابع enumerate() این دو را هم‌زمان در اختیار ما قرار می‌دهد:

names = ["علی", "سارا", "مهران"]

for index, name in enumerate(names, start=1):
    print(index, name)

خروجی:

1 علی
2 سارا
3 مهران

پارامتر start=1 باعث می‌شود شماره‌گذاری از یک آغاز شود.

پیمایش هم‌زمان دو مجموعه با zip

تابع zip() می‌تواند مقدارهای دو مجموعه را به‌صورت جفت در اختیار حلقه قرار دهد:

names = ["علی", "سارا", "رضا"]
scores = [18, 20, 16]

for name, score in zip(names, scores):
    print(f"{name}: {score}")

خروجی:

علی: 18
سارا: 20
رضا: 16

اگر طول مجموعه‌ها متفاوت باشد، zip() تا پایان کوتاه‌ترین مجموعه ادامه می‌دهد.

تفاوت for و while

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

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

در درس بعدی، حلقه while را به‌صورت کامل بررسی می‌کنیم.

خطاهای رایج هنگام استفاده از for

۱. فراموش‌کردن دونقطه

for number in range(5)  # نادرست
    print(number)

در پایان خط for باید علامت : قرار گیرد.

۲. تورفتگی نادرست

for number in range(5):
print(number)  # نادرست

۳. انتظار قرارگرفتن مقدار پایان در range

for number in range(1, 5):
    print(number)

این حلقه عددهای ۱ تا ۴ را تولید می‌کند، نه ۱ تا ۵.

۴. استفاده از گام نامناسب در شمارش معکوس

for number in range(5, 0):
    print(number)

این حلقه هیچ خروجی ندارد؛ زیرا گام پیش‌فرض مثبت است. باید گام -1 تعریف شود.

۵. تغییر اشتباه متغیر حلقه

for number in range(5):
    number = 100
    print(number)

تغییر متغیر حلقه، دنباله اصلی range() را تغییر نمی‌دهد و در دور بعد، مقدار جدید از همان دنباله دریافت می‌شود.

۶. استفاده از نام‌های مبهم

به‌جای نام‌های عمومی مانند x، بهتر است متغیر حلقه متناسب با داده نام‌گذاری شود:

for product_price in prices:
    print(product_price)

پروژه عملی: گزارش فروش چند روز

در این پروژه، میزان فروش چند روز را بررسی می‌کنیم، مجموع فروش و تعداد روزهای موفق را به دست می‌آوریم:

daily_sales = [850000, 1200000, 640000, 1500000, 980000]
total_sales = 0
successful_days = 0

for sale in daily_sales:
    total_sales += sale

    if sale >= 1000000:
        successful_days += 1
        print(f"فروش موفق: {sale:,} تومان")
    else:
        print(f"فروش معمولی: {sale:,} تومان")

average_sales = total_sales / len(daily_sales)

print("----------------")
print(f"مجموع فروش: {total_sales:,} تومان")
print(f"میانگین فروش: {average_sales:,.0f} تومان")
print("تعداد روزهای موفق:", successful_days)

این پروژه مفاهیم متغیر، لیست، شرط، حلقه، شمارنده و انباشته‌کننده را با هم ترکیب می‌کند.

پروژه عملی: دریافت نمره چند دانش‌آموز

student_count = int(input("تعداد دانش‌آموزان: "))
total_score = 0
passed_count = 0

for number in range(1, student_count + 1):
    score = float(input(f"نمره دانش‌آموز {number}: "))
    total_score += score

    if score >= 10:
        passed_count += 1

average = total_score / student_count

print("میانگین کلاس:", average)
print("تعداد قبول‌شده‌ها:", passed_count)
print("تعداد مردودها:", student_count - passed_count)

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

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

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

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

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

آیا حلقه for فقط برای عددهاست؟

خیر. حلقه for می‌تواند روی رشته‌ها، لیست‌ها، تاپل‌ها، دیکشنری‌ها، مجموعه‌ها، فایل‌ها و هر شیء قابل پیمایش دیگری حرکت کند.

چرا عدد پایان range نمایش داده نمی‌شود؟

در پایتون، حد پایان range() انحصاری است؛ یعنی خود عدد پایان در دنباله قرار نمی‌گیرد. این رفتار محاسبه تعداد تکرارها و کار با اندیس‌ها را ساده‌تر می‌کند.

آیا متغیر حلقه بعد از پایان for وجود دارد؟

بله. در پایتون، متغیر حلقه معمولاً پس از پایان حلقه نیز آخرین مقدار خود را نگه می‌دارد؛ بااین‌حال بهتر است برای جلوگیری از ابهام، خارج حلقه به این رفتار وابسته نباشید.

چه زمانی از break استفاده کنیم؟

زمانی که نتیجه موردنظر پیدا شده یا ادامه حلقه دیگر لازم نیست، break می‌تواند اجرای اضافی را متوقف کند.

آیا continue حلقه را تمام می‌کند؟

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

for بهتر است یا while؟

هیچ‌کدام همیشه بهتر نیستند. برای پیمایش مجموعه‌ها و تعداد تکرار مشخص، for معمولاً خواناتر است. برای تکرار وابسته به یک شرط نامشخص، while مناسب‌تر است.

جمع‌بندی درس

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

برای تسلط واقعی، مثال‌ها را خودتان اجرا و مقدارهای آن‌ها را تغییر دهید. سپس تمرین‌ها را بدون کپی‌کردن پاسخ حل کنید.


مسیر دوره: درس قبلی: شرط‌های if، elif و else | درس بعدی: حلقه while در پایتون | مشاهده فهرست کامل دوره

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

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

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

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

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

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