در آموزش قبل با ساختار حلقۀ while
آشنا شدیم و نحوۀ کارکرد آن را در قالب مثالهایی نسبتاً کاربردی بررسی کردیم و گفتیم که دستور while
را به صورت ساده میتوانیم بدین ترتیب بیان کنیم که «تا وقتی شرط x برقرار است، دستور y اجرا شود.» برای درک بهتر کاربرد دستور break
در ساختار حلقههای while
فایل 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!")
در کد فوق استرینگ «SokanAcademy» را به عنوان پسوردی ثابت برای ورود به وبسایت سکان آکادمی در نظر گرفته شده است که کاربران برای ورود به سایت باید این پسورد را به درستی وارد کنند و در صورت مطابقت پسورد ورودی کاربر با استرینگ تعیینشده، پیغام خوشامدگویی برای کاربر چاپ میشود و در غیر این صورت برنامه منتظر دریافت ورودی جدید از سمت کاربر میماند.
در عین حال، هیچ سناریویی برای شرایط عدم توانایی کاربر جهت وارد کردن رمز عبور درست وجود ندارد؛ به عبارت دیگر، حلقۀ مورد نظر برای دریافت مجدد رمز عبور تا زمان وارد کردن کلمۀ عبور درست دائماً تکرار میشود که در چنین شرایطی اگر کاربر نتواند کلمۀ عبور درست را وارد کند هیچ راهی برای پایان دادن به اجرای برنامه ندارد و ناچار است تا پنجرۀ آن را ببندد یا با کلیدهای ترکیبی CTRL+C به اجرای برنامه خاتمه دهد. برای رفع چنین مشکلی باید به طریقی قبل از False
شدن مقدار بولین شرط حلقه از آن خارج شویم که در این گونه موارد بهکارگیری راهکاری همچون استفاده از دستور break
مناسب میباشد.
برای روشن شدن نحوۀ عملکرد دستور break
کدهای موجود در فایل whileLoop.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 forgotten the password» را وارد کند، شرط برقرار بوده و دستورات داخل بدنۀ آن اجرا میشود که بدین ترتیب دستور break
اجرا شده و برنامه از بدنۀ حلقۀ while
خارج شده و مابقی دستورات داخل آن را نادیده میگیرد اما در صورتی که شرط if
برقرار نباشد، دستور بعدی در بدنۀ حلقۀ while
اجرا میشود که در نتیجه استرینگ تعریفشده در سطر آخر برای کاربر نمایش داده شده و برنامه منتظر دریافت ورودی میماند تا کاربر مجدداً برای وارد کردن رمز عبور درست تلاش کند و یا اینکه استرینگ «I’ve forgotten the password» را وارد کند تا از حلقۀ while
خارج شود. اسکریپت این برنامه را در فایلی به نام breakLoop.py
ذخیره کرده و آن را اجرا میکنیم که یک نمونه از خروجی آن را در ادامه آوردهایم:
Please enter the password --> I’ve forgotten the password
در واقع، زمانی که کاربر استرینگ «I’ve forgotten the password» را کند، سایر دستورات داخل حلقۀ while
اجرا نمیگردند (توجه داشته باشیم که در این مثال دستور if
را پیش از تمامی دستورات بدنۀ حلقۀ while
قرار دادهایم بدین دلیل که ممکن است کاربر از همان ابتدای اجرای برنامه رمز عبور درست را نداند و بخواهد به سیستم اطلاع دهد. بنابراین با وارد کردن استرینگ «I’ve forgotten the password» و بالتبع عدم مطابقت آن با رمز عبور درست، مفسر وارد حلقۀ while
میشود و چنانچه دستور if
در ابتدا نوشته نشود یک بار دیگر از کاربر درخواست وارد کردن رمز عبور میشود که این کار درست نیست چرا که قبلاً کاربر اعلام کرده است که رمز عبور درست را نمیداند.)
به طور کلی، دستور break
را میتوان در تمامی قسمتهای بدنۀ داخلی حلقۀ while
قرار داد که مفسر پایتون با رسیدن به آن سایر دستورات داخل بدنه را نادیده میگیرد و از حلقه خارج میشود اما بهتر است که دستور break
را در یک دستور شرطیِ داخل بدنۀ حلقۀ while
استفاده کنیم چرا که استفاده از یک دستور سادۀ break
در داخل حلقۀ while
معنایی ندارد بدین دلیل که دستورات پس از آن هرگز اجرا نمیشوند؛ در حقیقت، دستور break
جریان برنامه را داخل حلقۀ while
متوقف میکند و سایر کدهای برنامه اجرا میشوند.
حال به منظور آشنایی بیشتر با کاربردهای دستور break
سناریویی فرضی در نظر میگیریم که در آن گفتهایم چنانچه کاربر رمز عبور درست را وارد کند، پیغام خوشامدگویی برای او چاپ شود و در صورتی که کاربر رمز عبور درست را فراموش کرده باشد، آدرس ایمیلی از او درخواست شود تا رمز عبور جدید برای وی ارسال شود که برای این منظور مثال قبل را بدین صورت زیر بازنویسی میکنیم:
correctPassword = "SokanAcademy"
password = input("Please enter the password --> ")
while password != correctPassword:
if password == "I’ve forgotten 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 forgotten the password --> ")
else:
print("Welcome to SokanAcadmy.com")
همانطور که مشاهده میکنید، در دستور if
داخل حلقۀ while
دستور جدیدی قرار دادهایم و در صورتی که کاربر رمز عبور خود را فراموش کرده باشد، دستورات بدنۀ if
اجرا شده و از کاربر درخواست میکنیم که آدرس ایمیل خود را وارد کند تا بدین ترتیب رمز ورود جدید برای او ارسال شود و این در حالی است که ایمیل ورودی کاربر به متغیری به نام email
منتسب میشود.
پس از حلقۀ while
نیز یک دستور else
قرار دادهایم که کدهای داخل بدنۀ آن زمانی اجرا میشوند که مفسر با دستور break
از حلقۀ while
خارج نشده باشد؛ به عبارتی، در مثال فوق دستور else
زمانی اجرا میشود که کاربر بتواند رمز عبور درست را وارد کند (به طور کلی، اضافه کردن بند else
به ساختار این دستور مرکب کاملاً اختیاری است و کدهای داخل بدنۀ آن در صورتی اجرا میشوند که مفسر با دستور break
از حلقۀ while
خارج نشود.) حال جهت تست برنامه، کد فوق را با سه حالت مختلف ورودی اجرا میکنیم:
Please enter the password --> SokanAcademy
Welcome to SokanAcadmy.com
در اجرای اول کاربر از همان ابتدا رمز عبور درست را وارد میکند و بنابراین مفسر اصلاً وارد بدنۀ حلقۀ while
نمیشود اما به هر حال دستور داخل بدنۀ else
اجرا میشود. مجدداً برنامه را اجرا میکنیم:
Please enter the password --> sokanacademy
Please try again and enter the correct password or type:I’ve forgotten the password --> SokanAcademy
Welcome to SokanAcadmy.com
در این نوبت، کاربر در ابتدا رمز ورود را به درستی وارد نمیکند و از همین روی شرط حلقه برقرار شده و مفسر وارد بدنۀ آن میشود و از آنجایی که کاربر استرینگ «I’ve forgotten the password» را وارد نمیکند، دستور if
اجرا نشده و در ادامه از کاربر درخواست میشود تا مجدداً برای وارد کردن رمز عبور جدید تلاش کند که در بار دوم پسورد را به درستی وارد کرده و مفسر از حلقۀ while
خارج میشود و دستور else
را اجرا میکند بدین دلیل که با دستور break
از حلقۀ while
خارج نشده است. حال برای آخرین بار برنامه را اجرا میکنیم:
Please enter the password --> sokanacademy
Please try again and enter the correct password or type:I’ve forgotten the password --> I’ve forgotten the password
Please enter your email to sent you correct password --> narges.asadi@sokanacademy.com
The password has sent to narges.asadi@sokanacademy.com
در این مرحله هم کاربر در ابتدا رمز عبور درست را وارد نمیکند و مفسر وارد بدنۀ حلقۀ while
میشود و از آنجایی که کاربر استرینگ «I’ve forgotten the password» را وارد نمیکند، شرط if
برقرار نبوده و مجدداً امکان وارد کردن رمز عبور برای او فراهم میشود که در این مرحله کاربر استرینگ «I’ve forgotten the password» را وارد میکند که در چنین حالتی شرط while
همچنان برقرار بوده و شرط if
داخل آن نیز برقرار است و از همین روی استرینگ مربوط به درخواست از کاربر به منظور وارد کردن آدرس ایمیل در خروجی چاپ میشود که با دریافت ورودی از کاربر آن را به متغیر email
منتسب کرده و فانکشن ()print
استرینگی در قالب ارسال پیام به ایمیل کاربر در خروجی چاپ میکند سپس مفسر با دستور break
از حلقۀ while
خارج میشود که از همین روی دستور else
اجرا نمیشود.
شما می توانید برای آموزش این بخش به صورت ویدیویی، به دوره آموزش مقدماتی پایتون در سایت سکان آکادمی مراجعه کنید.