فصل هفتم آموزش پایتون مقدماتی - حلقه‌‌های تکرار

سلام دوستانبا ادامه ی کتاب پایتون مقدماتی که به همراه دوست عزیزم جناب مهندس مهدی عباسپور شاهمرس نوشته و چاپ کردیم در خدمتتون هستیم. https://virgool.io/@mahdi.abbaspour.sh گاهی اوقات می‌‌خواهیم یک بلوک کد را چندین بار به صورت پشت سر هم اجرا ویا تکرار نماییم. با وجود تفاوت در جزئیات اجرای حلقه‌‌های تکرار در زبان‌‌های مختلف، به طور کلی ساختار آن‌‌ها به گونه است که بعد از بررسی شرط، در صورت درستی، خط اول و سپس خطوط بعدی اجرا می‌‌شوند. زمانی که شرط، نادرست‌‌شد، اجرای آن متوقف خواهدشد. شکل (7-1) شمای کلی حلقه‌‌ی تکرار را نشان می‌‌دهد.شکل (7-1)زبان برنامه‌‌نویسی پایتون، انواع حلقه‌‌ها را برای رفع نیازهای مختلف فراهم می‌‌کند. در ادامه مباحث، به توضیح آن‌‌ها خواهیم‌‌پرداخت.7-1- حلقه‌‌ی تکرار Whileیک حلقه while در این‌‌زبان، تا زمانی‌‌که شرط آن درست‌‌باشد، بلوک حلقه مربوطه را اجرا می‌‌کند. گرامر کلی آن‌‌را در شکل (7-2) مشاهده می‌‌کنیم.شکل (7-2)لازم به توضیح است که در این جا، ممکن‌‌است دستورات یک خط ویا یک بلوک باشند. همچنین خود شرط درست نیز ممکن‌‌است هر عبارتِ درست ویا هر مقدار غیرصفر باشد. تا زمانی که شرط درست‌‌باشد، تکرار دستورات ادامه می‌‌یابد. به محض نادرست‌‌شدن آن، کنترل برنامه، به خط بعدی انتقال می‌‌یابد. در شکل (7-3)، شمای کلی حلقه‌‌ی while را می‌‌بینید.شکل (7-3)برای درک بهتر مطلب، مثالی را در شکل (7-4) خواهید دید.شکل (7-4)در این مثال، بلوک دستورات، متشکل از دستور چاپ و افزایش یک واحدی متغیر count است. تا زمانی که مقدار متغیر از عدد 9 کمتر باشد، این دستورات، بارها و بارها اجرا خواهندشد. نتیجه‌‌ی اجرای این قطعه کد را در شکل (7-5) می‌‌بینید.شکل (7-5)7-1-1- حلقه‌‌ی بی‌‌نهایت[1]اگر در زمان استفاده از حلقه‌‌ها، احتیاط‌‌نکنید، احتمال‌‌دارد که شرط حلقه، هرگز نقض (یعنی False) نشده و تعداد تکرار حلقه، بی‌‌نهایت شود. در نتیجه، این حلقه هرگز به پایان نمی رسد. چنین حلقه‌‌هایی را حلقه‌‌ی بی‌‌نهایت می‌‌نامیم. در بعضی مواقع این حلقه‌‌ها بسیار مفید و کاربردی هستند. به عنوان مثال، زمانی که می‌‌خواهید به طور مدام اتصال بین سرویس‌‌دهنده[2] و سرویس‌‌گیرنده[3] را در شبکه بررسی نمایید، می‌‌توان از آن‌‌ها استفاده‌‌کرد. شکل (7-6) نمونه‌‌ای از این حلقه‌‌ها را نشان می‌‌دهد. همان گونه که می‌‌بینید به دلیل این که مقدار var در هیچ جایی تغییر نمی‌‌کند، این شرط به هیچ وجه نقض نمی‌‌شود.شکل (7-6)برای خروج از این نوع حلقه‌‌ها، باید از کلیدهای ترکیبی CTRL+C در ویندوز و یونیکس ویا Cmnd+C در سیستم‌‌عامل مک استفاده‌‌کرد. نتیجه‌‌ی این قطعه کد و توقف ادامه‌‌ی اجرای آن را در شکل (7-7) می‌‌بینید.شکل (7-7)[1]Infinite Loop [2]Server [3]Client7-1-2- استفاده از Else در حلقه‌‌ی Whileبرخلاف خیلی از زبان‌‌های برنامه‌‌نویسی رایج، در پایتون می‌‌توان از دستور else در کنار حلقه‌‌های تکرار استفاده‌‌کرد. زمانی که شرط حلقه، نادرست شده ویا گام‌‌های تکرار به پایان برسد، در صورت استفاده از else ، بلوک دستورات مربوط به آن اجرا می‌‌شود.شکل (7-8)، ترکیب دستور else با دستورات دیگر را نشان می‌‌دهد. در این مثال، تا زمانی‌‌که متغیر count کمتر از 5 باشد، عدد را چاپ‌‌کرده و در غیر این صورت، دستورات مربوط به بلوک else را اجرا می‌‌کند.شکل (7-8)بنابراین زمانی که این قطعه کد اجرا شود، خروجی به صورت شکل (7-9) خواهدبود.شکل (7-9)7-1-3- حلقه‌‌ی while تک‌‌خطیهمانند عبارت شرطی if، اگر حلقه‌‌ی ما حاوی فقط یک خط دستور باشد، می‌‌توان سرآیند و دستور را با هم و در یک سطر داشت. به این نوع حلقه، while تک خطی می‌‌گویند. نمونه‌‌ای از آن را در شکل (7-10) می‌‌بینیم.شکل (7-10)این مثال، یک حلقه‌‌ی بی‌‌نهایت را تولید می‌‌کند که برای خروج از آن بایستی کلیدهای ترکیبی ذکرشده را به کار گرفت.7-2- حلقه‌‌ی تکرار Forاین حالت از حلقه، توانایی تکرار انواع دنباله‌‌های عناصر از جمله لیست‌‌ها و رشته‌‌ها را دارد. گرامر کلی آن به صورت شکل (7-11) است.شکل (7-11)اگر این دنباله، حاوی لیست تکراری باشد، در گام اول، ارزیابی می‌‌شود. سپس اولین عنصر دنباله، به متغیر تکرار‌‌کنندهاختصاص می‌‌یابد. حال، بلوک دستورات اجرا شده و هر آیتم در لیست به آن متغیر اختصاص داده‌‌ می‌‌شود. اجرای این بلوک از دستورات تا زمانی که به انتهای دنباله برسیم، ادامه می‌‌یابد. شمای کلی این حلقه را در شکل (7-12) مشاهده می‌‌کنید.شکل (7-12)ادامه‌‌ی بحث را با دو مثال موجود در شکل (7-13)، ادامه می‌‌دهیم. حلقه‌‌ی اول، دنباله‌‌ای از رشته‌‌ها و دومی دنباله‌‌ای از یک لیست می‌‌باشد.شکل (7-13)نتیجه‌‌ی اجرای هر دو حلقه را در شکل (7-14) مشاهده می‌‌کنید.شکل (7-14)7-2-1- تکرار با اندیس‌‌های متوالیهمان طوری که در مثال شکل (7-15) می‌‌بینیم، گاهی می‌‌توان از اندیس‌‌های یک لیست، به عنوان متغیر تکرار کننده و دنباله تکرار استفاده نمود.شکل (7-15)در این مثال، تابع ( ) len نمایان‌‌گر طول لیست بوده و متغیر index هر اندیسی از این دنباله را نشان می‌‌دهد. همچنین ( ) range تابعی‌‌است که این اندیس‌‌ها را به یک دنباله‌‌ی قابل‌‌تکرار تبدیل می‌‌کند. نتیجه‌‌ اجرای این قطعه کد را در شکل (7-16) می‌‌بینیم.شکل (7-16)7-2-2- استفاده از Else در حلقه‌‌ی Forهمانند حلقه while، در این نوع حلقه تکرار نیز می‌‌توان از دستور else استفاده‌‌کرد. زمانی که دنباله‌‌ی حلقه به پایان رسید، در صورت استفاده از دستور else، بلوک دستورات مربوط به آن اجرا می‌‌شود.7-3- حلقه‌‌های تکرار تو در توپایتون به شما اجازه می‌‌دهد تا از یک حلقه‌‌ی تکرار درون حلقه دیگر استفاده‌‌کنید. در این بخش چندین نمونه از این حلقه‌‌ها را ارائه خواهیم‌‌داد. گرامری کلی آن را به صورت مجزا برای حلقه‌‌های for و while در شکل‌‌های (7-17) و (7-18) نشان‌‌دادیم. البته لازم به ذکر است که هر دو نوع حلقه می‌‌توانند درون یکدیگر استفاده‌‌شوند. به عنوان نمونه، حلقه‌‌ی اول می‌‌تواند از نوع while و حلقه‌‌ی دوم از نوع for باشد. همچنین تعداد حلقه‌‌های تو در تو می‌‌تواند بیش از دو حلقه باشد.شکل (7-17)شکل (7-18)برای درک بهتر این موضوع، می‌‌خواهیم با دو نوع حلقه تو در تو، مسئله انتخاب اعداد اول را حل‌‌کنیم. در شکل (7-19) با استفاده از حلقه‌‌های for اعداد اول مابین 10 تا 20 را مشخص می‌‌کنیم. همان طوری که می‌‌بینید می‌‌توان از break برای متوقف‌‌کردن حلقه استفاده‌‌نمود. نتیجه‌‌ی اجرای این قطعه کد را در شکل (7-20) می‌‌بینیم.شکل (7-19)شکل (7-20)حال نوبت به حلقه while می‌‌رسد. مثالی را که در شکل (7-21) می‌‌بینید، اعداد اول بین 2 تا 20 را مشخص می‌‌کند.شکل (7-21)نتیجه‌‌ی اجرای این قطعه کد را در شکل (7-22) می‌‌بینیم.شکل (7-22)7-4- دستورات کنترلی حلقه‌‌هااین دستورات، موجب تغییر در روند عادی دنباله‌‌ی حلقه می‌‌شوند. زبان پایتون فقط از دستورات کنترلی break، continue و pass پشتیبانی می‌‌کند. در ادامه به بررسی جزئیات آن‌‌ها خواهیم‌‌پرداخت.7-4-1- دستور Breakهمانند break سنتی و قدیمی در زبان برنامه‌‌نویسی C، این‌‌دستور، حلقه فعلی را خاتمه‌‌داده و دستور بعدی را اجرا می‌‌کند. رایج‌‌ترین استفاده آن، برای شکستن تکرار حلقه بر اساس یک شرط دیگر است. به عبارت دیگر زمانی که بخواهیم با درستی یک شرط، از ادامه حلقه جلوگیری‌‌کنیم، می‌‌توان از دستور break استفاده‌‌کرد.اگر از حلقه‌‌های تو در تو استفاده می‌‌کنید، این دستور اجرای حلقه‌‌ی داخلی را متوقف‌‌کرده و خط بعدی از بلوک دستورات حلقه خارجی را اجرا می‌‌کند. شمای کلی این دستور را در شکل (7-23) مشاهده می‌‌نمایید.شکل (7-23)قطعه کدی که در شکل (7-24) می‌‌بینید، دو مثال مجزا را برای استفاده از دستور break نشان می‌‌دهد. مثال اول یک حلقه‌‌ی for با دنباله‌‌ای از رشته‌‌ها بوده و دومی یک حلقه‌‌ی while می‌‌باشد.شکل (7-24)نتیجه‌‌ی اجرای این مثال را در شکل (7-25) مشاهده می‌‌نمایید.شکل (7-25)7-4-2- دستور Continueاین دستور، کنترل اجرا را به ابتدای حلقه باز می‌‌گرداند. دستور continue دستورات اندیس فعلی حلقه را رد کرده و کنترل را به بالای حلقه منتقل می‌‌کند. بدیهی‌‌است که این دستور، در هر دو نوع حلقه‌‌ی while و for قابل استفاده است. شمای کلی آن را در شکل (7-26) مشاهده می‌‌فرمایید.شکل (7-26)شکل (7-27)، مثال break را برای دستور continue ارائه می‌‌دهد تا با بررسی این دو مثال، بهتر بتوانیم عملکرد آن‌‌ها را با هم مقایسه‌‌نماییم.شکل (7-27)همان طوری که در شکل (7-28) ملاحظه می‌‌کنید بر خلاف دستور break که از ادامه تکرار حلقه‌‌ها جلوگیری می‌‌کرد، دستور continue ، تنها از اندیس فعلی چشم‌‌پوشی کرده و ادامه‌‌ی حلقه را در پیش می‌‌گیرد.شکل (7-28)7-4-3- دستور Passاگر در نظر دارید که قطعه کد خاصی را به قسمتی از حلقه‌‌ی تکرار اضافه‌‌کنید، ولی در حال حاضر تصمیم نگرفتید که این قطعه کد، باید حاوی چه کدهایی باشد، از این دستور استفاده‌‌نمایید. به عبارت دیگر، pass یک دستور خالی بوده و اجرای آن هیچ تاثیری نخواهد داشت.حال سوالی که مطرح می‌‌شود، این‌‌است که، اگر هیچ اتفاقی نمی‌‌افتد، به چه‌‌دلیلی همچنان قصد استفاده از آن را داریم؟ شاید جواب این سوال در شکل (7-29) باشد.شکل (7-29)اگر به نتیجه‌‌ی اجرای این مثال، در شکل (7-30) توجه‌‌کنید، خواهید‌‌دید، زمانی که نوبت به حرف h می‌‌رسد، پیغام دلخواهی را چاپ می‌‌کنیم. این پیغام می‌‌تواند روشی برای خطایابی کدها ویا اطمینان از رسیدن کنترل به این قسمت از کدها باشد.شکل (7-30)در پست بعدی به اعداد خواهیم پرداخت. با ما همراه باشین