آشنایی با دستور break و کاربرد آن در ساختار لوپی از جنس while در زبان برنامه نویسی پایتون


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

"تا زمانی که شرط x برقرار است، دستور y را اجرا کن."

یک بار دیگر برنامه ی whileLoop.py که در آموزش گذشته نوشتیم را در نظر بگیریم:

correctPassword = "SokanAcademy"
password = input("Please enter the password --> ")
while password != correctPassword:
    password = input("Please try again and enter the correct password --> ")
print("Welcome to SokanAcadmy.com!")

در این برنامه یک رمز عبور ثابت برای ورود به سایت سکان آکادمی در نظر گرفته بودیم و کاربران باید برای ورود به سایت این کلمه ی عبور را به درستی وارد می کردند. در صورت مطابقت ورودی کاربر با مقدار از پیش تعیین شده، پیغام خوش آمد برای کاربر چاپ می شد و در غیر این صورت از کاربر درخواست می شد که مجدداً تلاش کند و رمز عبور درست را وارد کند؛ اما مشکلی که این برنامه دارد این است که در آن سناریویی برای زمانی که کاربر نتواند رمز عبور درست را وارد کند وجود ندارد و لوپی که برای دریافت مجدد رمز عبور در نظر گرفته بودیم تا زمان وارد کردن کلمه ی درست دائماً تکرار می شود.

در چنین شرایطی اگر کاربر نتواند کلمه عبور درست را وارد کند ناچار است که برنامه را ببندد. برای رفع این مشکل باید به طریقی قبل از آن که شرط ورود به لوپ برابر با False شود از آن خارج شویم. در چنین مواردی از دستور break استفاده می کنیم.

برای روشن شدن نحوه ی عملکرد دستور break، برنامه ی WhileLoop را به صورت زیر بازنویسی کرده و اسکریپت آن را در فایلی تحت عنوان BreakLoop.py ذخیره می کنیم:

correctPassword = "SokanAcademy"
password = input("Please enter the password --> ")
while password != correctPassword:
    if password == "I’ve forgotten the password":
        break
    password = input("Please try again and enter the correct password "+
                     "or type:I’ve forgotten the password --> ")

به تغییرات این برنامه توجه کنید. داخل لوپ while یک دستور شرطی if قرار داده ایم. در صورتی که شرط این دستور برقرار باشد، یعنی کاربر عبارت "I`ve forgotton the password" به معنای "من کلمه ی رمز را فراموش کرده ام" را وارد کند مفسر وارد بدنه ی دستور شرطی if می شود و دستور break که در داخل آن قرار دارد را اجرا می کند. این دستور به مفسر می گوید که باید از بدنه ی لوپ while خارج شود و بقیه ی دستورهای داخل بدنه ی آن را اجرا نکند. اما در صورتی که شرط دستور if برقرار نباشد، دستور بعدی لوپ while اجرا خواهد شد و از کاربر درخواست می شود مجدداً برای وارد کردن رمز عبور درست تلاش کند و یا همان عبارت "I`ve forgotton the password" را وارد کند تا از لوپ خارج شود. یک نمونه از خروجی این برنامه به صورت زیر است:

====== RESTART: C:\SokanAcademy\While\BreakLoop.py ======
Please enter the password --> I`ve forgotton the password
>>>

همان طور که می بینید زمانی که کاربر عبارت I`ve forgotton the password را وارد کرده است، بقیه دستورات داخل لوپ while اجرا نشده اند. دقت کنید که در این جا دستور شرطی if را قبل از دستور دیگری که در داخل بدنه ی لوپ وجود دارد قرار داده ایم به این دلیل که ممکن است کاربر مانند اجرایی که دیدیم از همان ابتدای اجرای برنامه رمز عبور درست را نداند و بخواهد به سیستم اطلاع دهد که آن را فراموش کرده است. بنابراین وقتی عبارت I`ve forgotton the password را وارد می کند، چون با رمز عبور درست مطابقت ندارد، مفسر وارد لوپ while می شود و اگر دستور if در ابتدا نیامده باشد از کاربر یک بار دیگر هم درخواست وارد کردن رمز عبور می شود که این کار درست نیست، چون قبلاً کاربر اعلام کرده است که رمز عبور درست را نمی داند.

پس به طور کلی، یک دستور break می تواند در هر قسمت از بدنه ی لوپ قرار بگیرد و زمانی که مفسر پایتون به آن می رسد دستورات موجود در بدنه ی لوپ که بعد از آن قرار می گیرند را نادیده می گیرد و از لوپ خارج می شود. اگرچه ما می توانیم از این دستور در هر بخش از لوپ استفاده کنیم، اما معمولاً از آن در داخل یک دستور شرطی if که در بدنه ی لوپ آمده است استفاده می شود، چرا که معنایی ندارد ما به صورت ساده از یک دستور break در داخل لوپ استفاده کنیم و بعد از آن دستوراتی را قرار دهیم که می دانیم هرگز اجرا نخواهند شد. پس در حقیقت دستور break جریان برنامه را در داخل لوپ متوقف می کند و بقیه ی کدهای برنامه اجرا می شوند.

حالا که با دستور break و کارکرد آن آشنا شدیم می خواهیم برنامه را کمی توسعه دهیم. برای این منظور، سناریویی به صورت زیر را در نظر می گیریم:

اگر کاربر رمز عبور درست را وارد کرد پیغام خوش آمد گویی برای او چاپ شود و در صورتی که کاربر اعلام کند که رمز عبور درست را فراموش کرده است آدرس ایمیلی از او گرفته شود تا رمز عبور درست برای وی ارسال شود. برنامه را به صورت زیر بازنویسی می کنیم:

correctPassword = "SokanAcademy"
password = input("Please enter the password --> ")
while password != correctPassword:
    if password == "I`ve forgotton the password":
        email = input("Please enter your email to sent you correct password --> ")
        print("The password has sent to",email)
        break
    password = input("Please try again and enter the correct password "+
                     "or type:I`ve forgotton the password --> ")
else:
    print("Welcome to SokanAcadmy.com") # Run if didn't exit loop with break

به کدهای اضافه شده به برنامه توجه کنید. در دستور شرطی if که به صورت تو در تو در لوپ while قرار دارد و در صورتی که کاربر اعلام کند که رمز ورود را فراموش کرده است بدنه ی آن اجرا خواهد شد، دستور جدیدی قرار داده ایم که از کاربر درخواست می کند آدرس ایمیل خود را وارد کند تا رمز ورود درست برای او ارسال شود و این در حالی است که ورودی کاربر به متغیری با نام email ارجاع داده می شود.

اما بعد از لوپ while یک دستور else قرار گرفته است. کدهای داخل بدنه ی دستور else زمانی اجرا خواهند شد که مفسر با دستور break از لوپ while خارج نشده باشد، بنابراین در این جا دستور else زمانی اجرا خواهد شد که کاربر بتواند رمز عبور درست را وارد کند. ساختار کلی لوپ while به همراه دستور else به صورت زیر است:

while testConditions: # Loop head with test
    Block(s) of code # Loop body
else: # Optional else
Block(s) of code # Run if the loop didn`t exit with break

همان طور که در ساختار بالا می بینید، اضافه کردن بند else در این دستور مرکب کاملاً اختیاری است و در صورتی که مفسر با دستور break از لوپ while خارج نشود، کدهای داخل بدنه ی این دستور حتماً اجرا خواهند شد. حال سه نمونه از خروجی های حاصل از اجرای این برنامه را بررسی می کنیم:

====== RESTART: C:\SokanAcademy\While\BreakLoop.py ======
Please enter the password --> SokanAcademy
Welcome to SokanAcadmy.com
>>>

در این اجرا، کاربر از همان ابتدا رمز عبور درست را وارد کرده است، بنابراین مفسر اصلاً وارد بدنه ی لوپ نمی شود، با این حال دستور داخل بدنه ی else اجرا شده است. مجدد برنامه را اجرا می کنیم:

====== RESTART: C:\SokanAcademy\While\BreakLoop.py ======
Please enter the password --> sokanacademy
Please try again and enter the correct password or type:I`ve forgotton the password --> SokanAcademy
Welcome to SokanAcadmy.com
>>>

در این نوبت از اجرا، کاربر در ابتدا رمز ورود را به درستی وارد نمی کند، بنابراین شرط لوپ برقرار است و مفسر وارد آن می شود. چون کاربر عبارت فراموش کردن رمز را وارد نکرده است، دستور if اجرا نمی شود و در عوض از کاربر درخواست می شود که مجدداً برای وارد کردن رمز عبور جدید تلاش کند، و زمانی که رمز ورود را برای بار دوم به درستی وارد می کند، مفسر از لوپ خارج می شود و دستور else را اجرا می کند، چون با وجود آن که وارد لوپ شده بود، اما با دستور break از آن خارج نشد. و برای سومین و آخرین بار برنامه ی خود را اجرا می کنیم:

====== RESTART: C:\SokanAcademy\While\BreakLoop.py ======
Please enter the password --> sokanacademy
Please try again and enter the correct password or type:I`ve forgotton the password --> I`ve forgotton the password
Please enter your email to sent you correct password --> narges.asadi@sokanacademy.com
The password has sent to narges.asadi@sokanacademy.com
>>>

در این نوبت از اجرا، کاربر در ابتدا رمز عبور درست را وارد نکرده است و مفسر وارد بدنه ی لوپ می شود. شرط if در ابتدا برقرار نیست، چرا که کاربر اعلام نکرده است که رمز عبور را فراموش کرده است، بنابراین از او درخواست می شود که مجدداً برای وارد کردن رمز عبور جدید تلاش کند. این بار کاربر اعلام می کند که رمز عبور را فراموش کرده است، بنابراین شرط while هم چنان برقرار است و این بار شرط if داخل آن نیز برقرار است، بنابراین از کاربر درخواست می شود که آدرس پست الکترونیک خود را وارد کند تا کلمه ی عبور درست به آن آدرس ارسال شود. وقتی کاربر ایمیل خود را وارد می کند، دستور پرینت پیغامی چاپ می کند که کلمه ی عبور به آدرس ایمیل کاربر فرستاده شده است (البته در این برنامه هیچ ایمیلی ارسال نمی شود.) سپس مفسر با دستور break از لوپ خارج می شود، به همین دلیل دیگر دستور else اجرا نشده است.

دانلود فایل‌های تمرین
لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
hamid
hamid
اشتباه فرستادم :((((
hamid
hamid
correctpassword = \"sokanacadmy\"
password = input(\"please enter the password --> \")
while password != correctpassword:
if password == \"i\\`ve forgotton the password\":
email = input(\"please enter your email to sent you correct password --> \")
print(\"the password has sent to\",email)
break
else:
password = input(\"please try again and enter the correct password \"+
\"or type:i\\`ve forgotton the password --> \")

print(\"welcome to sokanacadmy.com\")
این برنامه درست تره به دو دلیل اینکه تو رفتگی if و else باید یکی باشد دوم اینکه پشت هم باشن بینشون کد نباشه
milad
milad
سلام در مثال زیر برنامه اجر نشده بسته می شود چرا؟
correct='hi'
password=input('please inter your password-->')
while password!=correct:
if password=='i forget the password':
email=input('please inter your email-->')
print('please inter your',email)
break
password=input('please try again the correct password'+'type:i forget the password')
else:
print('wellcome')
Vito
Vito
ممنون بابت مطالب خوبتون

فک کنم خط ۳۶ کلمه می شوند باید به نمی شوند تبدیل بشه. لطفا بررسی بفرمایید.

<< پس در حقیقت دستور break جریان برنامه را در داخل لوپ متوقف می کند و بقیه ی کدهای برنامه اجرا می شوند. >>
amingar
amingar
با سلام و خسته نباشید در مثال زیر:
correctPassword = "SokanAcademy"
password = input("Please enter the password --> ")
while password != correctPassword:
if password == "I’ve forgotten the password":
break
password = input("Please try again and enter the correct password "+
"or type:I’ve forgotten the password --> ")

اگر پسورد رو درست بزنیم برنامه کاری نمی کند . لطفا اصلاح شود
نرگس اسدی
نرگس اسدی
سلام
دوست عزیز در این قطعه کد سناریویی برای زمانی که پسورد درست وارد بشه در نظر گرفته نشده، در نتیجه با وارد کردن کلمه ی درست برنامه به پایان میرسه.

در پاسخ به

arya
arya
dar in barname :

correctPassword = "SokanAcademy"
password = input("Please enter the password --> ")
while password != correctPassword:
if password == "I’ve forgotten the password":
break
password = input("Please try again and enter the correct password "+
"or type:I’ve forgotten the password --> ")
natoonestam ba type I've forgotten the password az loop kharej besham! mikhastam dalilesho bedoonam
نرگس اسدی
نرگس اسدی
سلام
به خاطر اینکه زمان تایپ .... I've به جای آپوستروف ’ از کوتیشن مارک ' استفاده کردید.

در پاسخ به

کاربر میهمان
کاربر میهمان
سلام. من میخوام یک خزنده بندویسم که تعدا پست های ارسالی کاربران فیس بوک و همچین چیزهایی را بهم بده. از کجا باید شروع کنم؟
متشکرم.
ادمین سایت
ادمین سایت
با سلام خدمت شما کاربر گرامی
امیدواریم که از مقاله ی زیر پاسخ مناسب را دریافت نمایید:
http://goo.gl/pMKhI5


با تشکر
ارادتمند
تیم سکان آکادمی

در پاسخ به

نرگس اسدی
نرگس اسدی
پیشنهاد می کنم از سرچ در اینترنت شروع کن!
How to write a crawler

در پاسخ به

کاربر میهمان
کاربر میهمان
سلام. علت این خطا چیست؟list index out of range
نرگس اسدی
نرگس اسدی
سلام
ما یک سری اشیاء در زبان پایتون داریم به صورت یک لیست هستند. شما یک لیست خرید را در نظر بگیرید. در چنین لیستی یک سری اقلام به ترتیب نوشته شدند. هر قلم از اجناس داخل لیست با یک شماره ی به صورت ترتیبی معرفی میشن. مثلاً این لیست را در نظر بگیرید:
1- تخم مرغ
2- نان
3- پنیر
حالا وقتی بگوییم اولین قلم از اجناس این لیست کدام است، جواب تخم مرغ است. یا سومین قلم از اجناس این لیست پنیر است. لیست های زبان برنامه پایتون هم به همین شکل است. لیستی شامل چند قلم شیء که به هر کدام یک index یا اندیس داده میشه. فقط یک تفاوت وجود داره که این جا شماره ی اقلام از صفر شروع میشه. مثلاً یک شیء استرینگ لیستی از حروف را داره. برای مثال استرینگ "narges" شش حرف داره، و حروف آن با اندیس های 0 تا 5 ایندکس گذاری میشن. حالا اگر به مفسر پایتون بگیم کدام حرف ایندکس 0 داره حرف n، کدام حرف ایندکس 3 دارد حرف g را نمایش میده. این از مفهوم ایندکس. نکته اینجا است که تعداد ایندکس های یه لیست همیشه قابل شمارشه. یعنی می گیم در اینجا لیست ما از 0 تا 5 اندیس گذاری شده. حالا اگر به مفسر بگیم که برو عضوی از این لیست که ایندکس 7 داره رو بیار چه خطایی به ما میده؟ list index out of range . یعنی ایندکسی که گفتی در محدوده ی تعداد ایندکس های تعریف شده نبود. البته مبحث لیست ها و این که چطور به عضوی از یک لیست با ایندکس مشخص دسترسی پیدا کنیم بعدا آموزش داده خواهد شد.

در پاسخ به

کاربر میهمان
کاربر میهمان
سلام خسته نباشید
مرسی از دوره های عالیتون
یه سوال،اینکه بعد هر قسمت آموزشی یه تمرین واسه اون قسمت بزارین که بتونیم مبحثو بهتر و بیشتر تمرین کنیم نمیشه؟
کاربر میهمان
کاربر میهمان
سلام. زمانی که من دستور print("salam",x) را مینویسم خروجیش در داخل یک پرانتز قرار میگیره ؟ قبلا x را مقدار دهی کردم.
نرگس اسدی
نرگس اسدی
سلام
خیر
این پرانتزها نشان دهنده ی آن هستند که پرینت یک فانکشن است و آرگومان های این فانکشن داخل آن ها قرار می گیرند.
اگر بخواهید فانکشن پرینت در خروجی پرانتزها را چاپ کند باید آن ها را داخل علامت های نقل قول به عنوان آرگومان پرینت قرار بدید.

در پاسخ به

ccc ccc
ccc ccc
سلام. متوجه نشدم. یه عکس از کدتون قرار بدین تا راهنماییتون کنم.

در پاسخ به

کاربر میهمان
کاربر میهمان
سلام. من وقتی در نسخه 2.7.11 دستورات یک بدنه رو در یک خط مینویسم و با سیمیکالن از هم جدا میکنم خطای سینتکسی میده.چرا؟
نرگس اسدی
نرگس اسدی
سلام
بعید می دونم به خاطر سمی کالن باشه. لطفا پیغام خطایی که نمایش داده میشه رو قرار بدید.

در پاسخ به