پایتون همواره از ابتدای پیدایش، یکی از زبان های شئ گرا بوده است. به همین دلیل ساخت و استفاده از کلاس ها و اشیاء در آن آسان است. در این مقاله کمک میکنیم که در برنامه نویسی شئ گرا با پایتون به مهارت بالایی برسید. با zerotohero همراه شوید تا قهرمان برنامه نویسی شئ گرا با پایتون شوید!

اگر با برنامه نویسی شئ گرا آشنایی ندارید، در ابتدا مروری کلی بر مفاهیم شئ گرایی خواهیم داشت. سپس به بحث شئ گرایی در پایتون خواهیم پرداخت.

مروری بر شئ گرایی :

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

متغیر کلاس : متغیری است که در میان تمام اعضای کلاس مشترک است. متغیر کلاس در داخل کلاس و خارج از متدهای کلاس تعریف میشود.

بارگزاری تابع : اختصاص دادن بیش از یک رفتار به یک تابع را گویند. یعنی از یک تابع چند تعریف موجود است و بر اساس پارامترهایی که برای آن ارسال میشود یکی از رفتارها انتخاب میشود.

وراثت: انتقال خصوصیات یک کلاس به کلاس های دیگر گویند.

نمونه : شئ مخصوص هر کلاس را گویند. برای مثال، یک شی به نام obj که به کلاس circle تعلق دارد نمونه ای از کلاس circle است.

نمونه سازی (instantiation) : ساخت شئ از یک کلاس را گویند.

متد: نوع خاصی از توابع هستند که در کلاس تعریف میشوند.

شئ: نمونه ای یکتا از یک ساختار داده ای که توسط کلاس آن تعریف شده است.

بارگزاری عملگرها : اختصاص بیش از یک رفتار به یک عملگر خاص است. ادامه مطلب

از ماژول datetime برای کار با تاریخ و زمان در پایتون استفاده می کنیم.

در کد زیر تاریخ و ساعت جاری را چاپ کرده ایم:

مثال : 
import datetime
 
x = datetime.datetime.now()
print(x)

ادامه مطلب

بعضی اوقات خطای در طول اجرای برنامه رخ میده. مثلا وقتی از فایلی بخوایم استفاده کنیم یا ورودی از کاربر بگیریم، ممکنه مثلا فایل مورد نظر وجود نداشته باشه یا جابجا شده باشه. یا اینکه کاربر هر چیزی وارد کنه. یه برنامه نویس قوی سعی میکنه یه سری محافظ برای برنامش درست کنه که توی شرایط مختلف برنامه از کار نیوفته. خود شما برنامه ای رو استفاده میکنین که هر چند وقت از کار میوفته و ارور میده؟

اگر ما بتونیم تشخیص بدیم که کدوم قسمت برناممون ممکنه ارور بده، میتونیم به پایتون بگیم که حواست به این قسمت باشه، اگر اروری پیش اومد، یه کار خاص کن ولی برنامه رو متوقف نکن.

باید بگم که تمام خطای های در طول اجرای برنامه و خطاهای نوشتاری جزو استثنا (exception) در پایتون هستن و باید یه جوری مشکل اونارو حل کرد (handle).

یکی از راه های حل این مشکل، استفاده از بلوک کد try-except هستش. کد زیر رو ببینید:

try:
    age = int(input("Lotfan senne khod ra vared konid: "))
    print("Shoma %d saletan ast" % age)

except ValueError:
    print("Lotfan adad vared konid na chizaye dige!")

ادامه مطلب

ماژول به شما این امکان را می دهد که کدهای خود را در پایتون سازمان دهی کنید. گروه بندی کدهای مرتبط با هم در یک ماژول، خوانایی کد و قابلیت استفاده از آن را بهبود می بخشد. ماژول یک شی است که دارای متغیرهای عضو (attribute) می باشد. این متغیرها را می توان bind(متصل) کرده و مورد ارجاع (reference) قرار داد.
ماژول درواقع یک فایل است که حاوی کد پایتون می باشد. ماژول توابع، کلاس ها و متغیرهایی را در اختیار شما قرار می دهد. ماژول همچنین می تواند دربردارنده ی کد اجرایی باشد.
مثال:
کد پایتون ماژول aname، داخل فایل aname.py جای گذاری می شود. در زیر مثالی از یک ماژول ساده (support.py) را مشاهده می کنید:

def print_func( par ):
   print "Hello : ", par
   return

ادامه مطلب

فایل ها در چرخه یک برنامه زیاد دیده میشوند و یک برنامه نویس خوب همیشه باید توانایی کار با فایل های مختلف را داشته باشد. در این مقاله قصد داریم نحوه کار با فایل در پایتون (Python File Handling) را بررسی کرده و آموزش دهیم.

 

در این مقاله ما با پایتون نسخه ۳.۵ کار خواهیم کرد؛ در نسخه ۲.۷ پایتون نیز روند کار به صورت مشابه هست و تفاوت چندانی ندارد.

 

برای کار با فایل در پایتون نیاز به استفاده و Import کردن هیچ ماژول اضافی و مازادی نداریم.

برای کار با فایل باید از شی File در پایتون استفاده کنیم. این شی (Object) اطلاعاتی از فایل و توابعی ساده ای در اختیارمان میگذارد تا بتوانیم با فایل ها به راحتی کار کنیم.

اولین کار برای انجام عملیات های مختلف روی یک فایل، این است که یک شی از File مورد نظر خود داشته باشیم. برای این کار به طور مستقیم از تابع open() استفاده میکنیم.

این تابع دو آرگومان ورودی میگیرد؛ اولی مسیر و نام فایل است و دومین آرگومان مشخص کننده حالت باز شونده فایل است.

file_name = "test.txt"
file = open(file_name, "a+")

ادامه مطلب

همانطور که می دانید، پایتون توابع داخلی بسیاری همانند print() و غیره را در اختیار شما قرار داده است. با این حال شما می توانید توابع خودتان را نیز ایجاد کنید. این توابع را، توابع تعریف شده توسط کاربر یا user-defined می نامند.

تعریف یک تابع

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

  • بلاک تابع با کلمه کلیدی def شروع شده و نام تابع و پرانتز ( () ) باز و بسته بعد از آن می آید.
  • تمامی پارامترها و آرگومان های ورودی باید درون پرانتز قرار بگیرند. شما همچنین می توانید پارامترها را درون پرانتز حتی تعریف کنید.
  • عبارت اول یک تابع می تواند یک عبارت اختیاری باشد – رشته ای برای مستندات تابع یا docstring.
  • بلاک کد درون هر تابع با یک علامت کالن (:) شروع شده و به صورت تو رفته (indented) است.
  • عبارت return باعث خروج از یک تابع می شود، و به طور دلخواه می تواند یک مقدار را به قسمتی از کد که تابع را فراخوانی کرده است برگرداند. عبارت return با هیچ آرگومانی همانند return None است.

نحوه تعریف تابع

def functionname( parameters ):
   "function_docstring"
   function_suite
   return [expression]

ادامه مطلب

نوع داده دیکشنری (Dictionary) در زبان برنامه نویسی پایتون (Python)، به صورت لیستی از، کلیدها و value ها است، هر کلید توسط علامت کالن (:) از value جدا می شود، اندیس ها نیز توسط علامت کاما (,) از یکدیگر جدا می شوند. یک دیکشنری خالی بدون اندیس با استفاده از تنها دو آکولاد خالی به صورت {} نوشته می شود.

کلید ها در نوع داده dictionary یکتا می باشد (بدین معنی که نمی توان دو کلید یکسان داشت)، ولی value می تواند تکراری نیز باشد. value در دیکشنری می تواند هر نوعی باشد، ولی کلیدها باید یک نوع داده غیر قابل تغییر (immutable) مانند string، number، یا tuble باشد.

دسترسی به value ها در Dictionary

برای دسترسی به مقادیر دیکشنری، تنها کافی است از علامت کروشه و کلید متناظر با value مورد نظر استفاده کرد، در زیر مثالی ساده نشان داده شده است:

#!/usr/bin/python3

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
print ("dict['Name']: ", dict['Name'])
print ("dict['Age']: ", dict['Age'])

زمانی که کد بالا اجرا شود، خروجی زیر را تولید می کند: ادامه مطلب

