حلقه while در پایتون (توضیح ساده به همراه مثال تصویری)

با سری آموزش‌های زبان برنامه نویسی پایتون خدمت شما عزیزان علاقمند به این حوزه هستیم. در این مقاله درباره حلقه while در پایتون صحبت می‌کنیم. در این آموزش قدم به قدم با ما همراه باشید.

نکته: اگر به انجام پروژه پایتون نیاز دارید و به هر دلیلی نمی‌توانید خودتان انجام آن را بر عهده بگیرید، می‌توانید از خدمات موسسه ما استفاده کنید.

یک file جدید درست می‌کنیم و نام آن را while.py می‌گذاریم.

 

ایجاد فایل جدید
ایجاد فایل جدید

می‌گوییم برای تک‌تک اعدادی که درون این range وجود دارد، همین آیتمی که وجود دارد را برای ما print کند. اسم آن را هر چیزی می‌توانیم قرار دهیم. تفاوتی ندارد که item، number یا num باشد.

کلیک راست می‌کنیم و Run Python File in Terminal را انتخاب می‌کنیم.

پرینت item، number یا num
پرینت item، number یا num

خروجی از صفر تا عدد ۱۹ را یکی یکی چاپ می‌کند. این ساختار حلقه‌ی for است. ما آن را با هم کار کردیم. می‌خواهیم در مورد while صحبت کنیم. ساختار حلقه‌ی while مقداری متفاوت است.
cls را تایپ می‌کنیم و Terminal را پاک می‌کنیم.

پرینت کردن عدد 0 تا 19
پرینت کردن عدد 0 تا 19

و با کلیک بر روی علامت × کلا آن را می‌بندیم.

حلقه while به این صورت است که ابتدا می‌نویسیم while (تا زمانی که) یک گزاره شرطی درست باشد، یک دستوری در اینجا اجرا می‌شود. ساختار حلقه while به این صورت است.

با ارور آن کاری نداشته باشید. به خاطر این‌که الان بدون مفهوم نوشتیم، ارور می‌دهد.
حلقه while می‌خواهد که یک Boolean به آن بدهیم. برای مثال می‌گوییم True. اگر این Boolean که به آن دادیم True بود یک دستور را اجرا می‌کند. برای مثال در اینجا می‌گوییم mohammad را print کند. الان ارور آن کلا برطرف می‌شود.

می‌گوید که یک Boolean بدهیم. در اینجا مستقیم True گذاشتیم. اگر True بود، این دستور به همین صورت تکرار می‌شود (تا ابد تکرار می‌شود). دقت کنید که تا ابد تکرار می‌شود که این خوب نیست. اما چه کاربردی دارد؟ برای مثل فرض کنید که می‌خواهیم یک پسوردی را از کاربر دریافت کنیم. تا زمانی که کاربر پسورد را اشتباه وارد کند، ما باید آن درخواست را تکرار کنیم که رمز را درست وارد کند. ایراد آن چیست؟

پرینت اسم محمد
پرینت اسم محمد

به کد بالا دقت کنید. گفتیم while True؛ این True است و گفتیم mohammad را print کند. تا ابد این mohammad همین‌طور print می‌شود و دیگر application ما به اصطلاح crash (کرش) می‌کند و کلا دیگر نمی‌توانیم هیچ کاری انجام دهیم و اپلیکیشن down می‌شود و از بین می‌رود.

اپلیکیشن و نرم‌افزار ما کلا از بین می‌رود و دیگر هیچ کاری نمی‌‌توانیم بکنیم و باید کلا نرم‌افزار را یک بار ببندیم و دوباره باز کنیم تا بتوانیم عملیات دیگری را انجام دهیم. حال آن را در اینجا یک بار امتحان می‌کنیم که بببینید اپلیکیشن کلا down می‌شود.

از آن اجرا می‌گیریم.

مشاهده می‌کنیم که همین‌طور دارد mohammad را چاپ می‌کند.
Terminal را می‌بندیم.

همین‌طور دارد چاپ می‌کند و دیگر نمی‌توانیم جلوی چاپ کردن آن را بگیریم و به همین صورت دارد در پایین اضافه می‌شود و دیگر نمی‌توانیم هیچ کاری کنیم. Terminal را می‌بندیم.

الان ظاهرا بسته شده است اما دیگر نمی‌توانیم terminal را باز کنیم. اپلیکیشن کرش کرده است و دیگر کاری نمی‌توان انجام داد. کلا اپلیکیشن و نرم‌افزار ویژوال استودیوکد از کار افتاد.

باید وارد task manager شویم و از آنجا درصد مصرف cpu را اگر ممکن باشد نشان می‌دهم که در اینجا کمی نامرتب است. End task را می‌زنیم که از بین برود و دوباره باید وارد نرم‌افزار شویم که بتوانیم کارمان را ادامه دهیم. folder مورد نظر را انتخاب می‌کنیم و آن را باز می‌کنیم.

پس حلقه while به این صورت است که اگر گزاره‌ای که به آن می‌دهیم، درست باشد و True باشد، تا ابد آن دستور برای شما اجرا می‌شود. اما یک مثال کاربردی‌تر می‌زنیم. مثال قبلی را کامنت می‌کنیم که دچار مشکل نشویم.

