بهکارگیری حلقهی while در لیستها و دیکشنریها
تا اینجا هر بار تنها با یک مورد از اطّلاعات کاربر سر و کار داشتهایم. ورودی را از کاربر گرفته و همان را یا پاسخی به آن را چاپ کردهایم. پس از آن در یک حلقهی while مقدار ورودیِ دیگری را گرفتیم و به آن پاسخ دادیم. امّا برای نگهداری و پیگیری کاربران بیشتر یا اطّلاعات پرتعدادتر در حلقههای while، به لیستها و دیکشنریها احتیاج داریم.
بهکارگیری یک حلقهی for برای حلقه زدن در یک لیست موثّر است امّا نباید لیست را در داخل این حلقه تغییر داد چون پایتون در پیگیری موارد داخل لیست دچار مشکل میشود. اگر میخواهید هنگام کار کردن با یک لیست آن را تغییر دهید، از حلقهی while استفاده کنید.
انتقال دادن اعضا از یک لیست به لیستِ دیگر
لیستی از کاربران تازه ثبتنام شدهی یک وبسایت را در نظر بگیرید که هنوز تایید نشدهاند. چگونه میتوانیم پس از تایید این کاربران، آنها را به لیستی مجزّا شامل کاربران تاییدشده منتقل کنیم؟ یک روش استفاده کردن از حلقهی while است تا به کمک آن کاربران را از لیست کاربران تاییدنشده بیرون بکشیم، تایید کنیم و سپس به لیستی جداگانه از کاربران تاییدشده اضافه کنیم:
|
|
در 1 با لیستِ کاربرانِ تاییدنشده (Alice، Brian و Candace) و لیستی خالی برای نگهداری کاربران تاییدشده شروع میکنیم. حلقهی while در 2 تا زمانی که لیست unconfirmed_users خالی نباشد به کار ادامه میدهد. داخل این حلقه و در 3، تابع pop() هر بار کاربران تاییدنشده را از انتهای unconfirmed_users برمیدارد. اینجا چون Candace آخرین کاربر در unconfirmed_users است، نامش اوّلین نامی خواهد بود که از لیست حذف، به متغیّر current_user منسوب و به لیست confirmed_users اضافه میشود (4). بعدی Brian و سپس Alice خواهد بود.
فرآیند تایید کاربران را با چاپ کردن یک پیام تایید شبیهسازی میکنیم و سپس کاربران را به لیست تاییدشدهها میافزاییم. همزمان با کوچک شدن لیست کاربران تاییدنشده، لیست تاییدشدهها بزرگتر میشود:
حذف کردن مقدارهای مشخّصی از یک لیست
در فصل ۳ از remove() برای حذف کردن یک مقدار مشخّص از لیست استفاده کردیم. این تابع به این دلیل کار میکرد که مقدار مورد نظر ما تنها یک بار در لیست ظاهر شده بود. امّا اگر بخواهیم تمام نمونههای یک مقدار را از لیستی حذف کنیم، چه؟
فرض کنید لیستی از حیوانات خانگی دارید که ‘cat’ در آن بارها تکرار شده است. برای حذف تمام مشابههای این مقدار میتوانید یک حلقهی while را تا زمانی اجرا کنید که هیچ موردی از ‘cat’ در لیست باقی نمانده باشد:
با لیستی شامل چند عضو مشابه ‘cat’ شروع میکنیم. پس از چاپ کردن این لیست، پایتون وارد حلقهی while میشود زیرا مقدار ‘cat’ را دستِ کم یک بار در لیست مییابد. پس از ورود به حلقه، پایتون اوّلین نمونهی ‘cat’ را حذف کرده و به خطّ while برمیگردد. سپس از آنجا که هنوز ‘cat’ در لیست وجود دارد، مجدّداً وارد حلقه میشود. تا زمانی که دیگر هیچ مقداری مشابه ‘cat’ در حلقه موجود نباشد، هر نمونهی آن را حذف میکند:
پر کردن یک دیکشنری با ورودی کاربر
در هر مرحلهی اجرای حلقهی while، میتوانید هرقدر اطّلاعات که بخواهید دریافت کنید. بیایید یک برنامهی نظرسنجی بسازیم که در آن در هر بار اجرای حلقه یک بار نام و نظر مشارکتکنندگان را میپرسیم. دادههای گردآوریشده را در یک دیکشنری ذخیره میکنیم زیرا میخواهیم بین هر کاربر و پاسخ او ارتباط برقرار کنیم:
|
|
این برنامه ابتدا یک دیکشنری خالی (responses) تعریف میکند و پرچمی (polling_active) را برای نمایش فعّال بودن نظرسنجی مقداردهی میکند. تا زمانی که polling_active برابر با True باشد، پایتون کد داخل حلقهی while را اجرا میکند.
در داخل حلقه به کاربر اعلام میشود که نام و کوه مورد علاقهی خود برای نوردیدن را وارد کند. این اطّلاعات در دیکشنری responses ذخیره میشود و از کاربر پرسیده میشود که آیا نظرسنجی ادامه یابد یا نه. اگر yes وارد شود، برنامه بار دیگر وارد حلقهی while میشود. اگر no وارد شود پرچم polling_active به False تغییر مییابد و اجرای حلقهی while متوقّف میشود. سرانجام بخش آخر کد نتایج نظرسنجی را نشان میدهد.
اگر برنامه را اجرا کرده و چند پاسخ نمونه وارد کنید، باید خروجیای مانند زیر ببینید:
|
|
خودآزمایی
غذافروشی
لیستی به نام sandwich_orders بسازید و آن را با نام چند نوع ساندویچ پر کنید. سپس لیستی خالی به نام finished_sandwiches بسازید. در لیست سفارشهای ساندویچ حلقه بزنید و برای هر کدام پیامی چاپ کنید، مثلاً I made your tuna sandwich.. با درست شدن هر ساندویچ، سفارش آن را به لیستهای ساندویچهای تحویلدادهشده منتقل کنید. پس از آماده شدن تمام ساندویچها پیامی چاپ کنید و تمام ساندویچهای آمادهشده را فهرست کنید.
تمام شدنِ پاسترامی
لیستِ sandwich_orders در تمرین ۷-۸ را دوباره به کار بگیرید و مطمئن شوید ساندویچ ‘pastrami’ دستِ کم ۳ بار در آن تکرار شده باشد. در ابتدای برنامهی خود پیامی چاپ کنید حاکی از آنکه موجودیِ پاسترامی در این غذاخوری به پایان رسیده است، سپس به کمک یک حلقهی while تمام موارد ‘pastrami’ را از sandwich_orders حذف کنید. مطمئن شوید که در لیست ساندویچهای آماده هیچ نمونهای از ساندویچ پاسترامی نباشد.
سفر رویایی
برنامهای بنویسید که از کاربران دربارهی سفر رویایی آنها نظرسنجی کند. اعلانی مانند این چاپ کنید: If you could visit one place in the world, where would you go?. بخشی از کد را به چاپ کردن نتایج نظرسنجی اختصاص دهید.