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