در اینجا می‌گوییم که کاربر یک password را وارد کرده است. فعلا مقدار آن چیست؟ می‌نویسیم input(“what is your password : “) یعنی می‌خواهد پسورد را وارد کنیم. بعد می‌گوییم while (تا زمانی که) پسوردی که وارد شده است، مخالف “1234” است، دوباره این پسورد را دریافت کند.

دستور خط قبل را copy می‌کنیم و در دو خط بعد از این خط قرار می‌دهیم. فقط قبل از آن یک دستور print قرار می‌دهیم و می‌خواهیم که your password is wrong را print کند و بعد دوباره پسورد را از کاربر بخواهد.

یک اجرا از این دستور می‌گیریم. کلیک راست می‌کنیم و Run Python File in Terminal را انتخاب می‌کنیم.

از ما می‌خواهد پسورد را وارد کنیم. برای مثال 234 را وارد می‌کنیم و enter را می‌زنیم.

پرینت پسورد 234
پرینت پسورد 234

می‌نویسد پسورد شما اشتباه است. دوباره از ما می‌خواهد پسورد را وارد کنیم. این بار 555 را وارد می‌کنیم و enter را می‌زنیم. باز هم می‌گوید اشتباه است و دوباره از ما می‌خواهد پسورد را وارد کنیم.

پرینت کردن پسورد 555
پرینت کردن پسورد 555

هرچقدر که این پسورد را اشتباه وارد کنیم، این عملیات تکرار می‌شود تا زمانی که 1234 را وارد کنیم و enter را بزنیم.

پرینت کردن پسورد 1234
پرینت کردن پسورد 1234

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

یک بار دیگر ساختار آن را با هم بررسی می‌کنیم. دستور اول به این صورت بود که یک پسوردی از کاربر درخواست شد. یک دستور input قرار دادیم و در آن از کاربر می‌پرسیم که پسورد چیست. پسورد را داخل متغیر password ریختیم. گفتیم تا زمانی که پسورد مخالف 1234 بود، یک عملیات را تکرار کند.

مشاهده کنید که در سری اول 234 را به عنوان پسورد قرار دادیم که مخالف 1234 بود. پس اول your password is wrong! را print می‌کند و می‌گوید پسورد شما اشتباه است و بعد دوباره از کاربر پسورد را می‌خواهد. وقتی که این کار را تکرار کرد، دوباره برمی‌گردد خط ۹ را چک می‌کند.

سری دوم 555 را به عنوان پسورد وارد کردیم. 555 را چک کرده است و چون مخالف 1234 بود، پیغام پسورد اشتباه است چاپ شد و دوباره از ما می‌خواهد پسورد را وارد کنیم. آنقدر این عملیات تکرار می‌شود تا اینکه پسورد را درست وارد کنیم یعنی بنویسیم 1234.

وقتی که 1234 وارد شد و خط ۹ چک شد، مشاهده می‌شود که password == “1234”. پس دیگر حلقه‌ی while اجرا نمی‌شود. به بعد از دستور while می‌رود که بعد از آن چیزی ننوشته بودیم.
در اینجا برای مثال می‌نویسیم که your password is correct را print کند. یعنی چاپ کند که پسورد صحیح است.

cls را تایپ می‌کنیم که Terminal پاک شود.

دوباره کلیک راست می‌کنیم و Run Python File in Terminal را انتخاب می‌کنیم که اجرا شود.

پسورد خواستن
پسورد خواستن

در اینجا از ما پسورد را می‌خواهد.
برای مثال test را وارد می‌کنیم و enter را می‌زنیم.

وارد کردن test
وارد کردن test

دوباره دستور while تکرار شده است. و به سراغ بعدی نرفت که پیغام پسورد شما صحیح است را چاپ کند و تا زمانی که این حلقه stop نشود به خط بعدی نمی‌رود.

این بار 444 را وارد می‌کنیم و enter را می‌زنیم. باز هم حلقه تکرار می‌شود. این بار 1234 را وارد می‌کنیم. بعد enter را می‌زنیم و your password is correct را چاپ می‌کند یعنی پسورد وارد شده درست است.

پرینت کردن your password is correct
پرینت کردن your password is correct

پس ساختار حلقه‌ی while به این صورت است که شما یک Boolean را برای آن ارسال می‌کنید. اگر درست بود، دستور تکرار می‌شود. تا زمانی که آن expression یا دستور شما درست باشد و true را برگرداند، دستور بدنه حلقه while اجرا می‌شود.

حال یک مثال دیگر بیان می‌کنیم. مثال قبلی را به کامنت تبدیل می‌کنیم.

پرینت کردن اعداد 0 تا 10
پرینت کردن اعداد 0 تا 10

فرض ‌کنیم که می‌خواهیم اعداد ۱ تا ۱۰ را در خروجی چاپ کنیم. با استفاده از حلقه for به سادگی این دستور را می‌نوشتیم. می‌گفتیم (for) به ازای هر numberای که درون range مربوط به ۱ تا ۱۱ است (زیرا خود ۱۱ به حساب نمی‌آید و تا یکی کمتر یعنی ۱۰ را به حساب می‌آورد)، می‌گوییم number را print کند.
از آن اجرا می‌گیریم

۱ تا ۱۰ را در خروجی برای ما چاپ کرده است.

