حلقه ها در پایتون — مفید و کاربردی

عکس شاخص حلقه ها در پایتون

دستورات تکرار یا حلقه‌ها در هر زبان برنامه‌نویسی از اهمیت ویژه‌ای برخوردار هستند، چرا که به کمک این دستورات می‌توان وظایف را به‌صورت خودکار و تکراری انجام داد. با استفاده از حلقه ها در پایتون، نیازی به نوشتن دستورات تکراری برای هر بار انجام یک کار مشابه نیست و به راحتی می‌توان کدهای تمیز و کارآمدی نوشت. حلقه ها در پایتون نقش مهمی در کاهش پیچیدگی کدها و افزایش کارایی دارند. در این مقاله به بررسی حلقه ها در پایتون پرداخته و نحوه عملکرد آن‌ها را همراه با مثال‌های مختلف بررسی خواهیم کرد.

مقدمه

در زبان برنامه‌نویسی پایتون ابزارهای قدرتمندی برای مدیریت تکرارها وجود دارد. دو نوع اصلی تکرار یعنی حلقه 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 برای ایجاد حلقه‌های خالی استفاده کرد. این دستورات کنترل، انعطاف‌پذیری بیشتری را در نحوه رفتار حلقه‌ها ایجاد می‌کنند. به طور کلی، حلقه ها در پایتون ابزارهای حیاتی برای انجام کارهای تکراری و بهینه‌سازی عملکرد برنامه‌ها هستند.


سوالات متداول


کدام حلقه در پایتون سریع تر است؟

به طور کلی، حلقه‌های for در پایتون معمولاً سریع‌تر از حلقه‌های while هستند، زیرا نحوه پیاده‌سازی آن‌ها به‌گونه‌ای است که کارایی بهتری دارد. با این حال، تفاوت عملکرد بین حلقه‌های for و while معمولاً برای بیشتر کاربردهای عملی بی‌اهمیت است. انتخاب بین این دو باید بر اساس وضوح کد و تناسب آن با وظیفه خاص باشد، نه نگرانی‌های مربوط به عملکرد.

چرا پایتون در حلقه کند است؟

پایتون ممکن است در حلقه‌ها نسبت به زبان‌های سطح پایین مانند C یا ++C کندتر به نظر برسد. این موضوع عمدتاً به این دلیل است که پایتون یک زبان مفسری است، به این معنی که هر خط کد به طور جداگانه در زمان اجرا اجرا می‌شود. علاوه بر این، تایپ داینامیک و مدیریت حافظه در پایتون می‌تواند نسبت به زبان‌های کامپایل‌شده و تایپ‌دار (مانند C یا ++C) هزینه‌های اضافی ایجاد کند.

چند حلقه در پایتون استفاده می شود؟

پایتون از انواع مختلف حلقه‌ها پشتیبانی می‌کند: حلقه for: برای پیمایش در یک توالی (مثلاً لیست، تاپل، رشته، دیکشنری) استفاده می‌شود، حلقه while: یک بلوک کد را تا زمانی که یک شرط خاص درست باشد، اجرا می‌کند، حلقه‌های تو در تو (Nested loops): یک حلقه داخل حلقه دیگری قرار می‌گیرد، فهم‌ها (Comprehensions): روش‌های مختصر برای ایجاد لیست‌ها، دیکشنری‌ها و غیره با استفاده از حلقه‌ها (مثلاً لیست فهم‌ها، دیکشنری فهم‌ها).

نحوه بهبود حلقه های پایتون چگونه است؟

برای بهینه‌سازی حلقه‌ها در پایتون، این نکات را در نظر بگیرید: استفاده از لیست فهم‌ها (List comprehensions): این روش‌ها معمولاً سریع‌تر از حلقه‌های for سنتی برای ایجاد لیست‌ها هستند، کاهش تماس‌های تابعی: تماس‌های توابع را در صورت امکان خارج از حلقه‌ها قرار دهید، استفاده از توابع داخلی: توابع داخلی پایتون (مانند map() , filter() , sum) بهینه‌سازی شده‌اند و می‌توانند سریع‌تر از حلقه‌های دستی باشند، پروفایل کردن کد: از ابزارهایی مانند cProfile برای شناسایی نقاط تنگنا و بهینه‌سازی آن‌ها استفاده کنید، استفاده از کتابخانه‌ها: کتابخانه‌هایی مانند NumPy و pandas توابع بهینه‌شده‌ای برای انجام کارهای معمولی involving loops over arrays یا data frames دارند.

میزان رضایتمندی
لطفاً میزان رضایت خودتان را از این مطلب با دادن امتیاز اعلام کنید.
[ امتیاز میانگین 5 از 1 نفر ]
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع و مراجع:
geeksforgeeks مجله پی استور

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *



برچسب‌ها:
پایتون


پیمایش به بالا