برای انجام کار های تکراری از حلقه استفاده میشود.
حلقه for
حلقه for زمانی استفاده میشود که تعداد تکرار حلقه را بدانیم.
سینتکس حلقه ساده
for item in ITERATOR:
BODYحلقه for سه بخش دارد:
- شمارنده یا iterator
- هر آبجکتی که بتوان روی آن حلقه حلقه زد مثل لیست، تاپل، دیکشنری، رشته، مجموعهها، تابع
rangeو …
- هر آبجکتی که بتوان روی آن حلقه حلقه زد مثل لیست، تاپل، دیکشنری، رشته، مجموعهها، تابع
- item
- هر بار که حلقه اجرا میشود مقدارش با آیتم متناظر از
iteratorپر میشود. مثلا در اجرای شماره دوازدهم از حلقه، مقدارitemبرابر مقدار دوازدهمین آیتم ازiteratorاست. - از هر نام دیگری نیز به جای item میتوانید استفاده کنید. مثلا i، j یا هر نام دیگری
- هر بار که حلقه اجرا میشود مقدارش با آیتم متناظر از
- بدنه یا body
- کدی است که با هر بار اجرای حلقه اجرا میشود. کد های داخل این بخش باید دارای یک تورفتگی یا indentation مناسب باشند. برای اطلاعات بیشتر پیشنهاد میکنم مقاله تورفتگیها را نیز مطالعه کنید.
- else
- گاهی ممکن است یک حلقه تا آخر اجرا نشود. در این حالت میگوییم حلقه شکسته شده یا break شده است. کد های داخل
elseزمانی اجرا میشوند که حلقه break نشده باشد. در همین مقاله به صورت خاص به این مورد پرداخته ام.
- گاهی ممکن است یک حلقه تا آخر اجرا نشود. در این حالت میگوییم حلقه شکسته شده یا break شده است. کد های داخل
مثال اول – چاپ اعداد ۱ تا ۱۰۰
برنامه ای بنویسید که اعداد ۱ تا ۱۰۰ را چاپ کند.
نمونه خروجی:
1
2
3
...
100
پاسخ:
for i in range(1, 11):
print(i)مثال دوم – چاپ اعداد فرد ۱ تا ۲۰
برنامه ای بنویسید که اعداد فرد بین ۱ تا ۲۰ را چاپ کند.
نمونه خروجی:
1
3
5
...
20
پاسخ:
for i in range(1, 21):
if i % 2 == 1:
print(i)این حلقه ۲۰ بار اجرا میشود. در صورتی که با یک ترفند میتوان تعداد اجرای این حلقه را به نصف رساند. کافیست کد بالا را بدین شکل بازنویسی کنیم.
for i in range(1, 21, 2):
print(i)تابع range(2, 21, 2) حاوی آیتم های 3, 5, ..., 20 است در صورتی که range(1, 20) حاوی 1, 2, 3, ..., 20 است. این یعنی حلقه ای که بهینه کرده ایم فقط ۱۰ بار اجرا میشود و این بسیار عالیست!
مثال سوم – محاسبه مجموع اعداد ۱ تا ۱۰۰
برنامه ای بنویسید که مجموع اعداد ۱ تا ۱۰۰ را حساب کند.
پاسخ:
mysum = 0
for i in range(101):
mysum += i
print(mysum)مثال چهارم – پیدا کردن تعداد اعداد زوج یک لیست
برنامه ای بنویسید که یک لیست از انواع اعداد بگیرد و مشخص کند که چند عدد زوج در آن وجود دارد.
نمونه ورودی:
[1, 2, 3, 4, 5, 6, 7, 8, 1, 3, 5]
نمونه خروجی:
4
پاسخ:
lst = [1, 2, 3, 4, 5, 6, 7, 8, 1, 3, 5]
counter = 0
i for i in lst:
if i % 2:
counter += 1
print(counter)سینتکس حلقه تو در تو
گاهی لازم است به ازای هر بار اجرای حلقه، یک حلقه دیگر نیز اجرا شود. در این صورت بدنه یک حلقه خودش نیز یک حلقه است. تا جای ممکن سعی کنید از حلقه های تو در تو استفاده نکنید زیرا برنامه را به شدت کند میکنند.
for iter_item in ITERATOR:
OUTER LOOP BODY
for i in iter_item:
NESTED LOOP BODY
OUTER LOOP BODYمثال اول – چاپ کارنامه دانشآموزان
برنامه ای بنویسید که بر اساس لیست دانشآموزان و لیست نمرات، کارنامه همه آنها را چاپ کند.
نمونه لیست دانشآموزان:
students = ['ali', 'hasan', 'hamid', 'reza']
نمونه لیست نمرات به ترتیب دانشآموزان:
scores = [
[12, 11, 10, 4,],
[15, 11, 20, 19],
[17, 12, 13, 19],
[15, 10, 16, 10],
]
نمونه خروجی:
ali scores are 12, 11, 10, 4
ali scores are 15, 11, 20, 19
ali scores are 17, 12, 13, 19
ali scores are 15, 10, 16, 10
hasan scores are 12, 11, 10, 4
hasan scores are 15, 11, 20, 19
hasan scores are 17, 12, 13, 19
hasan scores are 15, 10, 16, 10
hamid scores are 12, 11, 10, 4
hamid scores are 15, 11, 20, 19
hamid scores are 17, 12, 13, 19
hamid scores are 15, 10, 16, 10
reza scores are 12, 11, 10, 4
reza scores are 15, 11, 20, 19
reza scores are 17, 12, 13, 19
reza scores are 15, 10, 16, 10
پاسخ:
به ازای هر دانشآموز لیستی از نمرات داریم. پس به ازای هر دانشآموز از لیست دانشآموزان، باید یک حلقه روی لیست نمرات بزنیم.
students = ['ali', 'hasan', 'hamid', 'reza']
scores = [
[12, 11, 10, 4,],
[15, 11, 20, 19],
[17, 12, 13, 19],
[15, 10, 16, 10],
]
for student in students:
for student_scores in scores:
text = '{} scores are {}, {}, {}, {}'.format(
student,
student_scores[0],
student_scores[1],
student_scores[2],
student_scores[3]
)
print(text)البته میتوان کد بالا را با استفاده از unpacking بهینه تر نوشت:
students = ['ali', 'hasan', 'hamid', 'reza']
scores = [
[12, 11, 10, 4,],
[15, 11, 20, 19],
[17, 12, 13, 19],
[15, 10, 16, 10],
]
for student in students:
for student_scores in scores:
text = '{} scores are {}, {}, {}, {}'.format(
student,
*student_scores
)
print(text)مثال دوم – چاپ نام همه فوتبالیست ها
در یک مدرسه ۳ تیم فوتبال به نام های شاهین، آذرخش و ستارگان برای مسابقات ثبت نام کرده اند. هر کدام از این تیم ها ۵ عضو دارند. برنامه ای بنویسید که نام همه بازیکنان را چاپ کند.
ورودی:
teams = {
'shahin': ['ali', 'reza', 'danial', 'hesam', 'asghar'],
'azarakhsh': ['saeid', 'safdar', 'kian', 'safi', 'asadollah'],
'setaregan': ['mohammad', 'bahram', 'toomaj', 'ezzat', 'naghui']
}
خروجی:
teams = {
'shahin': ['ali', 'reza', 'danial', 'hesam', 'asghar'],
'azarakhsh': ['saeid', 'safdar', 'kian', 'safi', 'asadollah'],
'setaregan': ['mohammad', 'bahram', 'toomaj', 'ezzat', 'naghui']
}
for team in teams:
for members in teams[team]:
print(members, end=" ")
البته کد بالا را میتوان به نوعی بهینه کرد که نیازی به استفاده از حلقه تو در تو نباشد.
teams = {
'shahin': ['ali', 'reza', 'danial', 'hesam', 'asghar'],
'azarakhsh': ['saeid', 'safdar', 'kian', 'safi', 'asadollah'],
'setaregan': ['mohammad', 'bahram', 'toomaj', 'ezzat', 'naghui']
}
for team in teams:
team_members = ', '.join(teams[team])
print(team_members, end=" ")
دستور break
حلقه را متوقف میکند. اصطلاحا حلقه را میشکند.
مثال اول – پیدا کردن یک اسم خاص از بین اسامی موجود
برنامه ای بنویسید که یک نام از کاربر بگیرد و اگر آن نام در لیست نام های زیر بود واژه yes را چاپ کند.
- hamid
- farzaneh
- saeed
- minoo
- parvaneh
- batool
نمونه ورودی:
batool
نمونه خروجی:
yes
پاسخ:
name = input('name: ')
names = ['hamid', 'farzaneh', 'saeed', 'minoo', 'parvaneh', 'batool']
for i in names:
if name == i:
print('yes')
breakبیاید کد بالا را با هم trace کنیم. اگر ورودی کاربر farzaneh باشد حلقه فقط ۲ بار اجرا میشود زیرا در دومین اجرای حلقه شرط True میشود و break اجرا میشود. دستور break حلقه را میشکند و نمیگذارد اجرای حلقه ادامه پیدا کند.
اگر دستور break را نداشتیم صرف نظر از اینکه نام ورودی در لیست نام ها پیدا شود یا خیر، در هر صورت حلقه به تعداد آیتم هایش (یعنی ۶ بار) اجرا میشد.
در تکه کد بالا دستور break کمک میکند که برنامه بهینه تری داشته باشیم. البته توجه داشته باشید که برنامه فوق را میتوان به شکل زیر بهینه تر نوشت و برای فهمیدن اینکه نام ورودی در لیست نام ها هست یا خیر نیازی به حلقه نیست.
name = input('name: ')
names = ['hamid', 'farzaneh', 'saeed', 'minoo', 'parvaneh', 'batool']
if name in names:
print('yes')تمرین دوم – پیدا کردن عددی بزرگتر از x
برنامه ای بنویسید که یک عدد به عنوان x از کاربر بگیرد و تشخیص دهد که عددی بزرگتر از آن در لیست زیر داریم یا خیر
[44, 13, 24, 43, 88, 96, 34]
نمونه ورودی:
15
نمونه خروجی:
yes
پاسخ:
x = int(input('x: '))
my_lst = [44, 13, 24, 43, 88, 96, 34]
for i in my_lst:
if i > x:
print('yes')
breakدستور continue
فرض کنید میخواهید لِیلِی بازی کنید. سنگ را پرتاب میکنید و سنگ در خانه شماره ۴ میافتد. اکنون در رد شدن از مسیر باید دقت کنید که پا در خانه شماره ۴ نگذارید و از روی آن بپرید.
دستور continue در حلقه دقیقا چنین کاری میکند. این دستور بر اساس شرایطی که با if مشخص میشود باعث میشود که آن شماره از حلقه اجرا نشود و شماره بعدی حلقه اجرا شود.
تمرین اول – پیدا کردن تعداد اعداد یک لیست
برنامه ای بنویسید که تعداد اعداد لیست زیر را بشمارد.
[12, 'code', 1.3, 'with', 3.4, 1, 'mmreza', 2.3, 4.5]
پاسخ:
items = [12, 'code', 1.3, 'with', 3.4, 1, 'mmreza', 2.3, 4.5]
counter = 0
for i in items:
if type(i) == str:
continue
counter += 1
print(counter)در هر بار اجرای حلقه اگر تایپ i رشته نباشد یکی به مقدار counter اضافه میشود. اگر تایپ i رشته باشد، دستور continue از اجرای خط ۶ جلوگیری کرده و شماره بعدی حلقه را اجرا میکند.
دستور else
بسیاری از برنامهنویسان، حتی برنامهنویسان پایتون نمیدانند که میتوان از دستور else در کنار for استفاده کرد. اغلب برنامهنویسان تصور میکنند که دستور else تنها میتواند پس از if بیاید که این تصور اشتباه است.
سینتکس
for i in ITERATOR:
BODY
else:
ELSE BODYاگر حلقه break نشود، کد داخل else اجرا نمیشود.
تمرین اول – پیدا کردن عدد اول
برنامه ای بنویسید که یک عدد بگیرد و تشخیص دهد که آن عدد اول است یا خیر. عدد اول عددی است که فقط به خودش و ۱ بخشپذیر باشد.
نمونه ورودی:
97
نمونه خروجی:
yes
پاسخ:
number = int(input('number: '))
for divider in range(2, number):
if number % divider == 0:
print('no')
break
else:
print('yes')- در خط ۱ یک عدد از کاربر گرفته میشود.
- در ۲ دو یک حلقه زده میشود. این حلقه از ۲ تا خود آن عدد اجرا میشود. مثلا اگر
numberبرابر ۱۰ باشد، این حلقه برای ۲ و ۳ و ۴ و ۵ و ۶ و ۷ و ۸ و ۹ اجرا میشود. - در خط ۳ در هر بار اجرای حلقه چک میشود که آیا عدد ورودی به عددی که حلقه در حال اجرای آن است بخش پذیر است یا نه. مثلا اگر number برابر ۱۰ باشد و در سومین بار از اجرای حلقه باشیم، divider برابر ۴ است. در این صورت این خط چک میکند که آیا ۱۰ بر ۴ بخش پذیر است یا خیر
- خط ۵ حلقه را
breakمیکند. در صورتی که شرط خط ۳Trueباشد اینbreakاجرا میشود و دیگر کد داخلelseاجرا نمیشود. - اگر حلقه تا آخر اجرا شود و در هیچکدام از دفعات اجرا، حلقه
breakنشود کد داخلelseاجرا میشود.
حلقه while
تابع بازگشتی
با استفاده از تابع بازگشتی هم میشه مفهوم حلقه را پیاده سازی کرد
حلقه های تو در تو
در حال نگارش