اما فرض کنید که می‌خواهیم این کار را با استفاده از حلقه while انجام دهیم.
دستور حلقه for را به کامنت تبدیل می‌کنیم و می‌گوییم while …
قبل از این‌که حلقه while را بنویسیم، باید یک متغیری تعریف کنیم و نام آن متغیر را num قرار می‌دهیم و مقدار اولیه آن را هم ۱ در نظر می‌گیریم.

می‌گوییم تا زمانی که این num کوچکتر یا مساوی با عدد ۱۰ است یا اینکه کوچکتر از ۱۱ است، num را print کند. فقط مسئله‌ای که وجود دارد این است که متغیر num همیشه مقدار ۱ را دارد، پس این گزاره روبه‌روی while همیشه درست است. برای همین تا ابد این دستور print اجرا می‌شود و همین‌طور تکرار می‌شود و این جالب نیست. ما می‌خواهیم از عدد ۱ تا عدد ۱۰ را چاپ کند.

می‌گوییم ابتدا آن را print کند و وقتی که print کرد، بعد به آن عدد یک واحد اضافه کند. یعنی num = num +1
اگر این ساختار را به خاطر داشته باشید، گفته بودیم به جای آن می‌توانیم از += استفاده کنیم. یعنی به این صورت بنویسیم: num+=1
حال یک cls در Terminal تایپ می‌کنیم.

از آن اجرا می‌گیریم تا خروجی را مشاهده کنیم.

چاپ کردن اعداد 0 تا 10
چاپ کردن اعداد 0 تا 10

باز هم ۱ تا ۱۰ را در خروجی چاپ می‌کند.
اگر یادتان باشد در حلقه for برای یک range مقدار سوم قرار می‌دادیم و به عنوان step از آن استفاده می‌کردیم. بای مثال می‌گفتیم دوتا دوتا جلو برود و یا ۴تا ۴تا یا ۵تا ۵تا جلو برود.

در دستور وایلی هم می‌توان همین کار را انجام داد. برای مثال می‌خواهیم به جای اینکه یک واحد به آن اضافه کند، ۲تا ۲تا به آن اضافه شود. آن را ذخیره می‌کنیم و cls را تایپ می‌کنیم و Terminal را پاک می‌کنیم.

کلیک راست می‌کنیم و Run Python File in Terminal را انتخاب می‌کنیم.

چاپ کردن ۱، ۳، ۵، ۷، ۹
چاپ کردن ۱، ۳، ۵، ۷، ۹

مشاهده می‌کنیم که ۱، ۳، ۵، ۷، ۹ را چاپ کرده است.
حال یک مثال دیگر بیان می‌کنیم.

در همان مثال قبلی می‌خواهیم یکی یکی به اعداد اضافه کند ولی به جای اینکه خود num را برای ما نمایش دهد، می‌خواهیم علامت * را ضربدر num کند و * راا نمایش دهد.
cls را تایپ می‌کنیم.

کلیک راست می‌کنیم و Run Python File in Terminal را انتخاب می‌کنیم.

پرینت کردن ستاره
پرینت کردن ستاره

مشاهده می‌کنید که چنین خروجی خواهیم داشت.
حال کمی آن را بهتر می‌کنیم. در اینجا به جای * از یک کدی استفاده می‌کنیم که برای ما یک ایموجی برمی‌گرداند. یک \ و بعد U0001f600 را قرار می‌دهیم و آن را در num ضرب می‌کنیم. cls را تایپ می‌کنیم.

کلیک راست می‌کنیم و Run Python File in Terminal را انتخاب می‌کنیم.

پرینت کردن ایموجی خنده
پرینت کردن ایموجی خنده

ایموجی خنده را برای ما می‌آورد و چاپ می‌کند.

اما یک مسئله‌ای وجو دارد. فرض کنید که این تعداد زیاد است. مثلا ۳۰ تا باشد. پس به جای ۱۱ می‌نویسیم ۳۰ و به جای قرار دادن ایموجی هم بگوییم “*” * num را print کند. (خط دستور چاپ ایموجی را به کامنت تبدیل می‌کنیم)
آن را ذخیره می‌کنیم. cls را تایپ می‌کنیم.

کلیک راست می‌کنیم و Run Python File in Terminal را انتخاب می‌کنیم.

خروجی را مشاهده کنید که از ۱ تا ۲۹ را برای ما می‌آورد. فرض کنید که بنا به هر دلیلی می‌خواهید در یک شماره (برای مثال در شماره ۱۵) stop شود. برای مثال عدد ۱۵ برای شما عدد مهمی است و می‌خواهید وقتی به عدد ۱۵ رسید، این حلقه از کار بیفتد و به اصطلاح break (شکسته) شود.

در خط قبل از دستور print می‌خواهیم چک کند که if (اگر) num==15 آن موقع break کند و حلقه را بشکند. اگر نه، دوباره آن را print کند.
cls را تایپ می‌کنیم.

کلیک راست می‌کنیم و Run Python File in Terminal را انتخاب می‌کنیم.

پرینت کردن عدد 15
پرینت کردن عدد 15

مشاهده می‌کنید که وقتی به عدد ۱۵ رسید، دیگر ادامه نمی‌دهد.
حال به جای ۱۵ می‌نویسیم ۵ که به خوبی بتوانید مشاهده کنید. cls را تایپ می‌کنیم.

