یکی از مهمترین بخشها در یادگیری زبان برنامهنویسی پایتون در مراحل مقدماتی، آشنایی با شرطها، حلقهها و درنهایت حلقههای تو در تو است. یکی از رایجترین مباحث در تمرینات این بخش، ساخت الگوها و اشکال مختلف با علائم مختلفی چون «*» و «$» و «#» است.
حلقههای تو در تو در پایتون ابزاری قدرتمند برای ایجاد الگوهای پیچیده و ساختارهای دادهای هستند. زمانی که یک حلقه در داخل حلقه دیگری قرار میگیرد، حلقه داخلی برای هر تکرار حلقه بیرونی به طور کامل اجرا میشود. و این امکان را به برنامهنویس میدهد تا ساختارهایی مانند جدولها و اشکال هندسی مانند انواع مثلث و مربع را به سادگی ایجاد کند.
اگر شما هم مانند بسیاری از نوآموزان زبان برنامهنویسی پایتون در پیادهسازی این اشکال با چالش مواجهاید، من قصد دارم در این مقاله منطق و اصول کلی برای کدنویسی تمام این اشکال را به شما آموزش دهم تا شما بتوانید یکبار برای همیشه این موضوع را به خوبی فرابگیرید و از آن در حل الگوهای مختلف استفاده کنید.
آنچه در این نوشته خواهیم داشت
حلقههای تو در تو (Nested Loops) در پایتون
حلقههای تو در تو (Nested Loops) همانطور که از نامش پیداست، در برنامهنویسی به معنی استفاده از یک حلقه در داخل حلقهای دیگر است. این ساختار به برنامهنویس این امکان را میدهد تا عملیات تکراری را بر روی مجموعهای از دادهها پیادهسازی کند که خود شامل مجموعههای دیگری از دادهها هستند.
برای درک بهتر حلقههای تو در تو، باغچهای را تصور کنید که چندین ردیف دارد و در هر ردیف چندین گل وجود دارد. برای آب دادن به همه گلها، چه کار میکنید؟
- ردیف به ردیف پیش میروید: این کار مانند حلقه بیرونی است. شما هر ردیف را یک بار بررسی میکنید.
- در هر ردیف، به هر گل آب میدهید: این کار شبیه حلقه داخلی است. برای هر ردیف، شما به هر گل آن ردیف بهطور جداگانه آب میدهید.
در برنامهنویسی هم همین اتفاق میافتد:
- حلقه بیرونی: مثل این است که شما دارید ردیفهای باغچه را میشمارید.
- حلقه داخلی: مثل این است که شما دارید گلهای هر ردیف را میشمارید.
در نتیجه نحوه اجرای حلقههای تو در تو به این صورت است:
۱. ابتدا حلقه بیرونی اجرا شده و یک مقدار اولیه به متغیر شمارنده آن اختصاص داده میشود.
۲. بدنه حلقه بیرونی اجرا میشود.
۳. در هر تکرار از حلقه بیرونی، حلقه داخلی به طور کامل اجرا میشود.
۴. حلقه داخلی هم از مقدار اولیه متغیر شمارنده شروع میشود و تا زمانی که شرط پایان آن برقرار نباشد، به تکرار ادامه میدهد.
۵. در هر تکرار از حلقه داخلی، بدنه حلقه داخلی اجرا میشود.
۶. پس از اتمام اجرای حلقه داخلی، مقدار متغیر شمارنده حلقه بیرونی یک واحد افزایش مییابد و شرط ادامه حلقه بیرونی بررسی میشود.
۷. اگر شرط ادامه حلقه بیرونی برقرار باشد، به مرحله ۲ برمیگردیم و حلقه داخلی دوباره اجرا میشود.
۸. در غیراینصورت، حلقه بیرونی به پایان میرسد و کل عملیات حلقههای تو در تو تمام میشود.
اساس ساخت اشکال در زبان پایتون
۱) اساس ساخت این الگوها افزایش یا کاهش هرم است، مابقی اشکال از قبیل hill pattern، Diamond و… از ترکیب این اشکال به دست میآیند.
۲) اجرای کد از بالا به پایین و از چپ به راست است و خلاف جهت آن برنامه عمل نمیکند.
نکته: هیچ گونه پرش در ساخت اشکال وجود ندارد و فضاهای خالی نیز بر اساس آنچه در الگوریتم وجود دارد، چاپ می شوند.
ساخت الگوهای پایتون با حلقه های تو در تو
برای نوشتن کد الگوهای پایتون، پاسخ به این سوال اهمیت بالایی دارد.
سایز الگو چه قدر است. منظور من از سایز این است که الگوی ما از چند ردیف ساخته شده است. تعداد ردیفها در این دست الگوها همان عددی است که از کاربر تحت عنوان input میگیریم.
پس گام اول در ساخت این الگوها مشخص کردن اندازه الگوست که به دو روش انجام میگردد:
n = int(input(“enter a positive number:”))
def pattern (n)
استفاده از حلقههای تو در تو برای ساخت مربع
در این بخش نوشتن الگوریتم هرمهای مختلف با حلقههای تو در تو را با سادهترین شکل یعنی یک مربع آغاز میکنیم.
اگر از شما خواسته شود که یک ستاره در ترمینال چاپ کنید، کافی است دستور (“*”) print را اجرا کنید.
اما ما میتوانیم با تعریف یک حلقه تعداد مشخصی ستاره نیز چاپ کنیم.
برای این کار از کد زیر استفاده میشود:
n = 5 for i in range(n) Print(“*”)
با استفاد از این حلقه در ۵ سطر متوالی ۱ ستاره مشاهده خواهیم کرد. اما ما میخواهیم در هر یک خط ۵ ستاره مشاهده کنیم بناابراین باید کد بالا را به کد زیر تغییر دهیم.
n = 5 for i in range(n) Print(“*”, end= ” ")
حال اگر ما بخواهیم یک مربع یا ستاره درست کنیم کافی است این دو حلقه را در دو جهت افقی و عمودی با هم ترکیب کنیم.
بدین شکل:
for i in range(n) for j in range(n) print(“*”, end=" ")
کد نهایی:
size = 5 # Create a list of rows for i in range(0, size): # Create a list of columns for j in range(0, size): print("*", end="") print()
نکته بسیار مهم: پس از پایان حلقه نیاز است تا یک ()print نیز خارج از لوپ قرار بگیرد تا بعد از چاپ یک خط، برنامه به خط بعدی حرکت کند.
نکته بسیار مهم ۲: برای اینکه مربع شما، تبدیل به مستطیل نشود حتما باید ” “ = end را در print قرار دهید اگر این عبارت وجود نداشته باشد، مربع به مستطیل تبدیل خواهد شد. پارامتر end نیز به شما این اطمینان را میدهد تا بعد از چاپ هر ستاره فاصله مشخصی تا ستاره بعدی به وجود بیاید.
نکته بسیار مهم ۳: شما در print می توانید به جای علامت * از هر علامت دیگری استفاده کنید.
Increasing triangle
برای نوشتن این الگو، به کد قبلی نگاه کنید:
ما میدانیم که حلقه اول مربوط به ردیفها و حلقه دوم مربوط به ستونهاست.
چون همچنان ۵ ردیف داریم پس حلقه بیرونی تغییر نمیکند اما ما در ستونهای مختلف تعداد ستارههای متفاوتی در خروجی چاپ میکنیم بنابراین حلقه داخلی قطعا با تغییرات مواجه خواهد بود و هر سطر نسبت به سطر قبلی خودش یک ستاره بیشتر خواهد داشت. بنابراین حلقه داخلی به جای بازه n در بازه i+1 طی خواهد شد.
کد مثلث افزایشی:
# pyramid star pattern n = 5 for i in range(1, n+1): for j in range(n - i): print(' ', end='') for k in range(2 * i - 1): print('*', end='') print()
Decreasing triangle
مجدد از کد مربع شروع میکنیم. در این الگوریتم نیز مجددا تعداد سطرهای ما تغیر نمیکند پس حلقه اولی بدون تغییر باقی میماند اما هر سطر نسبت به سطر قبل یک ستاره کمتر دارد.
پس کد را به شکل زیر تغییر می دهیم:
# reverse pyramid pattern n = 5 for i in range(1, n+1): # printing spaces for j in range(i-1): print(' ', end='') # printing stars for j in range(2*(n-i)+1): print('*', end='') print()
به مدلهای دیگر الگوریتمهای ستاره توجه کنید. تمام الگوریتمهای دیگر حلقههای تو در تو بر همین اساس کدنویسی شدهاند و ترکیبی از مثلثهایی با فضای خالی یا ستاره هستند.
Left sided triangle
نوشتن کد این مدل از هرمها کمی متفاوت از مدلهای قبلی است ولی دقیقا بر همان اصول پا برجاست. اگر کمی دقیقتر به این شکل نگاه کنیم متوجه خواهیم شد که ما با یک مربع روبرو هستیم که توسط قطر مربع نصف شده است، بخش سمت چپ آن یک مثلث است که خطوط آن را فضای خالی تشکیل داده و سمت راست آن مثلثی است که از ستاره تشکیل شده است.
پس کد ما از سه حلقه تشکیل شده است. یک حلقه بیرونی که مانند تمامی مثالهای قبلی بر تعداد سطرها دلالت میکند و دو حلقه درونی که ستونها را با دو علامت فضای خالی و ستاره کامل میکند.
به کد زیر دقت کنید و خط به خط آن را دنبال کنید.
# Left triangle star pattern n = 5 for i in range(1, n+1): # internal loop run for i times for k in range(1, i+1): print("*", end="") print()
Right sided triangle
این الگوریتم از دو بخش تشکیل شده است: مثلث کاهشی فضای خالی، مثلث افزایشی ستاره. بنابراین کافیست دو کد ساده مثالهای قبل را با هم ترکیب کنیم و از یک حلقه خارجی و دو حلقه داخلی استفاده کنیم. به کد زیر توجه کنید:
# right triangle star pattern size = 5 for i in range(size): for j in range(1, size - i): print(" ", end="") for k in range(0, i + 1): print("*", end="") print()
Hill pattern triangle
این الگوریتم نیز مانند مثالهای قبل، متشکل از یک مثلث خالی کاهشی و دو مثلث افزایشی و کاهشی با علامت ستاره است.
به کد زیر دقت کنید:
print('Hill Pattern\n') n = 5 for i in range(n): for j in range(i,n): print(' ', end = ' ') for j in range(i): print('*' , end = ' ') for j in range(i+1): print('*' , end = ' ') print()
Reverse hill triangle
این الگو نیز کاملا مشابه الگوهای قبلی است و از همان منطق پیروی میکند، بنابراین از توضیح مجدد آن خودداری میکنم و شما را به مشاهده و تحلیل کد زیر دعوت می کنم:
print('Reverse Hill Pattern\n') n = 5 for i in range(n): for j in range(i+1): print(' ', end = ' ') for j in range(i,n-1): print('*' , end = ' ') for j in range(i,n): print('*' , end = ' ') print()
جمع بندی
در این بخش از سری مقالات آموزش پایتون آکادمی آمانج یاد گرفتیم تا الگوهای مختلفی را در پایتون بنویسیم و با حلقههای تو در تو بیشتر آشنا شویم. همانطور که مشاهده فرمودید نوشتن کد این الگوها تماما بر اصول مشخصی استوار است. کافی است تا با منطق این الگوها آشنا شوید تا از پس هر سوالی بهراحتی بربیایید. اگر سوالی در رابطه با الگوهای بالا داشید و یا بخشی را متوجه نشدید حتما در انتهای مقاله سوالات خود را با ما در میان بگذارید. امیدوارم مطالعه این مقاله برای شما مفید باشد.
همش جواب نمیده
ممنون از آموزشتون خیلی برام مفید بود.