شهریور ۱۱, ۱۳۹۸ Mostafa بدون دیدگاه

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

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

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

در واقع، درک چگونگی تصمیم‌گیری مفسر پایتون با استفاده از دستورات شرطی بسیار ساده است چرا که ما هم در طول روز تصمیم‌هایی بر همین اساس می‌گیریم که برای مثال می‌توان به مواردی از این دست اشاره کرد:

– اگر هوا سرد بود لباس گرم می‌پوشم.
– اگر تشنه شوم آب می‌نوشم.

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

if conditions:
    # block/blocks of code

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

price = int(input("How much does it cost?"))
if price <= 100000:
    print("I want it.")

در برنامۀ فوق متغیری با شناسۀ price تعریف کرده‌ایم که قیمت مربوط به کالای مد نظر را نگهداری می‌کند به طوری که با استفاده از متد ()input قیمت کالا را از ورودی گرفته و با فانکشن ()int آن را به عدد صحیح تبدیل می‌کند و در ادامه مفسر پایتون بررسی می‌کند که اگر مقدار ارجاع داده‌شده به متغیر price (قیمت ورودی) کوچک‌تر یا مساوی ۱۰۰/۰۰۰ بود، دستور داخل بدنۀ if اجرا شده و استرینگ «.I want it» در خروجی چاپ شود و در غیر این صورت، دستورات داخل بدنۀ if هرگز اجرا نمی‌شوند.

کد فوق را در فایلی به نام ifStatement.py ذخیره کرده و آن را اجرا می‌کنیم و با وارد کردن مقداری بزرگ‌تر از عدد ۱۰۰/۰۰۰ دستورات بدنۀ if اجرا نشده و هیچ مقداری در خروجی نخواهیم داشت اما این در حالی است که با دادن مقداری کمتر یا مساوی عدد ۱۰۰/۰۰۰ استرینگ زیر را به عنوان خروجی خواهیم داشت:

How much does it cost? 20000
I want it.

در واقع، با وارد کردن عدد ۲۰/۰۰۰ شرط برقرار شده و در ادامه دستور بدنۀ آن اجرا می‌شود که منجر به چاپ استرینگ فوق در خروجی گردیده است.

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

if 1:
    print("1 equals True.")

همان‌طور که در آموزش‌های قبل اشاره کردیم، تمامی اعداد به جز ۰ یا ۰.۰ با مقدار بولینی معادل True ارزیابی می‌شوند و از همین روی شرط مقابل دستور if همواره برقرار بوده و مقدار بولین True دارد و از همین روی دستور داخل بدنۀ آن همواره اجرا می‌شود که البته کد بالا را می‌توان به صورت زیر بازنویسی کرد که باز هم این شرط همواره برقرار است:

if 1 == True:
    print("1 equals True.")

طبق توضیحات ارائه‌شده بدیهی است که بازنویسی دستور شرطی به صورت زیر منجر بدین می‌شود تا دستور داخل بدنۀ آن هرگز اجرا نگردد :

if 0:
    print("0 equals False")

علاوه بر قرار دادن مقادیر بولین در جلوی کیورد if امکان استفاده از عملگرهای مقایسه‌ای همچون اپراتورهای == و =! یا سایر عملگرهای مقایسه‌ای از جمله > و < نیز جلوی این دستور شرطی برای دولوپرها فراهم شده است.

نکته : مسئلهٔ قابل‌توجه اینکه بسیاری از دولوپرهای مبتدی عملگر انتساب = را اشتباهاً به جای عملگر == (تساوی) مورد استفاده قرار می‌دهند. در واقع، عملگر تساوی به مقایسۀ تساوی مقدار و نوع دو عملوند می‌پردازد اما این در حالی است که عملگر انتساب به منظور انتساب شیئِ سمت راست عملگر به متغیری در سمت چپ آن به کار گرفته می‌شود.

علاوه بر اپراتورهای مقایسه‌ای می‌توانیم از عملگرهای بولینی نیز برای مقایسۀ مقادیر بولین استفاده کنیم که این نوع عملگرها همچون اپراتورهای مقایسه‌ای در نهایت یک مقدار بولین True یا False را برمی‌گردانند که در ادامه به بررسی چند مورد از آن‌ها می‌پردازیم.

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

نتیجهعبارت
TrueTrue and True
FalseTrue and False
FalseFalse and True
FalseFalse and False

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

نتیجهعبارت
TrueTrue or True
TrueTrue or False
TrueFalse or True
FalseFalse or False

عملگر  not
بر خلاف عملگرهای and و or این عملگر یک عملوند می‌گیرد و تنها کاری که not انجام می‌دهد این است که مقدار بولینی مخالف مقدار ارزیابی‌شده برای عملوند خود را ریترن می‌کند به طوری که ارزیابی این عملگر را می‌توان به صورت زیر خلاصه کرد:

نتیجهعبارت
Falsenot True
Truenot False

عملگر not را می‌توانیم به صورت پشت‌سرهم نیز بیاوریم به طوری که مثلاً خواهیم داشت :

>>> not not not not True
True

توجه داشته باشیم که عملوندهای این عملگرها می‌توانند هر دستوری با مقدار ارزیابی‌شده به صورت بولین باشند که برای مثال دستورات زیر را می‌توانیم در نظر بگیریم:

>>> (3 > 4) or (5 > 4)
True
>>> (4 < 5) and (5 < 6)
True
>>> not "a" == "A"
True

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

age = int(input("Please enter your age-->"))
if age >= 20:
    if age < 30:
        print("You're in your twenties,")
        print("Enjoy it!")

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