از آن‌جایی که در حال مطالعه این مقاله هستید، ممکن است به خدمات زیر نیاز داشته باشید:

انجام پروژه برنامه نویسی   |   انجام پروژه هوش مصنوعی   |   انجام پروژه داده کاوی

انجام پروژه پردازش تصویر   |   انجام پروژه یادگیری عمیق

کلیک راست می‌کنیم و Run Python File in Terminal را انتخاب می‌کنیم.

پرینت کردن عدد 4
پرینت کردن عدد 4

مشاهده می‌کنید تا وقتی که به ۴ تا رسید، حلقه تکرار شده است و وقتی به ۵ رسید، دیگر تکرار پیدا نمی‌کند و همین جا حلقه شکسته می‌شود.
یک مقدار بهتر می‌نویسیم. کلا این حلقه را به کامنت تبدیل می‌کنیم و پایین‌تر دوباره شروع به نوشتن می‌کنیم.

یک متغیر به نام number داریم و مقدار آن فعلا عدد ۱ است. می‌گوییم تا زمانی که number <= 10 عملیاتی را تکرار کند؛ خود number را print کند.

cls را تایپ می‌کنیم.
کلیک راست می‌کنیم و Run Python File in Terminal را انتخاب می‌کنیم.

این برنامه دوباره crash می‌کند. Terminal را می‌بندیم، مشاهده می‌کنیم که کرش کرده است.
ویدیو را متوقف می‌کنم و دوباره آن را باز می‌کنم.
در خط ۳۳ می‌گوییم number را +=1 قرار دهد. الان اگر آن را اجرا کنیم، تا عدد ۱۰ بیشتر نمی‌رود.

پرینت کردن عدد 1
پرینت کردن عدد 1

چرا ۳ تا ۹ را نشان نداده است؟ دوباره امتحان می‌کنیم. cls را تایپ می‌کنیم.

دوباره از آن اجرا می‌گیریم.

پرینت کردن عدد 1 تا 10
پرینت کردن عدد 1 تا 10

از ۱ تا ۱۰ را در خروجی نمایش می‌دهد. حال به هر دلیلی ممکن است بگوییم که عدد ۵ برای ما عدد مهمی است. اگر به عدد ۵ رسید، دیگر تکرار را ادامه ندهد. آن را بشکند و از آن رد شود. بعد از این حلقه هم می‌گوییم که this is over را print کند (یعنی تمام شده است).
cls را تایپ می‌کنیم.

کلیک راست می‌کنیم و از آن اجرا می‌گیریم.

پرینت کردن This is over
پرینت کردن This is over

This is over در اینجا نمایش داده می‌شود. در خط ۳۴ بعد از آنکه یک واحد به number اضافه شد، می‌گوییم چک کند اگر numberای که دارید در حلقه آن را چک می‌کنید، مقدارش برابر با عدد ۵ شد، break کند و حلقه را بشکند. cls را تایپ می‌کنیم.

کلیک راست می‌کنیم و Run Python File in Terminal را انتخاب می‌کنیم.

ادامه ندادن بیشتر از چهار بار
ادامه ندادن بیشتر از چهار بار

تا ۴ بیشتر ادامه پیدا نمی‌کند. زیرا وقتی مثلا به عدد ۳ رسید، چک می‌کند که عدد ۳ از ۱۰ کوچکتر است، آن را چاپ می‌کند و یک واحد به آن اضافه می‌کند و ۴ می‌شود. در خط بعد چک می‌کند که آیا ۴ مساوی با ۵ است؟ خیر. پس حلقه را نمی‌شکند و دوباره به خط ۳۱ برمی‌گردد.

حال عدد ما ۴ است. چک می‌کند که کمتر از ۱۰ است آن را چاپ می‌کند و آن را به اضافه ۱ می‌کند که ۵ می‌شود. بعد در خط بعد می‌بیند که ۵ با ۵ برابر است. پس حلقه شکسته می‌شود. برای همین دیگر عدد ۵ در خروجی نمایش داده نمی‌شود. زیرا در این نقط دیگر حلقه شکسته شد و دیگر به خط ۳۱ برنگشت و به خط بعدی (خط ۳۸) رفت.

فعلا یک فایل جدید به نام main.py باز می‌کنیم. در اینجا مثالی که داده بودیم را می‌خواهیم انجام دهیم. مثالی که بیان کرده بودیم، این بود که گفتیم به ازای هر numای که درون یک بازه عددی بین عدد ۱ تا عدد ۱۰ است، “*” * num را print کند. حال از آن اجرا می‌گیریم.

در خروجی چنین شکلی برای ما ایجاد می‌کند.
این یک مثال ساده بود. ما گفتیم که داخل این حلقه‌ی for به جای اینکه “*” * num را print کند، باز هم از حلقه for استفاده کنید. می‌خواهیم این را با استفاده از حلقه پیاده‌سازی کنیم.
ابتدا یک توضیحی راجع به آن می‌دهیم.

خوب به این قسمت توجه کنید. در خط اول یک ستاره، در خط دوم ۲ ستاره، در خط سوم ۳ تا، در خط چهارم ۴ تا و …