Tuples درست شبیه لیست ها می‌باشند با این تفاوت که شما نمی‌توانید مقادیر آن‌ها را ویرایش کنید. مقادیر اولیه که برای تاپل ها تعیین می‌کنید ، تا آخر برنامه ثابت باقی می‌مانند و قابل تغییر نیستند.
tuple ها در پایتون چیزی شبیه به نوع داده ای list می باشند. تاپل ها تعدادی از مقادیر هستند که با ویرگول از یکدیگر تفکیک می شوند. tuple ها داخل () تعریف می شوند.
تفاوت بنیادین میان list ها و tuple ها این است که لیست ها داخل آکولاد [] مشخص می شوند و المان ها و نیز اندازه آن ها تغییر پذیر است در حالی که tuple ها درون پرانتز تعریف می شوند و قابلیت بروز رسانی را ندارند. tuple را می توان لیست های فقط خواندنی نیز نام گذاشت.
فرایند اعلان tuple در ایجاد لیستی از مقادیر تفکیک شده توسط ویرگول خلاصه می شود. در صورت تمایل می توان این مقادیر را داخل پرانتز محصور کرد. مثال:

tup1 = ('physics', 'chemistry', 1997, 2000);
tup2 = (1, 2, 3, 4, 5 );
tup3 = "a", "b", "c", "d";

ادامه مطلب

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

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

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

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

حال به منظور درک بهتر این موضوع، به بررسی نحوۀ تعریف دیتا تایپ لیست در زبان برنامه‌نویسی پایتون می‌پردازیم که برای این منظور از علائم [] استفاده می‌کنیم و آبجکت‌های مد نظر را مابین این دو کروشه قرار داده و هر یک را با علامت , از هم جدا می‌کنیم. برای مثال، لیست‌های زیر را در نظر می‌گیریم:

ادامه مطلب

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

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

همچنین با استفاده از دستور pass می‌توان یک کلاس بدون پیاده‌سازی متدی در آن یا فانکشنی بدون تعریف تَسک‌های مورد نظر داخل آن پیاده‌سازی کرد به علاوه اینکه با به‌کارگیری دستور pass می‌توان حلقۀ for را به نحوی تعریف نمود که مثلاً به ازای برخی اِلِمان‌های خاص یکسری دستور اجرا شده و بر روی سایر اِلِمان‌ها پردازش خاصی اِعمال نگردد. بنابراین دستور pass در توسعۀ نرم‌افزار با زبان پایتون به منظور مشخص کردن بخشی از سورس‌کد مورد استفاده قرار می‌گیرد که نیاز به تکمیل شدن داشته اما از سوی دیگر اپلیکیشن مد نظر می‌باید بدون هیچ‌گونه مشکلی اجرا گردد.

حال پس از آشنایی با ویژگی‌های دستور pass در زبان برنامه‌نویسی پایتون، در ادامه قصد داریم تا نحوۀ به‌کارگیری آن را در قالب یکسری مثال کاربردی مورد بررسی قرار دهیم. ادامه مطلب

در آموزش‌های گذشته با حلقۀ while آشنا شدیم و نحوۀ به‌کارگیری این ساختار را در قالب یکسری مثال کاربردی بررسی کردیم و دیدیم که در صورت برقرار بودن شرایطی خاص، اجرای دستورات داخل بدنۀ حلقه تکرار می‌شوند اما در این آموزش قصد داریم با ساختار حلقۀ for آشنا شویم. در واقع، دستور for همچون دستور while برای تکرار اجرای یک قطعه کد مورد استفاده قرار می‌گیرد با این تفاوت که در به‌کارگیری حلقۀ for دقیقاً می‌دانیم که تَسک مد نظر را چند مرتبه باید تکرار کنیم. فرم کلی حلقۀ for بدین صورت می‌باشد :

for target in object: # Assign object items to target
    #block(s) of statements, Repeated loop body: uses target

در حالت عادی و بر اساس الگوی فوق هر حلقۀ for دقیقاً به تعداد عضوهای دنبالۀ object تکرار می‌شود بدین صورت که هر یک از اعضای دنباله به ترتیب و با شروع از عضو اول به متغیر target منتسب شده و دستورات داخل بدنۀ حلقه به ازای هر یک از انتساب‌ها اجرا می‌شوند و این پروسه تا زمان اِتمام اعضای دنبالۀ object ادامه پیدا می‌کند.

