شرطها
تا اینجا برنامههای ما همیشه یک مسیر را میرفتند. از این فصل به بعد برنامه میتواند تصمیم بگیرد. این نقطهای است که کد شما از یک ماشینحساب به یک برنامه واقعی تبدیل میشود.
۱. نوع bool و عملگرهای مقایسهای
در فصل اول گفتیم که bool نوعی است که فقط دو مقدار دارد:
True و False. حالا میبینیم این مقدارها از کجا
میآیند. هر مقایسه یک مقدار بولی تولید میکند.
# A comparison is an expression whose value is either True or False.
print(5 > 3) # True
print(5 < 3) # False
print(5 == 5) # True -> '==' asks "are they equal?"
print(5 != 5) # False -> '!=' asks "are they different?"
print(5 >= 5) # True
print(5 <= 4) # False
# Careful: '=' stores a value, '==' compares two values.
age = 18 # assignment
print(age == 18) # comparison -> True
# The result of a comparison is a real value of type bool.
result = 10 > 2
print(result, type(result))
مقایسه و نوع بولی: نمونه 01_booleans.py
True False True False True False True True <class 'bool'>
| عملگر | سؤالی که میپرسد | مثال درست |
|---|---|---|
== | آیا برابرند | 5 == 5 |
!= | آیا نابرابرند | 5 != 3 |
> | آیا بزرگتر است | 5 > 3 |
< | آیا کوچکتر است | 3 < 5 |
>= | آیا بزرگتر یا مساوی است | 5 >= 5 |
<= | آیا کوچکتر یا مساوی است | 4 <= 5 |
خط آخر مثال مهم است: نتیجه مقایسه یک مقدار واقعی است که
میشود آن را در متغیر ذخیره کرد، چاپ کرد و نوعش را پرسید. یعنی
True چیزی از جنس داده است، درست مثل عدد ۵.
۲. تفاوت مساوی و دو مساوی
یک علامت مساوی یعنی بریز داخل:
age = 18 مقدار ۱۸ را در متغیر میگذارد. دو علامت مساوی
یعنی آیا برابر است: age == 18 یک سؤال
میپرسد و جوابش True یا False است. اگر در
یک if اشتباهی یکی بنویسید، پایتون خطای نگارشی میدهد.
خوشبختانه اینجا پایتون سختگیر است و اجازه نمیدهد این اشتباه
بیسروصدا بماند.
۳. اولین if
دستور if میگوید: اگر این شرط درست بود، این چند خط را اجرا
کن؛ وگرنه از رویشان بپر.
# The indented block runs ONLY when the condition is True.
age = 19
if age > 18:
print('Welcome') # this line belongs to the if (4 spaces)
print('End of the program') # this line always runs (not indented)
سادهترین شرط: نمونه 02_first_if.py
Welcome End of the program
شرح مثال
- ساختار همیشه همین است: کلمه
if، بعد شرط، بعد دونقطه. - فراموش کردن دونقطه رایجترین خطای نگارشی این فصل است.
- خطهایی که تو رفتهاند متعلق به
ifهستند. خط آخر تو نرفته، پس همیشه اجرا میشود. - پرانتز دور شرط ضرورتی ندارد. در بعضی زبانها اجباری است، در پایتون نه.
۴. تورفتگی
در بیشتر زبانهای برنامهنویسی، بلوک کد را با آکولاد مشخص میکنند و فاصله
ابتدای خط فقط برای زیبایی است. در پایتون اینطور نیست:
تورفتگی بخشی از دستور زبان است. پایتون از روی فاصله
ابتدای خط میفهمد کدام خطها داخل if هستند.
- استاندارد پایتون چهار فاصله است. VS Code وقتی بعد از دونقطه اینتر بزنید، خودش این کار را میکند.
- تب و فاصله را قاطی نکنید. ظاهرشان یکی است ولی پایتون فرقشان را میفهمد و خطای عجیب میدهد.
- همه خطهای یک بلوک باید دقیقاً یک اندازه تو رفته باشند.
- اگر تورفتگی را فراموش کنید، خطای
IndentationErrorمیگیرید.
چون برنامهنویسها به هر حال کدشان را تو میبردند تا خوانا شود. طراح پایتون گفت اگر همه این کار را میکنند، پس بگذاریم همین معنی هم داشته باشد و از شر آکولاد خلاص شویم. نتیجه این است که کد همه برنامهنویسهای پایتون شبیه هم و مرتب است.
۵. else
else یعنی «در غیر این صورت». بلوکی که وقتی شرط نادرست باشد
اجرا میشود.
# Reading a number and deciding with it.
user_input = input('Age: ')
age = int(user_input)
if age >= 18:
print('Welcome!')
else:
print('Access denied.')
شرط روی ورودی کاربر: نمونه 04_age_check.py
Age: 15 Access denied.
شرح مثال
elseشرط ندارد، فقط دونقطه دارد.elseباید دقیقاً همترازifخودش باشد، نه تو رفتهتر.- حتماً یکی از دو بلوک اجرا میشود، هرگز هر دو و هرگز هیچکدام.
- به خاطر داشته باشید که
inputرشته میدهد، پس اگر میخواهید عددی مقایسه کنید باید اولintبزنید. اگر یادتان برود،'15' >= 18خطایTypeErrorمیدهد.
۶. مقایسه رشتهها
# Strings are compared character by character, and the comparison is
# case sensitive: 'Kadoos' and 'kadoos' are NOT equal.
name = input('Enter your name: ')
if name == 'kadoos':
print('Welcome', name)
else:
print('Access denied!')
# To ignore the capitals, lower the text before comparing.
if name.lower() == 'kadoos':
print('(case-insensitive check) Welcome', name)
مقایسه متن: نمونه 05_compare_strings.py
شرح مثال
- مقایسه رشتهها به حروف بزرگ و کوچک حساس است.
'Kadoos'با'kadoos'برابر نیست. - راه حل استاندارد: پیش از مقایسه، هر دو طرف را با
lower()کوچک کنید. - در کار واقعی معمولاً
strip()هم اضافه میشود، چون کاربر ممکن است فاصله اضافه تایپ کند:name.strip().lower() == 'kadoos'.
۷. عملگرهای منطقی
گاهی یک شرط کافی نیست. سه عملگر منطقی به ما اجازه میدهند شرطها را ترکیب کنیم.
# and -> True only when BOTH sides are True
# or -> True when AT LEAST ONE side is True
# not -> reverses the value
age = 20
has_ticket = True
print(age >= 18 and has_ticket) # True
print(age >= 18 or has_ticket) # True
print(not has_ticket) # False
# A very common pattern: is a value inside a range?
score = 15
if score >= 10 and score <= 20:
print('Valid score')
# Python also allows the mathematical way of writing it:
if 10 <= score <= 20:
print('Valid score (chained comparison)')
سه عملگر منطقی: نمونه 06_and_or_not.py
| عملگر | نتیجه True است وقتی | یادآوری فارسی |
|---|---|---|
and | هر دو طرف درست باشند | و |
or | دستکم یک طرف درست باشد | یا |
not | طرف مقابلش نادرست باشد | نقیض |
شرح مثال
- هر طرف
andوorباید یک شرط کامل باشد. نوشتنif score >= 10 and <= 20غلط است. - پایتون امکان زیبایی دارد که اکثر زبانها ندارند:
10 <= score <= 20دقیقاً همانطور که در ریاضی مینویسیم کار میکند و خواناتر است. - وقتی متغیر خودش بولی است، ضرورتی ندارد بنویسید
has_ticket == True. خودhas_ticketکافی است. برنامهنویسهای حرفهای شکل کوتاه را مینویسند.
۸. ورود با نام کاربری و رمز
# Constants are written in CAPITALS by convention: they are not meant to change.
USERNAME = 'admin'
PASSWORD = 'admin'
user = input('Enter username: ')
password = input('Enter password: ')
# Both conditions must be true, so we use 'and'.
if user == USERNAME and password == PASSWORD:
print('Welcome,', user)
else:
print('Access denied!')
ورود به سیستم: نمونه 07_login.py
شرح مثال
- نامهای با حروف بزرگ یعنی ثابت: مقداری که قرار نیست در طول برنامه عوض شود. این فقط یک قرارداد است و پایتون جلوی تغییرشان را نمیگیرد، ولی همه برنامهنویسها آن را رعایت میکنند.
- چون هر دو شرط باید برقرار باشند،
andبه کار رفته است. - در برنامه واقعی هرگز رمز عبور را به این شکل و به صورت متن ساده داخل کد نمینویسند. در فصل سی و هشتم میبینید که رمز را باید درهمسازی کرد و در پایگاه داده نگه داشت.
۹. چند مقدار مجاز با or
# Accepting several valid names with 'or'.
name = input('Enter your name: ')
if name == 'alireza' or name == 'omid' or name == 'arad':
print('Welcome', name)
else:
print('Access denied!')
# A shorter and much more readable way (we will study lists in session 09):
if name in ('alireza', 'omid', 'arad'):
print('(short version) Welcome', name)
چند نام مجاز: نمونه 08_multiple_names.py
شرح مثال
- در شکل اول، هر بار باید کل مقایسه را بنویسید. نوشتن
if name == 'alireza' or 'omid'یک اشتباه بسیار رایج است که خطا نمیدهد ولی همیشه درست حساب میشود، چون رشته ناخالی در پایتون معادلTrueاست. - شکل دوم با
inهم کوتاهتر است و هم خواناتر. اضافه کردن نام چهارم فقط یک کلمه است. - آنچه داخل پرانتز آمده یک تاپل است که در فصل چهاردهم میبینید. با لیست هم دقیقاً همین کار را میشود کرد.
۱۰. زوج یا فرد، مثبت یا منفی
حالا عملگر باقیمانده فصل دوم به کار میآید. عددی زوج است که باقیماندهاش بر ۲ صفر باشد.
# A number is even when the remainder of its division by 2 is zero.
user_input = input('Please enter a number: ')
number = int(user_input)
if number % 2 == 0:
print('Even')
else:
print('Odd')
زوج یا فرد: نمونه 09_even_or_odd.py
# Deciding on the sign of a number.
user_input = input('Enter a number: ')
number = float(user_input)
if number >= 0:
print('+')
else:
print('-')
علامت عدد: نمونه 10_positive_or_negative.py
در مثال دوم دقت کنید که صفر در دسته مثبتها افتاده است، چون شرط
>= است. اگر بخواهید صفر حالت سومی داشته باشد، به
elif نیاز دارید که موضوع فصل بعد است.
۱۱. شرط روی یک کاراکتر
# A condition can be written on a single character of a string.
name = input('Enter your name: ')
# name[0] is the first character. An empty answer would crash the program,
# so we check the length first.
if len(name) > 0 and name[0].lower() == 's':
print('Salam')
else:
print('Hello')
شرط روی حرف اول: نمونه 11_first_letter.py
شرح مثال
- اگر کاربر چیزی وارد نکند و فقط اینتر بزند،
nameرشته خالی میشود وname[0]خطایIndexErrorمیدهد. شرطlen(name) > 0جلوی این را میگیرد. - این کار به یک ویژگی مهم
andتکیه دارد: پایتون طرف راست را فقط وقتی بررسی میکند که طرف چپ درست باشد. به این ارزیابی کوتاه میگویند. اگر طول صفر باشد، پایتون اصلاً سراغname[0]نمیرود. - ترتیب دو شرط را عوض نکنید. اگر بنویسید
name[0].lower() == 's' and len(name) > 0، برنامه روی ورودی خالی خراب میشود.
۱۲. ترکیب and و or با پرانتز
# Combining 'and' and 'or'. The parentheses make the intention clear:
# (male AND older than 15) OR (female AND older than 9)
gender = input('Enter the gender (male / female): ')
age_input = input('Enter the age: ')
age = int(age_input)
if (gender == 'male' and age > 15) or (gender == 'female' and age > 9):
print('She or he is ready to pray!')
else:
print('Not ready yet.')
ترکیب شرطها: نمونه 12_prayer_age.py
شرح مثال
- وقتی
andوorبا هم میآیند،andاولویت بالاتری دارد. یعنی حتی بدون پرانتز هم همین نتیجه به دست میآمد. - با این حال پرانتزها را نگه میداریم، چون خواننده کد ضرورتی ندارد جدول اولویت را حفظ باشد. همان قانون فصل دوم: هر جا شک هست، پرانتز بگذارید.
- ساختار شرط را به زبان ساده برای خودتان بازگو کنید تا از درستی منطق آن مطمئن شوید: «اگر (مرد است و سنش بیشتر از ۱۵ سال است) یا (زن است و سنش بیشتر از ۹ سال است)». این روش به شما کمک میکند منطق شرط را پیش از اجرای کد بررسی کنید.
پوشه S04-conditionals شامل نمونههای
01_booleans.py تا 12_prayer_age.py.
خلاصه فصل
| ابزار | وظیفه آن |
|---|---|
== != > < >= <= | شش عملگر مقایسهای. نتیجهشان بولی است |
= در برابر == | اولی مقداردهی، دومی مقایسه |
if شرط: | اجرای بلوک فقط وقتی شرط درست است |
else: | بلوکی که وقتی شرط نادرست است اجرا میشود |
| تورفتگی | چهار فاصله. در پایتون بخشی از دستور زبان است |
and or not | ترکیب و نقیض شرطها |
10 <= x <= 20 | مقایسه زنجیرهای، خواناتر از دو شرط با and |
x in (a, b, c) | جای چند or پشت سر هم |
| ارزیابی کوتاه | اگر طرف چپ and نادرست باشد، طرف راست بررسی نمیشود |
تمرینهای فصل چهار
- یک عدد بگیرید و فقط با
ifوelseبگویید مثبت است یا نه. - دو عدد بگیرید و بزرگترشان را چاپ کنید.
- یک نمره بین ۰ تا ۲۰ بگیرید و اگر ۱۰ یا بیشتر بود
Passedو وگرنهFailedچاپ کنید. - یک سال بگیرید و بگویید کبیسه است یا نه: بر ۴ بخشپذیر باشد و بر ۱۰۰ نباشد، یا بر ۴۰۰ بخشپذیر باشد.
- نام کاربری و رمز بگیرید و فقط وقتی هر دو درست بودند اجازه ورود بدهید.
- یک کاراکتر بگیرید و با
isdigit()بگویید رقم است یا نه. - سه عدد بگیرید و بزرگترین را چاپ کنید، فقط با
ifوelseو بدون تابعmax. - سن و نوع بلیت (
normalیاstudent) را بگیرید و قیمت را چاپ کنید: دانشآموز زیر ۱۸ سال نصف قیمت و بقیه قیمت کامل.