اگر دقت کنید، یک عملیات دارد در هر خط تکرار می‌شود. اول یکی بود، بعد ۲ تا شده، بعد ۳ تا شده، …
گویا عملیات اضافه شدن ستاره به هر خط دارد تکرار می‌شود. مشاهده می‌کنید که عدد ۱ بود یک ستاره اضافه شده است، عدد ۲ بوده است، ۲ تا ستاره اضافه شده است … همین‌طور تا آخر پیش رفته است.
می‌خواهیم این را با استفاده از حلقه پیاده‌سازی کنیم.

پس به جای اینکه‌در خط ۴ دستور ptint را بنویسید، یک متغیر تعریف می‌کنیم. برای مثال اسم متغیر را stars می‌گذاریم. آن یک رشته است منتها خالی است. چیزی درون آن نیست. حال می‌گوییم به ازای هر star که درون range(1,num) است، stars+=”*”
اکنون توضیح می دهم که چه اتفاقی دارد می‌افتد.

حال در خط بعد می‌گوییم stars را print کند.
یک خروجی از آن می‌گیریم. کلیک راست می‌کنیم و Run Python File in Terminal را انتخاب می‌کنیم

خروجی را مشاهده می‌کنید که تقریبا مشابه خروجی قبلی است.

گفتیم یک حلقه داریم که در بازه‌ی ۱ تا ۱۰ که البته خود عدد ۱۰ به حساب نمی‌آید و می‌گوییم از ۱ تا ۹ ، یک متغیر تعریف کند و داخل خود این حلقه یک حلقه‌ی دیگر داریم که به ازای هر تعدادی که از عدد ۱ تا آن عددی که این num در حالت فعلی است، به آن * اضافه کند.

در اینجا کمی کدها را مرتب‌تر می‌کنیم که بهتر شود.

به عنوان مثال فرض کنید که الان عدد ۱ است. num ما می‌شود ۱. زیرا در range ۱ تا ۹ است.

یک چنین چیزی را برای ما ایجاد می‌کند که به صورت کامنت روبه‌روی دستور خط ۳ قرار دادیم.
الان فرض کنید که در پیمایش اول عدد ۱ است. در خط بعد یک متغیر به اسم stars ایجاد می‌کند. می‌گوید به ازای هر عددی که در آن بازه‌ی عددی ۱ تا عدد ۱ است (یعنی فقط ۱)، * را به آن اضافه کند. که ۱ * می‌شود. برای همین در خط اول یک * اضافه می‌شود.

حال فرض کنید به جلو رفته است و به عدد ۵ رسیده است. در اینجا یک حلقه داریم که از ۱ تا ۵ را دارد ایجاد می‌کند.
یعنی در اینجا یک لیست داریم که از ۱ شروع می‌شود تا num ادامه دارد.

در اینجا حلقه دوم یک حلقه‌ای ایجاد کرده است که داخل آن لیستی داریم که از ۱ شروع می‌شود و تا آن عددی که الان در حلقه‌ی اول (iterate اول) است ادامه دارد. برای مثال الان که عدد ۵ است، می‌شود ۱ تا ۵. اگر عدد ۶ باشد، می‌شود ۱ تا ۶. بعد به ازای خود عددی که داخل این لیستی که اینجا داریم است، یک حلقه در نظر می‌گیرد و به آن ستاره اضافه می‌کند.

در نهایت هم گفتیم که این ستاره‌هایی که ایجاد شده است را چاپ کند.
اما یک مشکلی داریم. در خط ۳ گفتیم مثلا به عدد ۵ رسیده است. در خط بعد فعلا stars خالی است. ۵ بار باید تکرار شود. اما گفتیم در range عدد دوم داخل پرانتز حساب نمی‌شود. برای همین در خط آخر دچار مشکل می‌شویم.

در خط آخر ۸ تا * داریم. یک * کمتر است. چرا کم است؟ عدد آخر در خط سوم ۹ است. این ۹ در خط ۵ عدد دوم داخل پرانتز range است می‌شود range (1,9) که خود ۹ به حساب نمی‌آید و می‌شود ۱ تا‌ ۸. برای همین ۸ تا * به حساب می‌آید.

این مشکل را با هم حل می‌کنیم.
دو تا راه حل وجود دارد. یکی این است که range خط پنجم را از صفر شروع کنیم

یا این‌که نه، عدد شروع range در خط پنجم همان ۱ باشد و num را به اضافه ۱ کنیم.

در اینجا یک cls تایپ می‌کنیم.

کلیک راست می‌کنیم و Run Python File in Terminal را انتخاب می‌کنیم.

پرینت کردن 9 تا ستاره
پرینت کردن 9 تا ستاره

الان خط آخر ۹ تا * دارد و درست است.

البته این مثال که خواستم شاید به نظر منطقی نیاید. همان راه اولی که با هم پیاده‌سازی کردیم، خیلی ساده‌تر و خیلی بهتر است. اما چیزی که مدنظر من بود، می‌خواستم این تکرار را درون هر خط ببینید. دیدن تکرار بسیار مهم است.

برای همین گفتم که چنین چیزی را پیاده‌سازی کنیم. جلوتر که رفتیم، پروژه‌های عملی بیشتری که با همدیگر انجام دادیم، با حلقه‌ها بهتر آشنا می‌شوید و بیشتر با آنها کار می‌کنید.
حال به سراغ کاری که می‌خواستیم با هم انجام دهیم، می‌رویم. منظورم همان بازی سنگ کاغذ قیچی است.

