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

Please login to bookmark Close

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

حلقه for

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

سینتکس حلقه ساده

for item in ITERATOR:
    BODY

حلقه for سه بخش دارد:

  • شمارنده یا iterator
    • هر آبجکتی که بتوان روی آن حلقه حلقه زد مثل لیست، تاپل، دیکشنری، رشته، مجموعه‌ها، تابع range و …
  • item
    • هر بار که حلقه اجرا می‌شود مقدارش با آیتم متناظر از iterator پر می‌شود. مثلا در اجرای شماره دوازدهم از حلقه، مقدار item برابر مقدار دوازدهمین آیتم از iterator است.
    • از هر نام دیگری نیز به جای item می‌توانید استفاده کنید. مثلا i، j یا هر نام دیگری
  • بدنه یا body
    • کدی است که با هر بار اجرای حلقه اجرا می‌شود. کد های داخل این بخش باید دارای یک تورفتگی یا indentation مناسب باشند. برای اطلاعات بیشتر پیشنهاد میکنم مقاله تورفتگی‌ها را نیز مطالعه کنید.
  • else
    • گاهی ممکن است یک حلقه تا آخر اجرا نشود. در این حالت می‌گوییم حلقه شکسته شده یا break شده است. کد های داخل else زمانی اجرا می‌شوند که حلقه 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

تابع بازگشتی

با استفاده از تابع بازگشتی هم میشه مفهوم حلقه را پیاده سازی کرد

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

در حال نگارش

Please login to bookmark Close
پیشرفت شما در «دوره آموزش پایتون مقدماتی» (30%)
نظرات

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

30%
پیشرفت

سرفصل دوره

فهرست مطالب

سرفصل دوره

تمرین

این قسمت تمرین ندارد!

پاسخ تمرین ها

هنوز برای تمرین‌های این قسمت پاسخی ثبت نشده است!

اشتراک گذاری

چرا بهتره از فیلترشکن استفاده کنید؟

من همه ویدئو ها و پادکست های کُدباز رو توی یوتیوب و ساندکلود و پلتفرم هایی آپلود می‌کنم که اغلب فیلتر هستند.

اغلب آموزش‌ها ویدئو و پادکست دارند. پس اگر می‌خواهید از محتوای سایت بیشترین استفاده رو ببرید نیاز به فیلتر شکن دارید.

توجه داشته باشید که برای خرید از فروشگاه بهتره فیلتر شکن رو خاموش کنید.

تنظیمات

انتخاب زبان
تغییر تم