الگوهای حلقه
در این درس پرکاربردترین الگوهای حلقه را تمرین میکنید؛ انباره، شمارنده، بیشینه، جستوجو، حلقههای تو در تو و ساخت خروجی مرحلهبهمرحله.
آنچه در این درس میآموزید
- الگوهای انباره، شمارنده و بیشینه را در حلقه تشخیص دهید و بنویسید
- با پرچم و break جستوجو در دادهها انجام دهید
- حلقههای تو در تو را بخوانید و بنویسید
فهرست مطالب
دستور for و while را یاد گرفتید؛ حالا سؤال واقعی این است: با حلقه چه میسازند؟ تقریباً هر برنامهای که در دنیای واقعی میبینید، ترکیبی از چند الگوی حلقه ثابت است. این درس شش الگوی پرتکرار را با مثال مشخص میسازد؛ وقتی اینها را شناختید، خواندن کد دیگران و نوشتن کد خودتان چند پله سادهتر میشود.
الگوی انباره؛ جمع کردن در مسیر
انباره (Accumulator) متغیری است بیرون حلقه که در هر دور کمی پر میشود. جمع مربعهای اعداد ۱ تا ۵:
total = 0
for i in range(1, 6):
total += i * i
print(total)55
سطر اول انباره را با مقدار خنثی شروع میکند: برای جمع صفر، برای ضرب یک، برای ساخت رشته رشته خالی. در هر دور، نتیجه جدید به انباره اضافه میشود. اگر مقدار شروع را غلط بگذارید، همه حسابها خراب میشود؛ پس همیشه بپرسید: «مقدار خنثی این تجمیع چیست؟»
الگوی شمارنده
شمارنده (Counter) نوع خاصی از انباره است که فقط میشمارد چند بار اتفاقی رخ داده. برنامهای که حروف صدادار یک کلمه را میشمارد:
word = "programming"
vowels = "aeiou"
count = 0
for ch in word:
if ch in vowels:
count += 1
print(count)3
عملگر in اینجا بررسی میکند آیا حرف جاری داخل رشته حروف صدادار هست یا نه؛ اگر بود، شمارنده یکی بالا میرود. نتیجه ۳ است: o و a و i.
الگوی بیشینه/کمینه
برای یافتن بزرگترین (یا کوچکترین) مقدار، یک قهرمان فعلی نگه میدارید و هر نامزد تازه را با آن مقایسه میکنید. بزرگترین رقم عدد ۴۹۳۱:
number = 4931
biggest = 0
for digit_char in str(number):
digit = int(digit_char)
if digit > biggest:
biggest = digit
print(biggest)9
رقمها را از تبدیل رشتهای عدد میگیریم (درس انواع داده) و هر رقم بزرگتر از قهرمان فعلی، جای آن را میگیرد. دقت کنید قهرمان اولیه باید طوری انتخاب شود که در مسابقه شکستخورده نباشد؛ برای بیشینهٔ ارقام، صفر ایمن است.
الگوی جستوجو با پرچم
پرچم (Flag) متغیری bool است که «آیا حادثه رخ داده؟» را نگه میدارد. جستوجوی حرف «l» در یک کلمه:
found = False
for ch in "Hello":
if ch == "l":
found = True
break
print(found)True
پرچم از False شروع میشود، با یافتن هدف بالا میرود و break حلقه را همانجا میبندد؛ ادامه جستوجو بیمعناست. این الگو پایه جستوجو در هر مجموعهای است که بعداً با فهرستها و دیکشنریها باز هم بیشتر به کارتان میآید.
حلقههای تو در تو
وقتی داده دو بعد دارد، حلقه داخل حلقه مینشیند. جدول ضرب ۳ در ۳:
for row in range(1, 4):
for col in range(1, 4):
print(row * col, end=" ")
print()1 2 3 2 4 6 3 6 9
قاعده خواندنش ساده است: به ازای هر یک دور حلقه بیرونی، حلقه درونی کامل میچرخد. row اول میشود ۱ و col سه بار میچرخد؛ بعد row میشود ۲ و دوباره سه دور. print() بدون آرگومان فقط خط جدید میکشد تا هر سطر از سطر بعد جدا شود.
الگوی ساخت خروجی مرحلهبهمرحله
الگوی آخر ترکیب حلقه با عملهای رشته است که در درس عملگرها دیدید؛ مثل چاپ مثلث ستارهای:
for i in range(1, 5):
print("*" * i)**
در دور اول یک ستاره، در دور دوم دو ستاره، و همینطور تا چهار. تکرار رشته با * کار سنگینی را به یک عبارت کوتاه سپرده است.
تمرینها
تمرین
تمرین ۱ — فیزباز
عددهای ۱ تا ۱۵ را پیمایش کنید: اگر عدد بر ۳ و ۵ بخشپذیر بود «FizzBuzz» چاپ شود، اگر فقط بر ۳ بود «Fizz»، اگر فقط بر ۵ بود «Buzz» و در غیر این صورت خود عدد.
# Write your code hereنمایش راهحل
for i in range(1, 16):
if i % 15 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz
::: :::
خلاصه
- انباره با مقدار خنثی (صفر برای جمع، یک برای ضرب) شروع و در هر دور بهروز میشود.
- شمارنده نوع خاصی از انباره است که وقتیها را میشمارد.
- الگوی بیشینه با یک «قهرمان فعلی» و مقایسه هر نامزد تازه کار میکند.
- جستوجو با پرچم bool و break انجام میشود و بهمحض یافتن، تمام میشود.
- در حلقه تو در تو، به ازای هر دور بیرونی، حلقه درونی کامل میچرخد.
کد شما دارد بزرگ میشود و بلوکهای تکراری پیدا میشوند؛ زمان آن رسیده که یاد بگیرید کد را در تابع بستهبندی کنید. در درس بعدی توابع را میسازیم.