حلقهها: دوباره و دوباره (Loops)
حلقهی for همون خطها رو یه بار برای هر آیتم یه لیست یا یه بازه اجرا میکنه. با یه جمع در حال رشد چیزها رو جمع میزنی، با range میشمری، و وقتی از قبل نمیدونی چند بار، از while استفاده میکنی.
حلقهی FOR
یه تیکه کد، یه بار برای هر آیتم
for s in scores: یعنی «آیتمهای scores رو یکییکی بردار، و هر بار اسم آیتم فعلی رو بذار s». خطهایی که زیرش با تورفتگی (۴ تا فاصله) نوشته میشن بدنهی حلقهن. پایتون بدنه رو یه بار برای آیتم اول اجرا میکنه، یه بار دیگه برای دومی، و همینطور تا آخر. اسمی که بعد از for میاد متغیر حلقه (loop variable)ـه: خودت انتخابش میکنی و هر دور یه آیتم دیگه توشه. دونقطهی آخر خط for هم لازمه.
با scores = [8, 5, 9]، بدنه سه بار اجرا میشه: اول با s = 8، بعد s = 5، بعد s = 9.
scores = [8, 5, 9]
for s in scores:
print(s * 2)16
10
18توی کد یه خط print هست، ولی خروجی سه خطه: بدنه برای هر نمره یه بار اجرا شد. عددهای لیست یا اون * 2 رو عوض کن و دوباره اجراش کن.
خودت رو امتحان کن
names = ["Sara", "Omid"]
for n in names:
print("Hi " + n)
print("done")Hi Sara Hi Omid doneHi Sara done Hi Omid doneHi n Hi n doneHi Sara Omid done
جواب رو ببین
Hi Sara
Hi Omid
doneدرسته. خط تورفته برای هر اسم یه بار اجرا میشه، و print("done") تورفتگی نداره، پس فقط یه بار بعد از حلقه اجرا میشه.
انباشتگر یا جمع در حال رشد (Accumulator)
یه متغیر که قبل از حلقه میسازیش، داخل حلقه عوضش میکنی و بعد از حلقه ازش استفاده میکنی. برای جمع زدن: با total = 0 شروع میکنی، توی بدنه هر آیتم رو با total = total + s اضافه میکنی، و وقتی حلقه تموم شد یه بار print(total) میزنی. همین شکل برای شمردن (count = count + 1) یا ساختن یه لیست (append) هم کار میکنه.
جمع زدن رسیدهای خرید نگار: total از 0 شروع میشه، با هر رسید بزرگتر میشه، و مقدار آخرش همون پولیه که خرج کرده.
scores = [8, 5, 9]
total = 0
for s in scores:
total = total + s
print(total)22total اینجوری عوض میشه: 0، 8، 13، 22. خط print تورفتگی نداره، پس فقط یه بار بعد از دور آخر اجرا میشه و فقط جمع نهایی رو نشون میده.
خودت رو امتحان کن
امید برنامهی جمع در حال رشد رو کپی میکنه ولی print(total) رو ۴ تا فاصله تو میبره، یعنی میره داخل حلقه. برای [8, 5, 9] چی چاپ میشه؟
- 22
- 8، بعد 13، بعد 22، هر کدوم تو یه خط
- 8، بعد 5، بعد 9، هر کدوم تو یه خط
- هیچی، چون print نمیتونه داخل حلقه باشه
جواب رو ببین
8، بعد 13، بعد 22، هر کدوم تو یه خط
درسته. داخل حلقه، print هر دور اجرا میشه، پس بعد از هر قدم جمع رو میبینی: 8، 13، 22. وقتی فقط جمع آخر رو میخواستی، این یه غافلگیری رایجه.
قدمبهقدم ببین

قبل از حلقه: total = 0 خط اول، total = 0، توی پنل کد روشنه، پس جعبهی total عدد 0 رو نگه داشته. لیست 8، 5، 9 سمت راست منتظره و نشانگر هنوز درست قبلشه، جعبهی s خالیه چون حلقه هنوز شروع نشده، و پنل out (خروجی) هم خالیه.

دور اول: s برابر 8، total از 0 به 8 نشانگر میره زیر 8، پس حالا s عدد 8 رو داره، و خط روشن total = total + s اجرا میشه: یه +8 میره توی total و اون از 0 میشه 8. پنل out هنوز خالیه، چون print(total) بعد از حلقه میاد.

دور دوم: s برابر 5، total از 8 به 13 همون خط، آیتم بعدی. نشانگر میره زیر 5، مقدار s میشه 5، و total = total + s اون رو اضافه میکنه: total از 8 میشه 13. هیچ کد جدیدی نوشته نشده؛ بدنه فقط یه بار دیگه اجرا شد.