دیگر با main.py کاری نداریم و آن را می‌بندیم.
یک اجرا از MyGame.py می‌گیریم. کلیک راست می‌کنیم و Run Python File in Terminal را انتخاب می‌کنیم.

rock … paper … scissors را داده است. می‌گوید حرکت بازیکن اول را وارد کنید که ما rock را وارد می‌کنیم و enter را می‌زنیم.

پرینت کردنrock … paper … scissors
پرینت کردنrock … paper … scissors

بازیکن ۲ برنده شده است.

برنده شدن بازیکن شماره 2
برنده شدن بازیکن شماره 2

اما در اینجا مشاهده می‌کنید که بازی به اتمام رسیده است. ما نمی‌خواهیم بازی تمام شود. مثلا فرض کنید که می‌خواهیم سه دست بازی کنیم.

پس خیلی ساده می‌گوییم که همه این موارد را از خط ۱۹ تا ۴۶ کلا بردارد یک indent به آن می‌دهیم که کمی جلوتر بیاید در بالای آن در خط ۱۸ می‌گوییم for (به ازای هر) تایمی که درون range(1,4) است. می‌خواهیم سه دست با هم بازی کنیم. با این روش سه بار می‌توانیم بازی کنیم. چون خود ۴ به حساب نمی‌آید و تا ۳ بار بازی می‌شود.

cls را تایپ می‌کنیم.

کلیک راست می‌کنیم و Run Python File in Terminal را انتخاب می‌کنیم.

Rock را وارد می‌کنیم و enter را می‌زنیم.
می‌گوید بازیکن ۲ برنده شده است. باز دوباره rock می‌آوریم. باز هم بازیکن ۲ برنده شده است.

پرینت کردن Rock
پرینت کردن Rock

برای باز سوم هم rock را وارد می‌کنیم. این بار هم بازیکن دوم برنده شده است. (هر سه بار paper آورده است)

این بازی به اتمام رسیده است و سه بار بازی کردیم. حال می‌خواهیم ساختار بازی را عوض کنیم.

می‌خواهیم تا زمانی که یکی از این بازیکنان به صورت کامل برنده نشده است، بازی ادامه پیدا کند. منظور چیست؟ مثلا فرض کنید که ما می‌خواهیم سه دست بازی کنیم. اگر یکی از این بازیکنان تعداد دست‌های بازی که برده است به ۲ برسد، بازی به اتمام می‌رسد.

پس در خط ۱۸ می‌گوییم که یک متغیر به نام player1_wins تعریف کند و مقدار آن را مساوی با صفر در نظر می‌گیریم. متغیر دیگری هم به نام player2_wins تعریف می‌کنیم و مقدار آن را نیز صفر در نظر می‌گیریم.

سپس به جای حلقه for می‌گوییم تا زمانی که (while) player1_wins (تعداد دست‌هایی که بازیکن ۱ برده است) کوچکتر از عدد ۲ باشد و تعداد بردهای بازیکن دوم هم کوچکتر از عدد ۲ بود، آنگاه این دستور را تکرار کند.

آن را ذخیره می‌کنیم تا مشکل while برطرف شود.

گفتیم تا زمانی که تعداد دست‌هایی که player_1 برده است، کمتر از ۲ بود و تعداد دست‌هایی که player_2 برده بود هم کمتر از ۲ بود، این بازی ادامه پیدا می‌کند.

اکنون حلقه‌ای که ما داریم، یک حلقه نامحدود است. این همیشه کوچکتر از ۲ و همیشه صفر است. player_2 همیشه تعداد دست‌هایی که برده است، کمتر از ۲ است.

چرا؟ چون صفر است و چیزی به آن اضافه نکردیم. پس بعد از جایی که نوشتیم player_1 برنده شده است، می‌نویسیم: player1_wins+=1 این دستور را copy می‌کنیم و در جاهایی که player_1 داریم (خط ۳۱، ۳۸ و ۴۵) قرار می‌دهیم.

سپس به سراغ player_2 می‌رویم. همان دستور را paste می‌کنیم فقط به جای player1_wins می‌نویسیم player2_wins در خط‌های ۳۴، ۴۱ و ۴۸ قرار می‌دهیم.

الان می‌توانیم یک تست از آن بگیریم. فقط قبل از این کار در خط ۲۲ یک دستور print می‌نویسیم و fstring قرار می‌دهیم و می‌گوییم f”player 1 wins : {player1_wins} and player 2 wins : {player2_wins}” را چاپ کند (تعداد دست‌هایی که player1 برده است و تعداد دست‌هایی که player2 برده است را چاپ کند).

قبل از آن می‌خواهیم تعداد دست‌هایی که بردند را نمایش دهد.
همیت را تست می‌کنیم. Terminal را باز می‌کنیم. در اینجا یک cls تایپ می‌کنیم.

کلیک راست می‌کنیم و Run Python File in Terminal را انتخاب می‌کنیم.

می‌گوید که تعداد دست‌هایی که player_1 برده است، صفر و برای player_2 هم صفر است.
rock را برای player_1 وارد می‌کنیم و کلید enter را می‌زنیم.

هر دو rock آوردند و برابر شدند. یک بار دیگر paper را برای player_1 وارد می‌کنیم و کلید enter را می‌زنیم.