حال اسکریپت این برنامه را در فایلی به نام nestedIf.py ذخیره کرده و آن را اجرا می‌کنیم و همان‌طور که اشاره کردیم، در صورتی که عدد ورودی خارج از بازۀ اعداد ۲۰ تا ۳۰ قرار داشته باشد، برنامه هیچ خروجی نخواهد داشت اما با وارد کردن عددی در بازۀ مذکور، خروجی برنامه به صورت زیر خواهد بود:

Please enter your age-->27
You're in your twenties,
Enjoy it!

همان‌طور که ملاحظه می‌شود، عددی در بازۀ ۲۰ تا ۳۰ وارد کرده‌ایم و بدین ترتیب دستورات بدنۀ شرط اول اجرا شده و دستور شرط داخلی نیز برقرار بوده و از همین روی دستورات بدنۀ آن اجرا می‌شود که در نهایت استرینگ‌های مربوطه در خروجی چاپ می‌شوند.

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

حال اگر بخواهیم برنامۀ فوق را با استفاده از تنها یک دستور شرطی پیاده‌سازی کنیم، لازم است تا کد مثال قبل بدین صورت تغییر دهیم:
age = int(input("Please enter your age-->"))
if age >= 20 and age < 30:
        print("You're in your twenties,")
        print("Enjoy it!")

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

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

if conditions:
    # statement 1
else:
    # statement 2

توجه داشته باشیم که سربند if و else هر دو در یک بلوک قرار دارند و بلوک کدهای بدنۀ else همچون دستورات بدنۀ if نسبت به سربند آن تورفتگی دارند. برای مثال، برنامۀ زیر را در نظر می‌گیریم:

if not 1:
    print("True")
else:
    print("False")

همان‌طور که در آموزش‌های گذشته بیان کردیم، مفسر پایتون عدد یک را برابر با مقدار True ارزیابی می‌کند و بنابراین دستور not 1 مقدار بولینی معادل False ارزیابی می‌شود بدین معنی که نتیجۀ بررسی دستور if برابر با False می‌باشد و می‌دانیم که بدنۀ این شرط تنها در صورتی اجرا می‌شود که مقدار آن برابر با True ارزیابی شود که از همین روی مفسر پایتون به سراغ بدنۀ else رفته و دستورات داخل آن را اجرا می‌کند. حال اسکریپت فوق را در فایلی به نام ifElse.py ذخیره کرده و آن را اجرا می‌کنیم که در نتیجه استرینگ «False» در خروجی چاپ خواهد شد :

False

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

foodstuff = input("Please enter your choice(rice,cheese,egg)-->")
if foodstuff == "rice":
  print("It costs 10000 Tomans per Kilo.")
elif foodstuff == "cheese":
  print("It costs 5000 Tomans.")
elif foodstuff == "egg":
    print("It costs 500 Tomans")
else:
    print("I don't have in stock!")

در برنامۀ فوق از کاربر درخواست کرده‌ایم تا نام یک مادۀ غذایی را وارد کند، آنگاه مفسر پایتون بر اساس ورودی کاربر باید تصمیم بگیرد که چه پیغامی در معرض دید او قرار دهد. در واقع، مفسر پایتون در ابتدا نام مادۀ غذایی را از کاربر گرفته و آن را در متغیر foodstuff نگهداری می‌کند.

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

در ادامۀ تفسیر کد فوق باید بگوییم که مفسر پایتون به سراغ اجرای دستور if می‌رود که اگر شرط این دستور برقرار باشد یا به عبارتی کاربر کلمۀ «rice» را وارد کرده باشد استرینگ «.It costs 10000 Tomans per Kilo» را در خروجی چاپ می‌کند اما اگر شرط if برقرار نباشد، مفسر به سراغ دستور بعدی می‌رود که دستور elif است و بدین صورت تفسیر می‌شود که اگر شرط if برقرار نبود، شرط مربوط به دستور elif چک می‌شود و در صورت برقرار بودن این شرط، دستورات بدنۀ آن اجرا می‌شود.

بنابراین همچون دستور if اگر عبارت جلوی دستور elif برابر با مقدار True ارزیابی شود، بدنۀ آن اجرا می‌شود که در مثال فوق اگر کاربر کلمۀ «cheese» را وارد کند، استرینگ «.It costs 5000 Tomans» در خروجی چاپ می‌شود و در غیر این صورت نیز مفسر باز هم به سراغ دستورات بعدی می‌رود که در این برنامه دستور بعد نیز elif است و شرط آن بررسی می‌شود تا در صورت برقرار بودن شرط مذکور، دستورات مربوطه اجرا شود و در غیر این صورت مفسر به سراغ دستور بعد می‌رود که در این مثال دستور else است.

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

============ RESTART: D:/ mypgr/Python/ifElse.py ============
Please enter your choice(rice,cheese,egg)-->egg
It costs 500 Tomans.

============ RESTART: D:/ mypgr/Python/ifElse.py ============
Please enter your choice(rice,cheese,egg)-->meat
I don't have in stock!

 

همان‌طور که مشاهده می‌کنید، در اجرای اول استرینگ «egg» را به عنوان ورودی به برنامه داده‌ایم که منجر به اجرای دستور قرار گرفته در elif دوم شده و استرینگ «.It costs 500 Tomans» در خروجی چاپ می‌شود اما در اجرای دوم استرینگ «meat» را به عنوان ورودی داده‌ایم که این مقدار برای برنامه تعریف‌ نشده است به طوری که هیچ یک از شروط if و elif برقرار نشده و از همین روی مفسر به سراغ دستور else رفته و دستورات داخل آن را اجرا می‌کند که در نهایت منجر به چاپ استرینگ «!I don’t have in stock» در خروجی می‌شود.