پایتون برای همه | 27 | تکرار و حلقه while

پایتون برای همه پایتون 3

اشتراک وفاداری (ماهی یک چایی)

می‌توانید از محتویات این باکس بگذرید و یک‌راست به سراغ نوشته اصلی بروید. قبل از خرید اشتراک وفاداری، مزایای آن را از طریق این پیوند مشاهده کنید. لطفا تنها بعد از خواندن «مزایای خرید اشتراک» اقدام به خرید کنید.

به‌روز رسانی متغیرها

یک الگوی رایج در گزاره‌های گمارشی، دستور آپدیت‌‌کردن یک متغیر است؛ به صورتی که مقدار جدید یک متغیر، به مقدار قبلی آن وابسته خواهد بود.

x = x + 1

گزاره‌ی بالا به این معنی‌ست که مقدار فعلی متغیر x را بگیر، عدد ۱ را به آن اضافه کن و در نهایت مقدار x را با مقدار جدید که x + 1 باشد، جایگزین کن.

اگر سعی کنید که یک متغیری که وجود خارجی ندارد را به‌روز کنید، خطایی دریافت خواهید کرد. ولی چرا خطا؟ دلیلش این است که پایتون ابتدا قسمت راست معادله را بررسی و حساب می‌کند؛ سپس مقدار جدید را به قسمت چپ معادله نسبت می‌دهد. وقتی x برای محاسبه در کار نباشد، خطا صادر می‌کند:

>>> x = x + 1
NameError: name 'x' is not defined

قبل از اینکه بتوانید یک متغیر را به‌روز کنید، بایستی که آن را تعریف کرده باشید. یا به عبارت تخصصی‌تر، یک مقدار اولیه به آن اختصاص داده شده باشد. مثلا در گزاره‌های زیر، ابتدا x را تعریف کرده‌ایم و مقدار 0 را به آن اختصاص داده‌ایم:

>>> x = 0
>>> x = x + 1

به‌روز رسانی یک متغیر با اضافه کردن عدد یک، «افزونش» یا «افزودن پله‌ای» خوانده می‌شود. اگر مقدار عدد یک را از متغیر کم کنید به آن «نزول» یا «کاستن پله‌ای» می‌گوییم.

گزاره while

کامپیوترها اغلب برای انجامِ خودکار کارهای تکراری استفاده می‌شوند. تکرار وظایف مشابه بدون خطا کردن، کاری‌ست که انسان به خوبی از پسش برنمی‌آید، ولی کامپیوتر چرا، برمی‌آید و خیلی خوب هم برمی‌آید! تکرار در همه‌کاری بسیار رایج است، به همین خاطر پایتون به چندین ویژگی مختلف، برای سهولت در آن مجهز شده است.

یک نمونه از تکرار، استفاده از گزاره while است. به مثال زیر نگاه کنید؛ یک برنامه‌ی ساده‌ای که از عدد پنج تا به صفر می‌شمارد و سپس عبارت Blastoff!‎ را چاپ می‌کند:

n = 5
while n > 0:
    print(n)
    n = n - 1
print('Blastoff!')

گزاره‌ی while را همانگونه که انگلیسی می‌خوانید (به معنای «تا زمانی که:») می‌توانید استفاده کنید. مثال بالا می‌گوید: تا زمانی که n از 0 بزرگتر است، مقدار n را چاپ و سپس عدد یک را از آن کسر کن. زمانی که به 0 رسیدی، از حلقه‌ی while خارج شو و کلمه‌ی Blastoff!‎ را چاپ کن.

حالا اگر بخواهیم جریان اجرای گزاره while را به صورت رسمی‌تر بیان کنیم، سه مرحله‌ی اصلی در پیش رو داریم:

۱. محاسبه‌ی شرط برای دریافت True یا False. به عبارت ساده‌تر، گزاره‌ی while شرط را وارسی کرده و می‌بیند که نتیجه‌ی آن «صحیح» یا «غلط» است.
۲. اگر محاسبه‌ی بالا False یا «غلط» بود، از بدنه while خارج شده و به اجرای گزاره‌ی بعد از آن می‌پردازد.
۳. اگر محاسبه‌ی اولیه True یا «صحیح» بود، بدنه while اجرا می‌شود و دو مرتبه به سراغ محاسبه‌ی شرط گزاره‌ی while (مرحله اول) می‌رود.

ما به این جریانِ اجرا، loop یا حلقه می‌گوییم. ولی چرا حلقه؟ چون در مرحله‌ی سوم، جریان اجرا دور زده و باز به مرحله‌ی اول باز می‌گردد. ما به هر بار که بدنه‌ی این حلقه را اجرا می‌کنیم یک «تکرار» می‌گوییم. برای مثال بالا ما حلقه‌ای داشتیم که در آن پنج تکرار انجام شد. به عبارت ساده‌تر حلقه‌ی ما پنج بار اجرا شد.

بدنه‌ی حلقه بایستی که مقدار یک یا چند متغیر را تغییر دهد؛ به این خاطر که در نهایت نتیجه‌ی شرط (مرحله‌ی اول) «غلط» شود، و برنامه بتواند از بدنه‌ی حلقه خارج شده و به حلقه پایان بخشد. ما به متغیری که با هر بار اجرای حلقه، تغییر می‌کند، و کنترل جریان حلقه را در دست دارد، «متغیر تکرار» می‌گوییم. اگر یک متغیر تکرار در کار نباشد، این حلقه برای همیشه تکرار خواهد شد و نتیجه‌ی آن یک «حلقه بی‌نهایت» خواهد بود.

حلقه‌های بی‌نهایت

برای یک برنامه‌نویس، دستورالعمل یک شامپو هم سرگرم‌کننده است. چرا؟ دستور العمل شامپو می‌گوید: ۱) شامپو را به سرتان بزنید، ۲) آب بکشید، ۳) تکرار کنید. ولی اثری متغیرِ تکرار در کار نیست که شخص بداند بایستی چند بار این عمل را تکرار کند.

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

حلقه‌های بی‌نهایت و break

گاهی تا زمانی که به اواسط بدنه‌ی حلقه نرسید، نمی‌دانید که باید این حلقه را تمام کنید یا نه. در این زمان می‌توانید که یک حلقه‌ی بی‌نهایت را از عمد بنویسید و سپس با استفاده از گزاره break از حلقه بیرون بپرید.

حلقه‌ی زیر، یک حلقه‌ی بی‌نهایت است چرا که در جلوی گزاره‌ی while عبارت منطقی بی‌تغییر True نوشته شده و این شرط همیشه «صحیح» است:

n = 10
while True:
    print(n, end=' ')
    n = n - 1
print('Done!')

اگر کد بالا را اجرا کنید، خواهید فهمید که حلقه‌ی بی‌نهایت تا زمانی که برنامه را متوقف نکنید، تکرار خواهد شد. باید راهی برای خاتمه‌دادن به برنامه پیدا کنید، یا به دکمه‌ی پاور کامپیوتر متوسل شوید. به این دلیل که شرط while همیشه «صحیح» است این برنامه تا همیشه اجرا خواهد شد.

پس به نظر می‌رسد که استفاده از عبارت منطقیِ بی‌تغییر در حلقه، کار بیهوده‌ای است. با این حال شما می‌توانید حلقه‌های مفید با استفاده از این الگو بسازید. ولی چگونه؟ با استفاده از کدی که جریانِ اجرا را از حلقه خارج کند. شما می‌توانید از break، البته با دقت و به جا، استفاده کرده و یک حلقه‌ی بی‌نهایت را بشکنید.

برای نمونه فرض کنید که شما می‌خواهید که کاربر مدام ورودی به برنامه بفرستد و این کار تنها زمانی به پایان برسد که کاربر عبارت done را تایپ کند. کد زیر را ببینید:

while True:
    line = input('> ')
    if line == 'done':
        break
    print(line)
print('Done!')

# Code: http://www.py4e.com/code3/copytildone1.py

شرط حلقه‌ی True است و به این خاطر که یک مقدار ثابت است، حلقه‌ی ما بی‌نهایت خواهد بود. ولی زمانی که شرط داخل بدنه‌ی حلقه درست از آب در بیاید، گزاره‌ی break اجرا شده و ما از حلقه خارج می‌شویم.

در برنامه‌ی بالا، پایتون مدام از کاربر ورودی می‌خواهد. اگر کاربر عبارت done را تایپ نماید، با اجرا شدن گزاره‌ی break جریان اجرا به خارج از حلقه پرش می‌کند. در غیر این صورت، برنامه هر چیزی که کاربر تایپ کند را تکرار می‌کند:

> hello there
hello there
> finished
finished
> done
Done!

این روش نوشتن حلقه‌های while بسیار رایج است، چرا که شما می‌توانید در هر جای حلقه که خواستید، شرط لازم برای ادامه‌ی آن را تعریف کنید. همچنین می‌توانید به برنامه به جای اینکه بگویید «آنقدر حلقه را ادامه بده تا این اتفاق بیفتد» بگویید «وقتی این اتفاق افتاد، در جا حلقه را تمام کن».

پایان دادن به تکرار با استفاده از continue

گاهی در حین تکرار حلقه می‌خواهید که تکرارِ جاری را تمام کرده و سریع به سراغ تکرار بعدی بروید، بدون اینکه گزاره‌های بعدی موجود در حلقه، در آن تکرار اجرا شوند. اینجاست که از گزاره continue استفاده می‌کنیم.

بهتر است قضیه را با یک مثال روشن‌تر کنیم. کد زیر را در نظر بگیرید. این کد، ورودی کاربر را گرفته و تا زمانی که کاربر done را وارد کند، آن‌ها را چاپ می‌کند. ولی یک استثنا این وسط وجود دارد. اگر کاربر رشته‌ای وارد کند که با # شروع شده باشد، برنامه آن را چاپ نخواهد کرد و به سراغ دریافت مجدد ورودی از کاربر می‌رود.

while True:
    line = input('> ')
    if line[0] == '#':
        continue
    if line == 'done':
        break
    print(line)
print('Done!')

# Code: http://www.py4e.com/code3/copytildone2.py

برنامه را بنویسید و اجرا کنید. یک نمونه از اجرای آن را در پایین آورده‌ایم:

> hello there
hello there
> # don't print this
> print this!
print this!
> done
Done!

تمام خطوط غیر از آن خطی که با علامت هش شروع شده بود، چاپ شدند. دلیلش این است که آن رشته، شرط موجود در بدنه‌ی حلقه را محقق کرده و گزاره‌ی continue اجرا می‌شد. با اجرا شدن continue، جریان اجرا بدون اجرا کردن ادامه‌ی گزاره‌های حلقه، به سراغ تکرار بعدی می‌رود. به همین خاطر در آن مورد خاص، برنامه از اجرای گزاره‌ی print باز ماند.

این نوشته تحت مجوز کرییتیو کامنز BY – NC و حمایت موسسه تحقیقاتی رامونا ارائه می‌شود. شما می‌توانید با توجه به مفاد این گواهی از آن استفاده کنید.

3 دیدگاه

  1. سلام و خواهش می‌کنم.

    این مقالات در اصل قسمتی از کتاب کامل پایتون ۳ هست که سال گذشته ترجمه کرده بودم. می‌تونید از اینجا کل کتاب رو دانلود کنید:
    https://www.python3.ir/1873/

  2. من تازه دارم پایتونو یاد میگیریم…
    وقتی این مقاله رو خوندم تازه رسیدم به اون لحضه(aaahaaa!!!) رسیدم
    مرسی

پاسخ دهید

ایمیل شما نمایش داده نخواهد شد