این بار player_1 برنده شده است. پس player_1 یک دست جلو افتاده است.
دوباره paper را وارد می‌کنیم و enter را می‌زنیم.

این بار هم player_1 برنده شده است.

کمی بازی را بهتر می‌کنیم. در خط ۲۲ یک عدد ثابت قرار داده بودیم. یک متغیر به نام winning_score (امتیاز برنده شدن) قرار می‌دهیم. مثال مقدار آن را ۴ در نظر می‌گیریم و هر کس که به امتیاز ۴ برسد، برنده می‌شود. در خط ۲۲ به جای ۲ می‌گوییم از winning_score استفاده کند.

cls یا clear را تایپ می‌کنیم.

کلیک راست می‌کنیم و Run Python File in Terminal را انتخاب می‌کنیم.

احساس می‌کنم ظاهر این قسمت کمی جالب نیست. در خط ۲۳ نوشته Player 2 wins جالب نیست. کمی جمع‌وجورتر نوشته شود، بهتر است.
حال cls را تایپ می‌کنیم.

دوباره کلیک راست می‌کنیم و Run Python File in Terminal را انتخاب می‌کنیم.

صفر امتیاز
صفر امتیاز

مشاهده می‌کنید که هر دو بازیکن صفر امتیاز دارند.
می‌خواهد حرکت plaer_1 را انتخاب کنیم. paper را وارد می‌کنیم و enter را می‌زنیم.

در اینجا بازیکن اول برنده شد.
یک بار دیگر paper را وارد می‌کنیم. enter را می‌زنیم.

باز هم بازیکن ۱ برنده شده است. چند بار دیگر هم paper را انتخاب می‌کنیم و کلید enter را می‌زنیم.

هر بار بازیکن ۱ برنده شده است. بازیکن ۲ هر بار rock (سنگ) آورده است.

نگاهی به امتیاز برنده بیاندازید. مشاهده می‌کنید که امتیاز برنده ۳ شده است. توجه کنید که winning_score مقدارش برابر با ۴ بود. پس چرا در ۳ تمام شد؟ در واقع در ۳ تمام نشده است.

با توجه به خطوط مشخص شده در خط ۵۲ حلقه while به اتمام رسیده است. در پایین آن در خط ۵۴ خارج از حلقه while یک دستور print می‌نویسیم و در آن یک fstring قرار دادیم و می‌گوییم f”Final Scores: player 1 : {player1_wins} | player 2 : {player2_wins}” که در آن | به معنی «یا» یا علامت pipe است.

یک بار دیگر آن را اجرا می‌کنیم.

بار اول rock را وارد می‌کنیم و enter را می‌زنیم.

دوباره rock را انتخاب می‌کنیم و enter را می‌زنیم.

این بار paper را وارد می‌کنیم و enter را می‌زنیم.

سه بار دیگر هم ‌paper را انتخاب می‌کنیم و enter را می‌زنیم.

player_1 همان ۴ است
player_1 همان ۴ است

مشاهده می‌کنید که امتیاز نهایی player_1 همان ۴ است. منتها در سری قبل وقتی که امتیاز ۳-۰ شده بود، وقتی که به امتیاز ۳ رسید، همان طور که در شکل زیر می‌بینید، ما باز هم یک دست بازی کردیم. در دست آخر هم برنده شدیم ولی امتیاز را نمایش ندادیم. برای همین عدد ۴ را مشاهده نکردید.

خدماتی که شاید به آن‌ها نیاز داشته باشید:

معمولا دانشجویان، برق، مکانیک و کامپیوتر در طول دوران تحصیل خود به پایتون نیاز پیدا می‌کنند. ما در مجموعه کارت، انجام پروژه های دانشجویی شما را در تمامی رشته ها از جمله این 3 رشته انجام می‌دهیم. برای مشاهده جزئیات وارد صفحه مربوطه شوید و یا با کارشناسان ما تماس بگیرید:

انجام پروژه برق    |    انجام پروژه مکانیک   |   انجام پروژه کامپیوتر

حال فرض کنید که یکی دو دست بازی کردید. بازیکن مثلا در دست بعدی بازی نمی‌کند. می‌خواهیم در خط ۲۸ یک قابلیتی قرار دهیم که چک کند اگر player_1 که ما هستیم و داریم بازی می‌کنیم، مقدار آن برابر با q بود، آن موقع می‌گوییم break کند (حلقه را بشکند)

در اینجا گفتیم اگر player_1 که ما هستیم و می‌خواهیم مقدار را وارد کنیم، q را نوشتیم، یا player_1== “quit” و کاربر خواست خارج شود، آن وقت می‌گوییم که حلقه را بشکند. (break کند)
با هم آن را تست می‌کنیم. cls را تایپ می‌کنیم.

کلیک راست می‌کنیم و Run Python File in Terminal را انتخاب می‌کنیم.

برای مثال یک دست بازی می‌کنیم و در حرکت اول rock را وارد می‌کنیم و enter را می‌زنیم.

در اینجا مساوی شدیم. الان دیگر نمی‌خواهیم بازی کنیم. q را وارد می‌کنیم و enter را می‌زنیم.

مشاهده می‌کنید که هر دو صفر امتیاز دارند و بازی به اتمام رسید. ولی هنوز جا برای بازی کردن وجود داشت.