حال به منظور آشنایی بیشتر با ساختار دستور for و نحوۀ کارکرد آن در زبان برنامه‌نویسی پایتون مثالی را در ادامه بررسی می‌کنیم که در آن قصد داریم تا با کمک حلقۀ for هر یک از حروف استرینگ «Mypgr» را به صورت جداگانه در خروجی چاپ کنیم :

letterNum = 0
for letter in "Mypgr":
    letterNum += 1
    print("Letter ", letterNum, " is ", letter,".")
print("Mypgr has", letterNum, "letters.")

در کد فوق متغیری با شناسۀ letterNum تعریف کرده و عدد صحیح ۰ را به آن اختصاص داده‌ایم که قرار است تا به منظور شمارش تعداد حروف کلمۀ مد نظر یا به عبارتی شمارش تعداد دفعات تکرار اجرای دستوراتِ داخل حلقۀ for مورد استفاده قرار گیرد بدین صورت که مقدار منتسب به متغیر letterNum در هر بار اجرای حلقه یک واحد افزایش پیدا کرده و مقدار نهایی آن در خروجی چاپ می‌شود. ادامه مطلب

در آموزش قبل با دستور break و نحوۀ به‌کارگیری آن در ساختار حلقۀ while آشنا شدیم و دیدم که مفسر پایتون با رسیدن به دستور break در داخل حلقۀ while ادامۀ دستورات داخل بدنۀ آن را نادیده گرفته و از حلقه خارج می‌شود و ادامۀ برنامه را اجرا می‌کند (توجه داشته باشیم که در چنین شرایطی دستور else که بلافاصله بعد از حلقه می‌آید هم اجرا نمی‌شود.)

در این آموزش با دستور continue که یکی دیگر از دستورهای قابل‌استفاده در حلقه‌ها است آشنا خواهیم شد که به نوعی جریان اصلی اجرای دستورهای داخل یک حلقه‌ را تغییر می‌دهد و در ادامه نحوۀ پیاده‌سازی این دستور را در قالب یک مثال بررسی می‌کنیم بدین صورت که برنامه‌ای می‌نویسیم تا اعداد زوج یک رقمی مثبت یا به عبارتی اعداد ۸، ۶، ۴، ۲ و ۰ را به ترتیب از بزرگ به کوچک در خروجی چاپ کند.

توجه : اعداد زوج بر عدد ۲ بخش‌پذیر هستند بدین معنی که باقیماندۀ تقسیم آن‌ها بر ۲ برابر با ۰ است و اعداد فرد نیز در مقابل اعداد زوج قرار گرفته و باقیماندۀ تقسیم آن‌ها بر ۲ عددی غیر ۰ می‌باشد. ادامه مطلب

در آموزش قبل با ساختار حلقۀ while آشنا شدیم و نحوۀ کارکرد آن را در قالب مثال‌هایی نسبتاً کاربردی بررسی کردیم و گفتیم که دستور while را به صورت ساده می‌توانیم بدین ترتیب بیان کنیم که «تا وقتی شرط x برقرار است، دستور y اجرا شود.» برای درک بهتر کاربرد دستور break در ساختار حلقه‌های while فایل whileLoop.py از آموزش قبل را مجدداً مد نظر قرار می‌دهیم به طوری که داریم :

correctPassword = "Mypgr"
password = input("Please enter the password --> ")
while password != correctPassword:
    password = input("Please try again and enter the correct password --> ")
print("Welcome to Mypgr.ir!")

در کد فوق استرینگ «Mypgr» را به عنوان پسوردی ثابت برای ورود به وب‌سایت سکان آکادمی در نظر گرفته شده است که کاربران برای ورود به سایت باید این پسورد را به درستی وارد کنند و در صورت مطابقت پسورد ورودی کاربر با استرینگ تعیین‌شده، پیغام خوشامدگویی برای کاربر چاپ می‌شود و در غیر این صورت برنامه منتظر دریافت ورودی جدید از سمت کاربر می‌ماند.