دور آخر: total از 13 به 22، بعد print نشانگر میرسه به 9، s عدد 9 رو داره، و یه +9 مقدار total رو از 13 میبره به 22. دیگه آیتمی نمونده، پس نشانگر از لیست بیرون میره، حلقه تموم میشه و خط بعدش، print(total)، یه بار اجرا میشه: 22 توی پنل out ظاهر میشه.
خودت رو امتحان کن
scores = [8, 5, 9]for s in scores:total = 0total = total + sprint(total)
جواب رو ببین
اشکال توی خط ۳.
درسته. total = 0 داخل حلقهست، پس اول هر دور جمع رو صفر میکنه و برنامه 9 رو چاپ میکنه، یعنی آخرین نمره. ببرش بالای خط for.
شمردن
range بهت عدد میده که روش حلقه بزنی
وقتی میخوای یه کاری رو یه تعداد مشخص تکرار کنی، روی یه range (بازه) حلقه بزن. range(5) این عددها رو میده: 0، 1، 2، 3، 4؛ پنج تا عدد که از 0 شروع میشن و قبل از 5 وایمیستن، درست مثل جای آیتمها تو لیست. range(1, 6) از 1 تا 5 میده. اگه خود عدد رو لازم نداری، بازم یه متغیر حلقه مینویسی؛ for i in range(3): print("hi") سه بار hi چاپ میکنه. حلقهی for روی یه رشته هم راه میره، یه کاراکتر در هر دور: for ch in "abc": اول a میده، بعد b، بعد c.
range(3) → 0، 1، 2. range(1, 4) → 1، 2، 3. عدد آخر هیچوقت جزوش نیست.
for i in range(1, 4):
print(i, "x 5 =", i * 5)1 x 5 = 5
2 x 5 = 10
3 x 5 = 15i مقدارهای 1 و 2 و 3 رو میگیره، هیچوقت 4 نمیشه. اگه به print چند تا مقدار با کاما بدی، همه رو تو یه خط با یه فاصله بینشون چاپ میکنه.
خودت رو امتحان کن
for i in range(3):
print(i)0 1 21 2 30 1 2 33
جواب رو ببین
0
1
2درسته. range(3) از 0 شروع میشه و قبل از 3 وایمیسته، پس i میشه 0، 1 و 2.
خودت رو امتحان کن
range(1, 6) چند تا عدد میده؟
- 4
- 5
- 6
- 7
جواب رو ببین
5
درسته. 1، 2، 3، 4، 5 رو میده: از 1 شروع میشه و قبل از 6 وایمیسته.
for یا while؟
for
وقتی یه مجموعه یا یه تعداد مشخص داری ازش استفاده کن: همهی نمرههای یه لیست، همهی خطهای یه فایل، ۱۰ بار.
وقتی آیتمها تموم بشن، خودش وایمیسته.
while
وقتی روی یه شرط وایمیستی و از قبل نمیدونی چند دور طول میکشه ازش استفاده کن: تا وقتی کاربر quit رو تایپ کنه، تا وقتی پول مونده.
while condition: تا وقتی شرط True باشه بدنه رو تکرار میکنه و قبل از هر دور دوباره چکش میکنه.
n = 3
while n > 0:
print(n)
n = n - 1
print("go")3
2
1
goهر دور n رو چاپ میکنه و یکی ازش کم میکنه. وقتی n به 0 میرسه، n > 0 میشه False، حلقه وایمیسته و print("go") که تورفتگی نداره اجرا میشه.
خودت رو امتحان کن
حلقهی while همیشه دستکم یه بار بدنهش رو اجرا میکنه.
جواب رو ببین
نادرست
غلطه. شرط قبل از هر دور چک میشه، حتی دور اول. با n = 0، شرط while n > 0: از همون اول Falseـه و بدنه اصلاً اجرا نمیشه.
مرور درس
- for x in items: بدنهی تورفته رو برای هر آیتم یه بار اجرا میکنه و x آیتم فعلی رو نگه میداره.
- جمع در حال رشد قبل از حلقه شروع میشه (total = 0)، داخلش بزرگ میشه و بعدش چاپ میشه.
- تورفتگی تعیین میکنه چی تکرار بشه: print داخل حلقه هر دور اجرا میشه، print بیرونش فقط یه بار.
- range(5) از 0 تا 4 میده و range(1, 6) از 1 تا 5؛ عدد آخر هیچوقت جزوش نیست.
- while تا وقتی شرطش True باشه تکرار میکنه؛ مطمئن شو یه چیزی داخلش شرط رو عوض میکنه، و برای زودتر بیرون اومدن از break استفاده کن.