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

🗓 آخرین بهروزرسانی:
حلقه 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("نام پیدا شد")
breakbreak باعث میشود پس از پیداشدن مقدار موردنظر، جستوجوی اضافی انجام نشود.
دستور 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
- برنامهای بنویسید که عددهای ۱ تا ۲۰ را نمایش دهد.
- فقط عددهای فرد بین ۱ تا ۳۰ را چاپ کنید.
- یک عدد از کاربر بگیرید و مجموع عددهای ۱ تا آن عدد را محاسبه کنید.
- یک متن دریافت کنید و تعداد حروف آن را بدون استفاده از
len()بشمارید. - جدول ضرب عدد واردشده را از ۱ تا ۱۲ نمایش دهید.
- عددهای ۱ تا ۵۰ را بررسی کنید و هر عددی را که بر ۳ بخشپذیر است چاپ کنید.
- با حلقه، الگوی مثلثی از ستاره با ارتفاع دلخواه کاربر بسازید.
- مجموع عددهای زوج بین ۱ تا ۱۰۰ را به دست آورید.
📌 همچنین بخوانید: بازار کار پایتون در ایران، نصب و تنظیم پایتون در 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 در پایتون | مشاهده فهرست کامل دوره
ادامه مسیر یادگیری پایتون
برای یادگیری منظم، آموزشهای مرتبط زیر را بهترتیب دنبال کنید:
برای ذخیره پیشرفت در همه دستگاهها و دریافت گواهی پایان مسیر، رایگان ثبتنام کن یا وارد شو.