حلقهها for و while
حلقهها به ما اجازه میدهند کاری را چندین بار تکرار کنیم. در این فصل با دو نوع حلقه پایتون - for و while - و دستورات کنترل آنها آشنا میشویم.
حلقهها به ما اجازه میدهند کاری را چندین بار تکرار کنیم. در این فصل با دو نوع حلقه پایتون – for و while – و دستورات کنترل آنها آشنا میشویم.
حلقه for
حلقه for در پایتون روی هر چیزی که قابل پیمایش باشد (iterable) کار میکند:
# روی رشته
for char in "سلام":
print(char)
# س
# ل
# ا
# م
# روی لیست
fruits = ["سیب", "موز", "پرتقال"]
for fruit in fruits:
print(f"میوه: {fruit}")
# روی range
for i in range(5): # 0, 1, 2, 3, 4
print(i)
تابع range()
# range(stop)
for i in range(5): # 0, 1, 2, 3, 4
print(i)
# range(start, stop)
for i in range(2, 7): # 2, 3, 4, 5, 6
print(i)
# range(start, stop, step)
for i in range(0, 11, 2): # 0, 2, 4, 6, 8, 10
print(i)
# معکوس
for i in range(10, 0, -1): # 10, 9, 8, ..., 1
print(i)
# مهم: stop شامل نمیشود!
# range(1, 5) → 1, 2, 3, 4 (نه 5)
حلقه while
تا زمانی که شرط برقرار باشد تکرار میشود:
count = 0
while count < 5:
print(f"شمارش: {count}")
count += 1
# مثال: ورودی تا زمان دریافت پاسخ صحیح
password = ""
while password != "1234":
password = input("رمز را وارد کنید: ")
print("ورود موفق!")
# هشدار: مراقب حلقه بینهایت باشید
# while True: # هرگز تمام نمیشود مگر break
# print("بینهایت")
مثال: تخمین جذر با Newton
number = 25
guess = 1.0
tolerance = 0.0001
while abs(guess * guess - number) > tolerance:
guess = (guess + number / guess) / 2
print(f"جذر {number} ≈ {guess:.4f}")
break و continue
break – خروج از حلقه
# جستجوی اولین عدد زوج
numbers = [1, 3, 5, 8, 9, 11]
for num in numbers:
if num % 2 == 0:
print(f"اولین زوج: {num}")
break
else:
print("هیچ عدد زوجی پیدا نشد")
continue – رد شدن از این تکرار
# چاپ فقط اعداد فرد
for i in range(1, 11):
if i % 2 == 0:
continue
print(i)
# 1 3 5 7 9
پایتون قابلیت منحصربهفردی دارد: حلقههای for و while میتوانند بلوک else داشته باشند که فقط زمانی اجرا میشود که حلقه بدون break به پایان برسد.
enumerate – شمارنده هوشمند
وقتی هم به اندیس و هم مقدار نیاز دارید:
fruits = ["سیب", "موز", "پرتقال"]
# روش غیرحرفهای
for i in range(len(fruits)):
print(f"{i}: {fruits[i]}")
# روش Pythonic
for i, fruit in enumerate(fruits):
print(f"{i}: {fruit}")
# با شروع از ۱
for i, fruit in enumerate(fruits, start=1):
print(f"{i}- {fruit}")
# 1- سیب
# 2- موز
# 3- پرتقال
zip – پیمایش موازی
names = ["علی", "زهرا", "محمد"]
ages = [25, 30, 28]
cities = ["کاشان", "تهران", "اصفهان"]
for name, age, city in zip(names, ages, cities):
print(f"{name} ({age} ساله) از {city}")
# علی (25 ساله) از کاشان
# زهرا (30 ساله) از تهران
# محمد (28 ساله) از اصفهان
حلقههای تو در تو
# جدول ضرب
for i in range(1, 5):
for j in range(1, 5):
print(f"{i*j:3d}", end=" ")
print()
# خروجی:
# 1 2 3 4
# 2 4 6 8
# 3 6 9 12
# 4 8 12 16
# الگوی مثلث
for i in range(1, 6):
for j in range(i):
print("*", end="")
print()
# *
# **
# ***
# ****
# *****
break و continue در حلقههای تو در تو
# break فقط از حلقه داخلی خارج میشود
for i in range(3):
for j in range(5):
if j == 3:
break # فقط از حلقه j خارج میشود
print(f"({i},{j})")
# برای خروج کامل: استفاده از flag یا تابع
found = False
for i in range(10):
for j in range(10):
if i * j == 24 and i != 1:
print(f"پیدا شد: {i} × {j}")
found = True
break
if found:
break
مثالهای واقعی
مجموع اعداد
total = 0
for i in range(1, 101):
total += i
print(f"مجموع 1 تا 100: {total}") # 5050
# روش خلاصه
total = sum(range(1, 101))
print(total)
ضرب فاکتوریل
n = int(input("یک عدد: "))
factorial = 1
for i in range(1, n + 1):
factorial *= i
print(f"!{n} = {factorial}")
بزرگترین مقسومعلیه مشترک (GCD)
a = int(input("عدد اول: "))
b = int(input("عدد دوم: "))
while b != 0:
a, b = b, a % b
print(f"ب.م.م = {a}")
تشخیص عدد اول
num = int(input("یک عدد: "))
if num < 2:
print("اول نیست")
else:
is_prime = True
for i in range(2, int(num ** 0.5) + 1):
if num % i == 0:
is_prime = False
break
if is_prime:
print(f"{num} عدد اول است")
else:
print(f"{num} اول نیست")
منوی برنامه
while True:
print("n--- منو ---")
print("1. ثبت محصول")
print("2. نمایش لیست")
print("3. حذف")
print("0. خروج")
choice = input("انتخاب: ")
if choice == "0":
print("خداحافظ!")
break
elif choice == "1":
print("ثبت...")
elif choice == "2":
print("نمایش...")
elif choice == "3":
print("حذف...")
else:
print("نامعتبر!")
اعتبارسنجی ورودی
while True:
age_str = input("سن: ")
if age_str.isdigit():
age = int(age_str)
if 0 < age < 120:
break
print("سن نامعتبر")
else:
print("لطفاً یک عدد وارد کنید")
print(f"سن شما: {age}")
پیشنمای List Comprehension
پایتون راه فشردهای برای ساخت لیست با حلقه دارد (در فصل لیستها مفصل بحث میشود):
# روش معمولی
squares = []
for i in range(10):
squares.append(i ** 2)
# روش Pythonic - List Comprehension
squares = [i ** 2 for i in range(10)]
print(squares)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# با شرط
evens = [i for i in range(20) if i % 2 == 0]
print(evens)
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
تمرین فصل
مجموع اعداد زوج بین ۱ تا ۱۰۰ را با حلقه محاسبه کنید.
اولین ۲۰ عدد دنباله فیبوناچی را چاپ کنید (۱، ۱، ۲، ۳، ۵، ۸، …).
عددی تصادفی بین ۱ تا ۱۰۰ تولید کنید و کاربر تا حدس صحیح ادامه دهد. در هر حدس، «بزرگتر» یا «کوچکتر» راهنمایی کنید.
عددی n میگیرد و این الگو را چاپ میکند (برای n=۵):
*
***
*****
*******
*********
جمعبندی
- حلقه
forبرای پیمایش iterableها - حلقه
whileبرای تکرار تا برقراری شرط - تابع
range()با ۱، ۲ یا ۳ آرگومان breakوcontinueبرای کنترل جریانenumerateوzip– ابزارهای Pythonic- حلقههای تو در تو
- پیشنمای List Comprehension