در عین حال، هیچ سناریویی برای شرایط عدم توانایی کاربر جهت وارد کردن رمز عبور درست وجود ندارد؛ به عبارت دیگر، حلقۀ مورد نظر برای دریافت مجدد رمز عبور تا زمان وارد کردن کلمۀ عبور درست دائماً تکرار می‌شود که در چنین شرایطی اگر کاربر نتواند کلمۀ عبور درست را وارد کند هیچ راهی برای پایان دادن به اجرای برنامه ندارد و ناچار است تا پنجرۀ آن را ببندد یا با کلیدهای ترکیبی CTRL+C به اجرای برنامه خاتمه دهد. برای رفع چنین مشکلی باید به طریقی قبل از False شدن مقدار بولین شرط حلقه از آن خارج شویم که در این گونه موارد به‌کارگیری راه‌کاری همچون استفاده از دستور break مناسب می‌باشد. ادامه مطلب

در آموزش‌های گذشته با نحوۀ تعریف و استفاده از دستور if در زبان برنامه‌نویسی پایتون آشنا شدیم و دیدیم که با برقرار بودن یک شرط خاص کدهای داخل بدنۀ دستور if یک بار اجرا شده و در غیر این صورت دستورات مذکور به هیچ وجه اجرا نمی‌شوند. برای مثال، فرض کنید جهت ورود به وب‌سایت سکان آکادمی یک پسورد ثابت در قالب استرینگ «SokanAcademy» در نظر گرفته شده است به طوری که تمامی کاربران برای ورود به سایت می‌باید این پسورد را به درستی وارد کنند و در غیر این صورت اجازۀ ورود به ایشان داده نمی‌شود که برای پیاده‌سازی چنین مثالی، کدی مانند زیر خواهیم داشت :

correctPassword = "Mypgr"
password = input("Please enter the password --> ")
if password == correctPassword:
    print("Welcome to Mypgr.ir!")

در کد فوق استرینگ «SokanAcademy» را به عنوان پسوردی ثابت در متغیری با شناسۀ correctPassword ذخیره کرده‌ایم سپس از کاربر خواسته‌ایم تا کلمۀ عبور مربوطه را وارد کند که آن را به متغیری تحت عنوان password منتسب کرده‌ایم. در ادامه و در دستور شرطی چک می‌کنیم که آیا استرینگ ذخیره‌شده در متغیر password یا به عبارتی پسورد ورودی از سمت کاربر با کلمۀ عبور مد نظر برای وب‌سایت مطابقت دارد یا خیر که در صورت درست بودن این شرط استرینگ «!Welcome to Mypgr.ir» را در معرض دید کاربر قرار می‌دهیم و در غیر این صورت هیچ کاری انجام نمی‌دهیم. اسکریپت این برنامه را در فایلی به نام ifClause.py ذخیره کرده و آن را اجرا می‌کنیم. حال فرض کنید کاربری پسورد خود را در قالب استرینگی بدین ترتیب وارد می‌کند :

Please enter the password --> sokanacademy

در واقع، کاربر مذکور هیچ توجهی به بزرگ یا کوچک بودن حروف کلمۀ عبور ندارد و این در حالی است که از یکسو مفسر پایتون نسبت به حالت حروف حساس بوده و از سوی دیگر رمز عبور مد نظر با دو حرف بزرگ به صورت استرینگ «SokanAcademy» تعریف شده است که از همین روی شرط if برقرار نبوده و دستورات بدنۀ آن هرگز اجرا نمی‌شوند.

در چنین شرایطی کاربر نمی‌تواند وارد سایت شود چرا که دستور if تنها یک بار درست بودن رمز عبور را بررسی می‌کند و بدین ترتیب کاربر مذکور امکان تلاش مجدد به منظور وارد کردن پسورد جدید را ندارد که از همین روی نیاز به دستوری داریم تا پروسۀ دریافت کلمۀ عبور از کاربر و بررسی مطابقت آن با پسورد درست را چندین مرتبه تکرار کند تا بدین طریق هر کاربر چند مرتبه امکان ارسال رمز عبور خود را داشته باشد.

همان‌طور که در آموزش‌های قبل اشاره کردیم، یکی از قابلیت‌های تمامی زبان‌های برنامه‌نویسی استفاده از یکسری سینتکس استاندارد به منظور اجرای مکرر بخشی از کدهای برنامه در جهت کنترل جریان آن است که تحت عنوان Loop (حلقه) شناخته می‌شود که از آن جمله می‌توان حلقۀ while را نام برد که فرم کلی این دستور مرکب بدین صورت می‌باشد :

