پایتون برای همه | 23 | میانبر در بررسی عبارت‌های منطقی، واژگان و تمرین‌های فصل ۳

پایتون برای همه پایتون 3

اشتراک وفاداری (ماهی یک چایی)

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

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

x >= 2 and (x/y) > 2

در این مثال اگر قسمت اول عبارت (قبل از and) غلط از آب در بیاید، پایتون قسمت دوم عبارت یعنی ‎(x/y) > 2 را نادیده می‌گیرد، چرا که به هر حال – با توجه به and – پاسخ کل عبارت «False» خواهد بود.

زمانی که پایتون تشخیص می‌دهد که محاسبه‌ی ادامه‌ی عبارت، تاثیری در نتیجه نهایی عبارت ندارد، از حساب کردن ادامه‌ی عبارت منطقی دست می‌کشد. به این حالت short-circuiting یا میانبر زدن در ارزیابی می‌گویند.

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

>>> x = 6
>>> y = 2
>>> x >= 2 and (x/y) > 2
True
>>> x = 1
>>> y = 0
>>> x >= 2 and (x/y) > 2
False
>>> x = 6
>>> y = 0
>>> x >= 2 and (x/y) > 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>>

چه اتفاقی افتاد؟ بخش اولِ قطعه کد سوم صحیح است پس پایتون به سراغ قسمت دوم می‌رود و با معادله‌ای روبرو می‌شود که از نظر منطقی جور در نمی‌آید. تقسیم عدد بر صفر! و خب خطا صادر می‌شود. در قطعه کد اول x >= 2 صحیح است و قسمت دوم یعنی ‎(x/y) > 2 هم همینطور، در نتیجه جواب این عبارت‌های منطقی هم صحیح است. در قطعه کد دوم، قسمت اول عبارت غلط است و پایتون بدون در نظر گرفتن قسمت دوم، حکم «غلط» بودن کلِ عبارت را صادر می‌کند. اینجاست که پایتون در ارزیابی عبارت، میانبر می‌زند.

حالا کمی فسفر بسوزانیم. چطور می‌توانیم از این رفتار پایتون، مانع خطا گرفتن در خروجی شویم؟ یعنی به پایتون بگوییم که اگر y برابر با صفر بود، به سراغ حل معادله دومی نرود و نتیجه را صادر کند؟ خب کافی‌ست که در سمت چپِ قسمتِ دومِ عبارت بالا، همین شرط را اضافه کنیم:

>>> x = 1
>>> y = 0
>>> x >= 2 and y != 0 and (x/y) > 2
False
>>> x = 6
>>> y = 0
>>> x >= 2 and y != 0 and (x/y) > 2
False
>>> x >= 2 and (x/y) > 2 and y != 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>>

در عبارت منطقیِ اول x >= 2 غلط است در نتیجه ارزیابی در همانجا و رسیدن به عملگر and پایان یافته و نتیجه‌ی «غلط» صادر می‌شود. در دومین عبارت منطقی x >= 2 صحیح، ولی y != 0 غلط است در نتیجه پایتون به ارزیابی بخش سوم عبارت یعنی (x/y) نمی‌رسد و مقدار «غلط» را بازمی‌گرداند.

در عبارت منطقی سوم y != 0 بعد از (x/y) قرار گرفته است در نتیجه ارزیابی عبارت با رسیدن پایتون به (x/y) به مشکل برخورد کرده و خطا صادر می‌شود.

در قطعه کد دوم، ما از y != 0 به عنوان محافظ برای اجرای صحیح و بدون خطای (x/y) استفاده می‌کنیم تا مطمئن باشیم که y برابر با ‎0‎ نیست و در نتیجه برنامه به خطا برخورد نمی‌کند.

واژگان فصل

بدنه کد / body:
سلسله گزاره‌هایی که در یک گزاره‌ی مرکب قرار دارند.

بولی / boolan expression:
عبارتی که مقدار آن یا True است یا False.

شاخه / branch:
سلسله‌ای از گزاره‌هایی که بخشی از گزاره‌ی شرطی را تشکیل می‌دهد.