بحث در مورد این بازی به اتمام رسید. اگر توجه کنید، سعی کردم هر چیزی که تا اینجای کار آموزش دادیم را در اینجا استفاده کنیم. گزاره‌های شرطی، operatorهای منطقی، همین‌طور operatorهای مقایسه‌ای و متغیرها و انواع متغیرها و input و range همه این‌ها در اینجا وجود دارند.

از این پروژه‌ها در آموزش‌های خود زیاد داریم. من می‌خواهم که با مثال همه چیز را داشته باشید و بدانید که کاربرد هر چیزی به چه صورت است.

از دوستان یک خواهشی که دارم این است که sourceای که تا اینجای کار با همدیگر نوشتیم (این مثالی که با همدیگر نوشتیم) را یک بار دیگر خودشان بدون این‌که به این source نگاه کنید، آن را بنویسید و خودتان آن را پیاده‌سازی کنید.

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

فقط یک لحظه به همین مثالی که در اینجا پیاده‌سازی کردیم (main.py) برمی‌گردیم و می‌خواهیم یک بار دیگر در مورد آن توضیح دهیم و آن مثالی بود که از شما خواسته بودم آن را حل کنید.

مثالی که داشتیم، این بود که گفتیم به ازای هر num که درون یک range است مثلا از عدد ۱ شروع کند تا عدد ۱۰ ادامه دهد، در این بازه “*” * num را print کند.

خروجی این دو با همدیگر یکی است.
حال این دو خط را بر می‌داریم و به بالا انتقال می‌دهیم.

خروجی این دو یکی است. چیزی که وجود دارد و چیزی که می‌خواستم نشان دهم این بود که در داخل دستور print خط ۶ هم دارد یک حلقه (تکرار) ایجاد می‌شود و آن تکرار به این صورت است. دستورهای خط ۹ تا ۱۳ را به کامنت تبدیل می‌کنیم. یک بار دیگر از این دستور اجرا می‌گیریم. کلیک راست می‌کنیم و Run Python File in Terminal را انتخاب می‌کنیم.

در اینجا مشاهده می‌کنید که در هر خط دارد یک تکرار اتفاق می‌افتد. خط اول یک ستاره، خط دوم ۲ تا ستاره، خط سوم ۳ تا ستاره و … همین‌طور عملیات اضافه شدن ستاره دارد تکرار می‌شود.

برای همین می‌خواستم بگویم که در این داخل هم می‌توانید به صورت حلقه بنویسید؛ کاری که در خط ۹ تا ۱۳ انجام داده بودیم. حال خط‌های ۵ و ۶ را به کامنت تبدیل می‌کنیم و خط ۹ تا ۱۳ را از حالت کامنت درمی‌آوریم.

خط اول مشابه همان است. یک حلقه داریم که در بازه ۱ تا ۱۰ دارد iterate می‌کند و از ۱ تا ۹ می‌شود زیرا خود عدد ۱۰ حساب نمی‌شود. می‌گوییم به ازای هر کدام از این اعداد یک متغیر رشته‌ای تعریف کند.

همان‌طور که مشاهده می‌کنید که این متغیر از نوع str (string) است.

داخل ” ” چیزی قرار نمی‌دهیم (یک رشته خالی است) بعد از آن یک range از ۱ تا عددی که در آن iterate هستیم (مثلا الان عدد ۱ است، می‌شود ۱ تا ۱ که فقط عدد ۱ می‌شود) ایجاد می‌کنیم. برای مثال اگر الان عدد ۷ باشد، می‌شود از ۱ تا ۷ که در اینجا چون num+1 قرار دادیم، می‌شود از ۱ تا ۸.

یک چنین چیزی را ایجاد کردیم تا بتوانیم چنین شکلی را پیاده‌سازی کنیم.

خط دوم یعنی این‌که عدد ما الان ۲ شده است (num ما الان ۲ است). یک stars ایجاد شده است که داخل آن چیزی وجود ندارد. توجه کنید که در هر حلقه (در هر تکرار) این stars ایجاد می‌شود و داخل آن چیزی وجود ندارد. (روی عدد ۱ چیزی داخل stars نیست روی عدد ۷ هم چیزی درون stars نیست)

بعد از آن می‌گوییم که یک حلقه داخل این حلقه ایجاد کند. می‌گوییم به ازای هر ستاره‌ای که درون این بازه از ۱ تا آن عدد (مثلا اگر الان ۷ باشد، می‌شود از ۱ تا ۷) وجود دارد به آن stars یک ستاره اضافه کند. منتها چون یکی کمتر می‌شد (به دلیل این که‌ گفتیم در range عدد دوم حساب نمی‌شود)، یک واحد به آن اضافه کردیم. برای همین خروجی دقیقا مانند هم می‌شود.

کلیک راست می‌کنیم و Run Python File in Terminal را انتخاب می‌کنیم.

مشاهده می‌کنید که خروجی هر دو یکی است.

اینجا مشاهده می‌کنید که بالایی خروجی قبلی است و پایینی هم خروجی جدید است.
این موضوع هم به اتمام رسید و در جلسه آینده قرار است درباره لیست ها صحبت کنیم .

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

 

برای ثبت سفارش لطفا در تلگرام یا واتساپ یا ایتا به شماره 09104503300 پیام دهید.