while testConditions:
    # block(s) of code

مفسر پایتون با رسیدن به حلقه‌های تکرار از جنس while شرط تعیین‌شده را بررسی می‌کند و تا زمانی که مقدار این شرط برابر با True ارزیابی شود، قطعه کدهای داخل بدنۀ آن را به صورت مکرر اجرا می‌کند که چنین دستوری اصطلاحاً لوپ (حلقه) نامیده می‌شود چرا که دستورات داخل آن پشت‌سرهم اجرا می‌شوند و با پایان یافتن آن‌ها مجدداً به ابتدا برگشته و شرط پایان حلقه بررسی می‌شود که در صورت برقرار بودن شرط مذکور حلقه ادامه پیدا می‌کند و در غیر این صورت جریان برنامه از حلقه مذکور خارج شده و سایر دستورات پس از آن اجرا می‌شوند.

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

 

بر اساس آنچه در نکتۀ  فوق بیان شد، ممکن است در برخی موارد حلقۀ while تعریف‌شده در برنامه اجرا نشود که برای درک بهتر این موضوع مثال زیر را در ادامه آورده‌ایم :

>>> while False:
        print("This code never will run.")

در کد فوق مقدار شرط while از همان ابتدا برابر با مقدار بولین False تعریف شده است که از همین روی دستور داخل بدنۀ آن هرگز اجرا نمی‌شود. حال به منظور آشنایی بیشتر با ساختار حلقه‌هایی از جنس while در زبان برنامه‌نویسی پایتون به مثال فوق که مرتبط بود با «ورود به سایت سکان آکادمی» باز می‌گردیم و سعی می‌کنیم تا برنامۀ آن را با استفاده از دستور while بازنویسی و تکمیل کنیم:

correctPassword = "Mypgr"
password = input("Please enter the password --> ")
while password != correctPassword:
    password = input("Please try again and enter the correct password --> ")
print("Welcome to Mypgr.ir")

 

در ابتدا، همچون مثال قبل، استرینگ «Mypgr» را به عنوان پسوردی ثابت در متغیری با شناسۀ correctPassword ذخیره کرده‌ایم و از کاربر خواسته‌ایم تا کلمۀ عبور مربوطه را وارد کند که آن را به متغیری تحت عنوان password منتسب کرده‌ایم و در سطر بعد دستور حلقۀ while را به کار گرفته‌ایم و بدین ترتیب در شرط حلقه گفته‌ایم تا زمانی که استرینگ منتسب به متغیر password یا به عبارتی کلمۀ عبور ورودی توسط کاربر مخالف کلمۀ عبور مد نظر برای وب‌سایت باشد، دستورات داخل حلقه مکرراً اجرا شوند که پس از شرط حلقه و برای پایان دادن به سربند این دستور مرکب از علامت : استفاده کرده‌ایم سپس دستورات داخل بدنۀ while را با رعایت تورفتگی نسبت به بلوک سربند آن در یک بلوک جدید می‌نویسیم.

در دستورات داخل بدنۀ حلقه نیز در صورتی که کاربر به هر دلیلی پسورد ورود به وب‌سایت را اشتباه وارد کند، استرینگی به صورت «<– Please try again and enter the correct password» در خروجی چاپ شده و مفسر منتظر ورود کلمۀ عبور جدید از سمت کاربر می‌ماند و این پروسه تا زمانی ادامه می‌یابد که کلمۀ عبور واردشده توسط کاربر با کلمۀ عبور درست مطابقت نداشته باشد و به محض اینکه کاربر رمز ورود درست را وارد کند، شرط حلقۀ while برابر با مقدار بولین False ارزیابی شده و مفسر از حلقه خارج می‌شود و ادامۀ دستورات برنامه را اجرا می‌کند که در نهایت استرینگ خوشامدگویی در معرض دید کاربر قرار می‌گیرد. حال اسکریپت این برنامه را در فایلی به نام whileLoop.py ذخیره کرده و آن را اجرا می‌کنیم که در خروجی خواهیم داشت:

Please enter the password --> mypgr
Please try again and enter the correct password --> mypgr
Please try again and enter the correct password --> mypgr
Please try again and enter the correct password --> mypgr
Welcome to mypgr.ir

