دستورات تکرار یا حلقهها در هر زبان برنامهنویسی از اهمیت ویژهای برخوردار هستند، چرا که به کمک این دستورات میتوان وظایف را بهصورت خودکار و تکراری انجام داد. با استفاده از حلقه ها در پایتون، نیازی به نوشتن دستورات تکراری برای هر بار انجام یک کار مشابه نیست و به راحتی میتوان کدهای تمیز و کارآمدی نوشت. حلقه ها در پایتون نقش مهمی در کاهش پیچیدگی کدها و افزایش کارایی دارند. در این مقاله به بررسی حلقه ها در پایتون پرداخته و نحوه عملکرد آنها را همراه با مثالهای مختلف بررسی خواهیم کرد.
مقدمه
در زبان برنامهنویسی پایتون ابزارهای قدرتمندی برای مدیریت تکرارها وجود دارد. دو نوع اصلی تکرار یعنی حلقه For و حلقه While در این زبان وجود دارد. این حلقهها امکان اجرای چندباره یک مجموعه دستورات را فراهم میکنند و به کاربران اجازه میدهند تا نیازهای متنوع تکرار را بهسادگی مدیریت کنند.
حلقه ها در پایتون در مجموع سه روش مختلف برای اجرای تکرار ارائه میدهند. اگرچه هر سه روش هدف مشترکی دارند، اما در نحوه نوشتار (Syntax) در پایتون و زمان بررسی شرایط تفاوتهایی دارند. این تنوع، انعطافپذیری لازم را برای حل مسائل گوناگون در اختیار برنامهنویسان قرار میدهد. در ادامه این مقاله از سری مقالات آموزشی مجله پی استور به توضیح و تشریح همراه با مثال دستورات حلقه در پایتون خواهیم پرداخت.
حلقه While در پایتون
در پایتون، حلقه while برای اجرای مکرر یک بلوک از دستورات تا زمانی که یک شرط خاص برقرار باشد، استفاده میشود. حلقه while بهطور پیوسته شرایط را بررسی میکند و مادامی که شرط درست باشد، دستورات درون آن اجرا میشوند. زمانی که شرط نادرست شود، حلقه خاتمه مییابد و اجرای برنامه به دستور بعدی که بلافاصله پس از حلقه قرار دارد، منتقل میشود.
ترکیب دستور حلقه While در پایتون به این صورت است:
while expression: statement(s)
تمام دستورات که پس از یک ساختار برنامهنویسی با تعداد یکسانی فاصله «indentation» قرار گرفتهاند، به عنوان بخشی از یک بلوک کد در نظر گرفته میشوند. پایتون از فاصلهگذاری به عنوان روش خود برای گروهبندی دستورات استفاده میکند.
حال، بیایید نحوه استفاده از حلقه while در پایتون را با مثال یاد بگیریم:
در این مثال، از حلقه while برای چاپ عبارت «Hello Programstore» به تعداد سه بار استفاده میشود و متغیری به نام count از ۱ تا ۳ افزایش مییابد.
count = 0 while (count < 3): count = count + 1 print("Hello Programstore")
خروجی:
Hello Programstore Hello Programstore Hello Programstore
استفاده از عبارت else با حلقه While در پایتون
عبارت else تنها زمانی اجرا میشود که شرط حلقه while نادرست شود. اگر حلقه با استفاده از دستور break متوقف شود یا یک استثنا رخ دهد، عبارت else اجرا نخواهد شد. ترکیب حلقه While همراه با عبارت else به صورت زیر است:
while condition: # execute these statements else: # execute these statements
در این مثال، حلقه while عبارت «Hello ProgramStore» را سه بار چاپ میکند و سپس پس از اتمام حلقه، عبارت «In Else Block» چاپ میشود زیرا یک بلوک else به حلقه while متصل است.
count = 0 while (count < 3): count = count + 1 print("Hello ProgramStore") else: print("In Else Block")
خروجی:
Hello ProgramStore Hello ProgramStore Hello ProgramStore In Else Block
حلقه While نامتناهی در پایتون
اگر بخواهیم یک بلوک کد به تعداد نامتناهی اجرا شود، میتوانیم از حلقه while در پایتون استفاده کنیم.
این حلقه با شرط (count == 0) اجرا میشود. این حلقه تنها زمانی اجرا خواهد شد که count برابر با ۰ باشد. از آنجایی که مقدار اولیه count برابر با ۰ است، حلقه به طور نامتناهی اجرا میشود زیرا شرط همیشه درست است.
count = 0 while (count == 0): print("Hello programstore")
توجه: پیشنهاد میشود از این نوع حلقه استفاده نشود، زیرا یک حلقه بیپایان است که شرط آن همیشه درست است و برای خاتمه دادن به آن باید به اجبار کامپایلر را متوقف کنید.
حلقه For در پایتون
حلقههای for برای پیمایش ترتیبدار (مثل پیمایش یک لیست، رشته یا آرایه) استفاده میشوند. در پایتون، حلقه for in وجود دارد که مشابه حلقه foreach در زبانهای دیگر است. چگونه از حلقههای for در پایتون برای پیمایش ترتیبدار استفاده کنیم؟ ترکیب دستور حلقه For در پایتون به این صورت است:
for iterator_var in sequence: statements(s)
حلقه for در پایتون میتواند برای تکرار روی یک بازه «range» یا به کمک ایتراتورها استفاده شود. این امکان را میدهد که به راحتی روی مجموعهای از مقادیر یا اشیاء پیمایش انجام دهید.
مثال:
این کد از حلقه for پایتون استفاده میکند که روی مقادیر از ۰ تا ۳ (بدون شامل ۴) با استفاده از ساختار range(0, n) پیمایش میکند. در هر تکرار حلقه، مقادیر متغیر i چاپ میشود.
n = 4 for i in range(0, n): print(i)
خروجی:
۰ ۱ ۲ ۳
در پایتون، میتوان از حلقه for برای پیمایش روی لیستها، تاپلها، رشتهها و دیکشنریها استفاده کرد.
این کد روشهای مختلفی را برای پیمایش از روی دادههای مختلف در پایتون نشان میدهد. این مثالها نشان میدهند که چگونه میتوان روی لیستها، تاپلها، رشتهها، دیکشنریها و مجموعهها پیمایش کرد و عناصر یا جفتهای کلید مقدار آنها را چاپ کرد. خروجی نشاندهنده محتوای هر ساختار داده است که در حین پیمایش نمایش داده میشود.
print("List Iteration") l = ["program", "store", "ahar"] for i in l: print(i) print("\nTuple Iteration") t = ("program", "store", "ahar") for i in t: print(i) print("\nString Iteration") s = "ahar" for i in s: print(i) print("\nDictionary Iteration") d = dict({'x':123, 'y':354}) for i in d: print("%s %d" % (i, d[i])) print("\nSet Iteration") set1 = {1, 2, 3, 4, 5, 6} for i in set1: print(i),
خروجی:
List Iteration program store ahar Tuple Iteration program store ahar String Iteration a h a r Dictionary Iteration x 123 y 354 Set Iteration ۱ ۲ ۳ ۴ ۵ ۶
در پایتون، میتوانیم از ایندکس عناصر در دنباله برای پیمایش استفاده کنیم. ایده اصلی این است که ابتدا طول لیست را محاسبه کرده و سپس در محدوده طول آن دنباله پیمایش کنیم.
در این مثال زیر از حلقه for برای پیمایش در یک لیست و چاپ هر عنصر استفاده میکند. این حلقه بر اساس ایندکس هر عنصر که با استفاده از range(len(list)) به دست میآید، لیست را پیمایش میکند. نتیجه این است که هر آیتم در لیست در خطوط جداگانه چاپ میشود.
list = ["program", "store", "ahar"] for index in range(len(list)): print(list[index])
خروجی:
program store ahar
استفاده از عبارت else with for Loop در پایتون
در پایتون، میتوانیم عبارت else را با حلقه for ترکیب کنیم، مشابه آنچه که در حلقه while انجام میدهیم. اما از آنجا که در حلقه for شرطی وجود ندارد که بر اساس آن اجرای حلقه خاتمه یابد، بلوک else بلافاصله پس از اتمام اجرای حلقه for اجرا میشود. در تکه کد زیر، حلقه for روی یک لیست پیمایش کرده و هر عنصر را چاپ میکند، مشابه مثال قبلی. اما پس از اتمام حلقه، بلوک else اجرا میشود. در این مورد، پس از اتمام حلقه، عبارت «Inside Else Block» چاپ خواهد شد.
list = ["program", "store", "ahar"] for index in range(len(list)): print(list[index]) else: print("Inside Else Block")
خروجی:
program store ahar Inside Else Block
در زبان برنامهنویسی پایتون، میتوان از یک حلقه در داخل حلقه دیگری استفاده کرد که به آن حلقه تو در تو «nested loop» گفته میشود. در این بخش، چندین مثال برای توضیح این مفهوم آورده شده است. ترکیب دستور حلقههای تو در تو در پایتون به این صورت است:
for iterator_var in sequence: for iterator_var in sequence: statements(s) statements(s)
ترکیب دستور حلقه while تو در تو در زبان برنامهنویسی پایتون به صورت زیر است:
while expression: while expression: statement(s) statement(s)
یک نکته پایانی درباره حلقههای تو در تو این است که در پایتون میتوان هر نوع حلقهای را در داخل نوع دیگری از حلقهها قرار داد. به عنوان مثال، میتوان یک حلقه for را داخل یک حلقه while قرار داد یا بالعکس.
در این مثال، از حلقههای تو در تو for برای ایجاد یک الگوی مثلثی از اعداد استفاده شده است. این کد از ۱ تا ۴ پیمایش میکند و در هر تکرار، عدد جاری را چندین بار بر اساس شماره تکرار چاپ میکند. نتیجه یک الگوی شبیه به هرم از اعداد خواهد بود.
from __future__ import print_function for i in range(1, 5): for j in range(i): print(i, end=' ') print()
خروجی:
۱ ۲ ۲ ۳ ۳ ۳ ۴ ۴ ۴ ۴
دستورات کنترل حلقه
دستورات کنترل حلقه، روند اجرای طبیعی حلقه را تغییر میدهند. زمانی که اجرای برنامه از یک محدوده خارج میشود، تمام اشیاء خودکاری که در آن محدوده ایجاد شدهاند، حذف میشوند. پایتون از دستورات کنترل زیر پشتیبانی میکند:
دستور Continue
دستور continue در پایتون کنترل حلقه را به ابتدای آن بازمیگرداند و از اجرای دستورات باقیمانده در تکرار جاری صرفنظر میکند.
در این مثال، کد روی حروف رشته programstore پیمایش میکند. هنگامی که به حروف e یا s میرسد، از دستور continue استفاده میکند تا تکرار جاری را رد کند و به حرف بعدی برود. برای سایر حروف، عبارت «:Current Letter» همراه با حرف مربوطه چاپ میشود. بنابراین، خروجی تمام حروف به جز e و s را نشان میدهد، هر کدام در یک خط جداگانه.
for letter in 'programstore': if letter == 'e' or letter == 's': continue print('Current Letter :', letter)
خروجی:
Current Letter : p Current Letter : r Current Letter : o Current Letter : g Current Letter : r Current Letter : a Current Letter : m Current Letter : t Current Letter : o Current Letter : r
دستور Break
دستور break در پایتون کنترل اجرای برنامه را از داخل حلقه خارج میکند.
در این تکه کد زیر روی حروف رشته programstore پیمایش میکند. هنگامی که به حروف e یا s میرسد، از دستور break برای خروج از حلقه استفاده میکند. پس از خاتمه حلقه، عبارت «:Current Letter» همراه با آخرین حرفی که در حلقه پردازش شده (اولین مورد از e یا s که یافت شده) چاپ میشود. بنابراین، خروجی عبارت «:Current Letter» همراه با اولین e یا s موجود در رشته خواهد بود.
for letter in 'programstore': if letter == 'e' or letter == 's': break print('Current Letter :', letter)
خروجی:
Current Letter : s
دستور Pass
در پایتون از دستور pass برای نوشتن حلقههای خالی استفاده میشود. همچنین میتوان از آن برای کنترل ساختارها، توابع و کلاسهای خالی استفاده کرد.
در این مثال، کد روی حروف رشته programstore با استفاده از حلقه for پیمایش میکند. اما در داخل حلقه هیچ عملی انجام نمیشود و از دستور pass استفاده شده است. پس از پایان حلقه، عبارت «:Last Letter» همراه با آخرین حرف رشته که e است چاپ میشود.
for letter in 'programstore': pass print('Last Letter :', letter)
خروجی:
Last Letter : e
نحوه عملکرد حلقه for به صورت داخلی در پایتون
ابتدا یک نمونه ساده از حلقه for در پایتون را بررسی میکنیم:
مثال:
این کد روی یک لیست به نام fruits که شامل مقادیر «apple»، «orange» و «kiwi» است، پیمایش میکند. این کد نام هر میوه را در یک خط جداگانه چاپ میکند و آنها را به همان ترتیب که در لیست هستند، نمایش میدهد.
fruits = ["apple", "orange", "kiwi"] for fruit in fruits: print(fruit)
در اینجا میبینیم که حلقههای for روی یک شی قابل تکرار «iterable» به نام fruits که یک لیست است، پیمایش میکنند. لیستها، مجموعهها، دیکشنریها از جمله اشیا قابل تکرار هستند، در حالی که اشیاء عددی مانند اعداد صحیح (integers) قابل تکرار نیستند. حلقههای for میتوانند روی هر یک از این اشیاء قابل تکرار پیمایش کنند.
این کد پایتون بهصورت دستی از یک ایتریتور برای پیمایش در لیست میوهها استفاده میکند. این کد نام هر میوه را یکی یکی چاپ میکند و زمانی که دیگر آیتمی در لیست نباشد، خاتمه مییابد.
fruits = ["apple", "orange", "kiwi"] iter_obj = iter(fruits) while True: try: fruit = next(iter_obj) print(fruit) except StopIteration: break
خروجی:
apple orange kiwi
نتیجه گیری
حلقه ها در پایتون ابزاری قدرتمند برای تکرار اجرای یک سری دستورات هستند. در پایتون، سه نوع حلقه اصلی وجود دارد: حلقه for، حلقه while و حلقههای تو در تو. حلقه for برای پیمایش در مجموعههای قابل تکرار مانند لیستها، رشتهها و دیکشنریها استفاده میشود. این حلقه به ما این امکان را میدهد که روی هر عنصر از مجموعه به طور خودکار تکرار کنیم. حلقه while تا زمانی که یک شرط خاص درست باشد، ادامه مییابد. این حلقه زمانی مفید است که تعداد تکرارها را نتوان از قبل پیشبینی کرد.
حلقههای تو در تو زمانی استفاده میشوند که بخواهیم یک حلقه را داخل حلقه دیگری قرار دهیم، که این امر برای انجام وظایف پیچیدهتر و تکرارهای چند سطحی ضروری است. همچنین، در حلقهها میتوان از دستورات کنترلی مانند break برای خروج از حلقه، continue برای رد کردن یک تکرار و pass برای ایجاد حلقههای خالی استفاده کرد. این دستورات کنترل، انعطافپذیری بیشتری را در نحوه رفتار حلقهها ایجاد میکنند. به طور کلی، حلقه ها در پایتون ابزارهای حیاتی برای انجام کارهای تکراری و بهینهسازی عملکرد برنامهها هستند.