شروط زنجیروار / chained conditional:
یک گزاره‌ی شرطی با چندین شاخه‌ی مجزا.

عملگر مقایسه / comparison operator:
یکی از عملگرهایی که عملوندهای خود را مقایسه می‌کند: ‎==‎ و ‎!=‎ و ‎>‎ و ‎<‎ و ‎>=‎ و ‎<=‎

گزاره‌ی شرطی / conditional statement:
گزاره‌ای که کنترل جریان اجرا را با توجه به شرایط در دست می‌گیرد.

شرط / condition:
یک عبارت بولی در یک گزاره‌ی شرطی که تعیین کننده‌ی اجرا شدن یا نشدن یک شاخه است.

گزارهای مرکب / compound statement:
یک گزاره که شامل یک هدر و یک بدنه می‌شود. هدر با دو نقطه (:) تمام می‌شود و بدنه نسبت به گزاره تو رفتگی دارد.

الگوی محافظ / guardian pattern:
گاهی ما یک عبارت منطقی را با توجه به رفتار «میانبر» در پایتون برای جلوگیری از ایجاد مشکل در برنامه استفاده می‌کنیم. این عبارت منطقیِ اضافی، الگوی محافظ را می‌سازد.

عملگرهای منطقی / logical operator:
یکی از عملگرهایی که با یک عبارت بولی ترکیب می‌شود: and یا or یا not.

شرط تو در تو / nested conditional:
یک گزاره شرطی که در یک شاخه از یک گزاره‌ی شرطی دیگر ظاهر می‌شود.

تِرِیسْ‌بک / traceback:
خروجی چاپ‌شده در زمان وقوع یک استثنا، از لیست توابعی که اجرا شده است.

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

تمرین‌ها

۱) برنامه‌ای که پیش‌تر برای تعیین دستمزد نوشتید را بازنویسی کنید به صورتی که کارمندهایی که بیش از ۴۰ ساعت کار کرده‌اند به ازای هر ساعت اضافه، یک و نیم برابر حقوق دریافت کنند. به عبارتی اگر ۴۵ ساعت کار کرده، ۴۰ ساعت حقوق معمول و ۵ ساعت حقوق با ضریب یک و نیم دریافت کند.

Enter Hours: 45
Enter Rate: 10
Pay: 475.0

۲) حالا با استفاده از try و expect برنامه را برای دریافت ورودی غیر از عدد و نشان دادن پیغام درست به کاربر بهینه کنید. خروجی غیر عددی مثل nine بایستی شبیه به خطوط زیر باشد:

Enter Hours: 20
Enter Rate: nine
Error, please enter numeric input
Enter Hours: forty
Error, please enter numeric input

۳) برنامه‌ای بنویسید که عددی بین 0.0 و 1.0 دریافت کند. اگر عدد خارج از این محدوده بود، خطا صادر نماید و برای اعداد بین این محدوده نمره به سبک زیر چاپ کند:

Score   Grade
>= 0.9     A
>= 0.8     B
>= 0.7     C
>= 0.6     D
< 0.6    F
~~~

خروجی با توجه به ورودی‌های نمونه بایستی به این صورت باشد:

Enter score: perfect
Bad score
Enter score: 10.0
Bad score
Enter score: 0.75
C
Enter score: 0.5
F

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

این نوشته تحت مجوز کرییتیو کامنز BY – NC و حمایت موسسه تحقیقاتی رامونا ارائه می‌شود. شما می‌توانید با توجه به مفاد این گواهی از آن استفاده کنید.

2 دیدگاه

  1. سلام خیلی خوبه خسته نباشی ایمان :**
    سوالی داشته باشیم همینجا مطرح کنیم یا ایمیل بزنیم یا حضوری بیاییم ؟ :دی

    • نوکرتم دادا
      حضوری همینجا ایمیل بزن ‎:D

      هر جور راحت‌تری. هر مدل ارتباطی با تو برای ما غنیمت است ای دُرِ گران :دی

پاسخ دهید

ایمیل شما نمایش داده نخواهد شد