همان‌طور که در نتایج خروجی می‌بینید، با اجرای برنامه از کاربر درخواست می‌شود تا کلمۀ عبور را وارد کند و تا زمانی که کلمۀ عبور درست توسط کاربر وارد نشده، دائماً برنامه اجرا می‌شود و منتظر دریافت ورودی از سمت کاربر می‌ماند و به محض وارد کردن پسورد درست توسط کاربر پیغام خوشامدگویی در خروجی چاپ می‌شود.

نکته : در زمان کدنویسی دستور while باید دقت داشته باشیم که شرط ورود را با استفاده از دستورات داخل بدنۀ آن به گونه‌ای کنترل کنیم که در نهایت شرط مد نظر برابر با مقدار بولین False شده و حلقۀ مذکور در جایی پایان یابد که در غیر این صورت اجرای آن تا بی‌نهایت ادامه پیدا می‌کند!

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

i = 5
while i:
    print(i)
    i -= 1 #i = i-1
print("At the end i equals", i, ".")

در کد فوق مفسر پایتون اجرای برنامه را از سطر اول شروع می‌کند که در ابتدا متغیری با شناسۀ i تعریف شده و عدد صحیح پنج به آن منتسب شده است و در ادامه با رسیدن به کلمۀ کلیدی while شرط آن را بررسی می‌کند، و همان‌طور که در آموزش‌های قبل اشاره کردیم، تمامی اعداد به جز عدد صفر با مقدار بولین True ارزیابی می‌شود که از همین روی شرط مذکور برقرار بوده و مفسر وارد بدنۀ آن شده و دستورات داخلی را اجرا می‌کند.

در اولین دستور از بدنۀ حلقۀ while فانکشن ()print با آرگومان ورودی i فراخوانی شده است بدین معنی که مقدار منتسب به متغیر i در خروجی چاپ شده و در سطر بعد یک واحد از این مقدار کم می‌شود و مجدداً مفسر به ابتدای حلقه بازگشته و شرط را بررسی می‌کند و این مراحل تا زمانی ادامه می‌یابد که شرط حلقۀ while برابر با مقدار بولین False ارزیابی شود که در این صورت مفسر از حلقه خارج شده و دستور سطر آخر را اجرا می‌کند که بدین ترتیب استرینگ «At the end i equals» به همراه آخرین مقدار منتسب به متغیر i در خروجی چاپ می‌شود. اسکریپت برنامۀ فوق را در فایلی به نام whileLoopInfinite.py ذخیره کرده و آن را اجرا می‌کنیم که در خروجی خواهیم داشت:

۵
۴
۳
۲
۱
At the end i equals 0 .

همان‌طور که می‌بینید، اولین مقدار منتسب به متغیر i عدد پنج بوده و در خروجی چاپ شده است و در ادامه یک واحد از آن کم شده و مفسر پایتون به ابتدای حلقه بازگشته و مقدار جدیدِ منتسب به این متغیر را چاپ کرده است که این مراحل تا زمانی ادامه یافته است که مقدار متغیر i صفر شده و مقدار بولین شرط حلقۀ while برابر با False شده است؛ به عبارت دیگر، حلقۀ while در این مثال به گونه‌ای کنترل شده است تا در نهایت مقدار بولین شرط آن برابر با False شده و متوقف گردیده است. حال برای آشنایی با سازوکار یک حلقۀ بی‌نهایت، برنامۀ مثال قبل را بدین صورت تغییر می‌دهیم:

i = 5
while i:
    print(i)
    #i -= 1 #i = i-1
print("At the end i equals", i, ".")

در واقع، تنها تغییری که در مثال قبل اِعمال کرده‌ایم این است که بخشی از کد که مسئول کاهش مقدار متغیر i است را کامنت کرده‌ایم و بدین ترتیب در هر بار اجرای حلقه چیزی از مقدار اولیۀ متغیر i کم نمی‌شود و همواره برابر با عدد پنج باقی مانده و بالتبع شرط حلقۀ while همواره True در نظر گرفته می‌شود! اکنون برنامه را اجرا می‌کنیم که نتیجۀ حاصل از آن بدین ترتیب خواهد بود :

۵
۵
۵
۵
۵
۵
۵
.
.
.

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