به کمک حلقهها که جزء دستورات کنترلی هستند، میتوانیم در توالیها پیمایش کرده یا یک قطعه کد را چندین بار تکرار کنیم. در این مقاله به آموزش حلقه در پایتون پرداخته و با ۲ نوع اصلی و ترفندهای کار با آنها آشنا خواهیم شد.
فرض کنید در یک لیست پایتون تعدادی عدد دارید که میخواهید تمام آنها را با هم جمع کنید. یا یک رشته متنی دارید که میخواهید تک به تک کاراکترهای آن را بررسی کنید. شاید بخواهید تا زمانی که یک شرط برقرار بود، برنامه پایتون یک کار ثابت یا مشابه را انجام دهد.
برای انجام تمام اینگونه کارها میتوان از حلقهها (Python Loops) کمک گرفت. حلقهها یکی از پر کاربردترین دستورات کنترلی هستند.
انواع حلقه در پایتون
در زبان برنامه نویسی پایتون دو نوع اصلی حلقه داریم:
- حلقه while
- حلقه for
هر کدام از این Loopها در جای خاص خود کاربرد دارند ولی کار اصلی هر دو تقریباً مشابه است.
اگر کمی خلاقیت را چاشنی کارتان کنید، احتمالاً بتوانید این دو نوع حلقه را به یکدیگر تبدیل کرده و به جای هم استفاده کنید! اما بهتر است از هر کدام در جای مناسب خود بهره ببرید.
در تصویر زیر یک فلوچارت (یا روندنما) کلی از عملکرد حلقهها در برنامهنویسی نمایش داده شده است.
بعضاً نیاز است در ابتدای کار یک یا چند متغیر مورد نیاز را مقداردهی اولیه کنیم. سپس یک شرط برای حلقه تعریف میکنیم.
مادامی که آن شرط برقرار باشد، قطعه کد درون محدوده حلقه اجرا خواهد شد. پس از هر بار اجرای کد، مجدداً شرط مورد نظر چک میشود. هر زمان که شرط برقرار نبود، از حلقه خارج شده و ادامه برنامه اجرا خواهد شد.
حلقه while در پایتون
با استفاده از حلقه while میتوان مجموعهای از کدها را تا زمانی که شرط مورد نظرمان برقرار است اجرا کرد.
ساختار (نحو یا syntax) حلقه while در پایتون به شکل زیر است:
while condition: #code
condition همان شرط ماست که خروجی آن باید به صورت True یا False باشد.
فرض کنید متغیری به نام i
داریم. میخواهیم تا زمانی که مقدار آن از عدد 5 کمتر است، مقدارش را چاپ کنیم. به قطعه کد زیر دقت کنید
i = 1
while i<5: print(i)
i+=1
شرط حلقه while را i<5
تعریف کردیم. در بدنه حلقه، مقدار متغیر را چاپ کرده و در نهایت مقدار آن را یک واحد افزایش دادهایم.
اگر در آخرین خط، مقدار متغیر را افزایش ندهیم، حلقه ما تا بینهایت اجرا خواهد شد.
در اینگونه مواقع معمولاً گفته میشود به حلقه بینهایت یا Infinitive Loop برخورد کردهایم!
خروجی اجرا شده این قطعه کد، به صورت زیر خواهد بود:
1 2 3 4
حلقه for که به حلقه for in در پایتون هم معروف است بیشتر برای پیمایش (Traversal) استفاده میشود.
فرض کنید یک تاپل در python دارید. این تاپل یک نوع توالی از اعضای خودش به ما میدهد. اگر بخواهیم روی تک تک این اعضا حرکت یا به اصطلاح پیمایش کنیم، از حلقه for استفاده خواهیم کرد.
در حالت کلی، هر چیزی که به ما مجموعهای از توالی عناصر (collection) را بدهد میتوانیم در حلقه for پایتون قرار دهیم؛ نوعهای دادهای لیست، رشته، تاپل و … .
ساختار کلی حلقه for در پایتون به صورت زیر است:
for Value in Sequence: #execution and use of Value
سینتکس حلقه for دارای سه بخش اصلی است:
- Value: نام متغیری که در هر بار اجرای حلقه، هر کدام از اعضای مجموعه در آن قرار میگیرد.
- Sequence: همان مجموعه قابل پیمایش مورد نظر ماست.
- بدنه حلقه: کدهایی که در هر بار اجرای حلقه پردازش میشوند.
فرض کنید یک لیست داریم که حاوی اسم پنج نفر است. با استفاده از کد زیر عملیات پیمایش در لیست را انجام میدهیم:
names = ["Nazanin", "Mehran", "Omid", "Melisa", "sina"]
for name in names: print("Hello " + name + "!")
خروجی اجرای این حلقه به صورت زیر خواهد بود:
رشته در پایتون هم یک مجموعه است؛ مجموعهای از کاراکترها که رشته متنی را شکل دادهاند. بنابراین به کمک حلقه for in میتوان بر روی تک تک کاراکترهای یک رشته پیمایش انجام داد.
string = "Welcome to winlearn site!"
i = 0
for char in string: i+=1
print("Lenght is: " + str(i))
در قطعه کد بالا، با استفاده از حلقه for تعداد کاراکترهای رشته string را محاسبه کردیم.
به کمک تکرارگرها در پایتون میتوانید یک شئ قابل پیمایش در حلقههای python به دلخواه خود ایجاد کنید.
تابع range
فرض کنید میخواهیم یک حلقه for ایجاد کنیم که متغیر آن در هر بار اجرا، یکی افزایش پیدا کند. چیزی شبیه به کاری که در حلقه while داشتیم.
فرض کنید میخواهیم با یک حلقه، حاصل جمع اعداد 1 تا 9 را محاسبه کنیم.
اولین راهحل ایجاد یک لیست از اعداد متوالی به صورت دستی و استفاده از آن در حلقه for است.
nums= [1, 2, 3, 4, 5, 6, 7, 8, 9]
result = 0
for n in nums: result += n
print(result)
اما راهحل سادهتری هم داریم!
تابع range()
یک لیست از اعداد صحیح ایجاد میکند. از این تابع میتوان به طور مستقیم در حلقه for در پایتون برای تولید یک رنج از اعداد (بازه عددی) استفاده کرد.
کد زیر دقیقاً معادل کد بالا بوده و عدد 45 را به عنوان نتیجه به ما میدهد.
result = 0
for i in range(10): result += i
print(i)
تابع range(n)
به ما لیستی از اعداد 0 تا n-1 را میدهد.
از این تابع میتوان به صورت حرفهایتر هم استفاده کرد. ساختار کلی آن به صورت زیر است:
range(start, stop, step)
سه آرگومان ورودی این تابع عبارتاند از:
- start: نقطه شروع شمارش
- stop: نقطه پایانی (این نقطه جزء توالی عددی نخواهد بود)
- step: گام حرکت از شروع تا پایان (اختیاری، پیشفرض عدد 1 در نظر گرفته میشود)
اگر فقط یک ورودی برای range()
وارد شود، به طور پیشفرض مقدار شروع برابر 0 و گام برابر 1 خواهد بود.
به مثالهای زیر از این تابع توجه کنید:
range(9)
# [0, 1, 2, 3, 4, 5, 6, 7, 8]
range(5, 21)
# [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
range(5, 21, 3)
# [5, 8, 11, 14, 17, 20]
ترفندهای کار با حلقه
در کار با حلقه در پایتون ترفندهای زیادی وجود دارد. اکثر این ترفندها به خلاقیت برنامه نویس در هنگام برنامهنویسی برمیگردد.
برای این که بتوان به صورت حرفهایتر با حلقهها برنامهنویسی کنیم، دو دستور و یک ساختار مهم وجود دارد.
در ادامه دو دستور break و continue در حلقهها و ساختار Nested Loops را بررسی میکنیم.
دستور break در حلقه پایتون
فرض کنید یک لیست از اعداد در اختیار داریم و میخواهیم آن را پیمایش کنیم. در صورتی که به یک عدد خاص رسیدیم، پیمایش کل مجموعه خاتمه یابد.
بعد از آن که به عدد مورد نظر رسیدیم چه اتفاقی میافتد؟! باید به طور کامل از حلقه (for یا while) خارج شویم!
برای این که از حلقه خارج شویم، از دستور break استفاده میکنیم.
به محض رسیدن به دستور break بلافاصله از حلقه خارج شده و تکرارهای بعدی نادیده گرفته خواهد شد؛ بدون توجه به این که در اولین تکرار حلقه هستیم یا آخرینِ آن!
معمولاً اینگونه کارها به کمک ساختارهای شرط در پایتون انجام میشود.
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for i in lst: if i == 5: break print(i)
# Result:
# 1
# 2
# 3
# 4
خروجی این قطعه کد، فقط اعداد 1 تا 4 هستند.
استفاده از دستور continue
در همان مثال قبلی، اگر فقط بخواهیم یک عدد خاص چاپ نشود باید چه کاری انجام داد؟
اولین راهحل احتمالاً استفاده از شرط است. به این صورت که اگر عنصر انتخاب شده برابر 5 نبود، دستور print اجرا شود.
راهحل دیگر استفاده از دستور continue است. با اجرای continue در حلقه، بقیه کدهای بدنه حلقه اجرا نمیشود و مستقیماً به ابتدای تکرار بعدی در حلقه میپریم.
به قطعه کد زیر دقت کنید:
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for i in lst: if i == 5: continue print(i)
نتیجه اجرای این کد به صورت زیر خواهد شد:
همانطور که میبینید به غیر از عدد 5، بقیه اعداد لیست در خروجی چاپ شدهاند.
حلقه تودرتو در پایتون
از حلقههای پایتون میتوان به صورت تودرتو هم استفاده کرد. مثلاً برای پیمایش ماتریس میتوان به صورت زیر عمل کرد. توجه داشته باشید که محدوده کدهای بدنه حلقه در پایتون بر اساس همان دندانهگذاری (یا indentation) مشخص میشود.
mtrx = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
x = 0
for i in mtrx: for j in i: x += j
print(x) #45
مرور آموزش حلقه ها در پایتون
در این آموزش با نحوه تعریف حلقه در پایتون آشنا شدیم. یک loop دو بخش اصلی شرط و بدنه دارد. قبل از شرط، میتوانیم برای آن مقداردهی اولیه انجام دهیم. سپس مادامی که شرط برقرار باشد، کدهای درون بدنه حلقه اجرا میشود. برای اینکه با مشکل حلقه بینهایت مواجه نوشیم، بهتر است به چگونگی تغییر شرط توجه کنیم. معمولاً از عملیات افزایش برای این کار استفاده میشود.
در هر با اجرای حلقه for در پایتون، متغیری که تعریف کردهایم مقدار جدیدی گرفته و کدهای بدنه برای آن مقدار اجرا میشوند. دقت کنید که میتوانیم از این متغیر در بدنه هیچ استفادهای نکنیم! حلقه while در پایتون، مادامی که شرطش برقرار باشد اجرا میشود.
علاوه بر حلقهها، با تابع range()
برای تولید لیستی از اعداد، دستور break برای متوقف کردن اجرای حلقه و دستور continue برای پرش به حلقه بعدی آشنا شدیم.
برای مطالعه بیشتر در مورد مفهوم کنترل جریان در پایتون میتوانید به مستندات آن مراجعه کنید.