منطق و شرط

شرط در واقع ساختاری است که اجازه ی اجرای قطعه کدی را به ازای کنترل یک عبارت منطقی می دهد. در پایتون شرط ساده با عبارت if مشخص شده و بصورت زیر اعمال می شود:

if logicalVariable:
	Code Block

متغیر منطقی چیست؟

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

عملگر های منطقی
توضیحعملگر
برابری دو عملوند ==
عدم برابر دو عملوند !=
بزرگتر >
کوچکتر <
بزرگتر یا مساوی >=
کوچکتر یا مساوی <=
و منطقی and
یا منطقی or
متمم (not) not

 

ساخت عبارات منطقی

در بالا در مورد چگونگی شکل گیری عبارات مختصر گفته شد. در اصل مقادیر منطقی اولیه با عملگرهای منطقی که در متن فوق بصورت کمرنگ نوشته شده اند بوجود آمده و با دو عملگر پررنگتر یعنی and و or ترکیب خواهند شد.

مقایسه برابری (==)

عمل مقایسه دو شی (متغیر ، عدد ، رشته یا ... ) توسط دو علامت مساوی بهم چسبیده صورت می گیرد . علامت مساوی واحد عمل نسبت دادن یک مقدار به متغییر را انجام می دهد . پس هنگام مقدار دهی یا مقایسه دقت لازمه را داشته باشید که این دو را بجای هم بکار نبرید . حاصل نتیجه تست برابر بودن دو مقدار مقدار های درست (True) یا نادرست (False) خواهد بود .

>>> 1 == 1
True
>>> 1 == 2
False

زمانی که شما از عملگر مقایسه برابری دو عبارت (==) استفاده می کنید مفسر پایتون مقدار دو طرف عملگر (عملوند) را با یکدیگر مقایسه می کند . اگر دو مقدار برابر نباشند مقدار نادرست یا False و در صورت برابری مقدار درست یا True برگشت داده می شود . در صورتی که شما از انواع مختلف اعداد استفاده کنید عمل تبدیل خودکار نوع نیز انجام می پذیرد .

>>> 1.23 == 1
False
>>> 1.0 == 1
True

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

>>> city = ["Tabriz", "Tehran", "Shiraz", "Yazd"]
>>> city2 = ["Yazd", "Shiraz", "Tabriz", "Tehran"]
>>> city == city2
False
>>> city2 = ["Tabriz", "Tehran", "Shiraz", "Yazd"]
>>> city == city2
True

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

مقایسه نابرابری (=!)

عمل مقایسه نابرابری در حقیقت متمم یا منفی شده (not) مقایسه برابری می باشد. به این ترتیب که اگر طرفین عملگر نابرابری، برابر باشند مقدار نادرست و در غیر اینصورت مقدار درست برگشت داده می شود.

>>> 3 == 3
True
>>> 3 != 3
False
>>> 5 != 4
True

فاصله گذاري بين نماد =! و يا برعكس نوشتن آن (يعني آن را به صورت != بنويسيم) يك خطاي منطقي محسوب خواهد شد كه در زمان اجرا تاثير گذار خواهد بود.

مقایسه بزرگتری و کوچکتری (< , >)

پایتون برای مقایسه دو عبارت ار لحاظ مقدار از علامت های برگرفته شده از ریاضیات استفاده می کند . شما قبلا نیز با این علایم آشنایی دارید .

>>> 5 < 3
False
>>> 10 > 2
True

با استفاده از عملگر های مقایسه ای امکان مقایسه دو رشته نیز وجود دارد . مقایسه و ارزش کاراکتر ها بر حسب توالی و ترتیب کاراکتر ها می باشد . کم ارزش ترین کاراکتر حرف بزرگ "A" می باشد . و بقیه کاراکتر های حروف بزرگ از حرف "A" بزرگتر هستند و "Z" از بقیه حروف بزرگ زبان انگلیسی ارزش بیشتری دارد . حروف کوچک انگلیسی ارزش بیشتری نسبت به حروف بزرگ دارند . یعنی کاراکتر "a" از همه کاراکتر های بزرگ با ارزش تر می باشد . دلیل این امر کد های اسکی و بیشتر بودن کد اسکی حروف کوچک می باشد . پس "z" پر ارزش ترین و "A" کم ارزش ترین کاراکتر موجود می باشد .

>>> “a” > “b”
False
>>> “A” > “b”
False
>>> “A” > “a”
False
>>> “b” > “A”
True
>>> “Z” > “a”
False

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

عملگر متمم (not)

زمانی که شما حاصل منطقی یک عبارت را محاسبه می کنید قصد دارید برای مثال از درست بودن آن مطلع شوید . امکان دارد بسته به شرایط برنامه هدف شما تشخیص عدم درست بودن یا متمم آن یعنی not True باشد . عملگر یکتایی not فقط بر روی یک عملوند اجرا شده و نتیجه مخالف ارزش منطقی آن را برگشت می دهد .

>>> not True
False
>>> not 5
False
>>> not 0
True
>>> not 5 > 2
False

 

عملگر and

ممکن است در برنامه ای قصد برنامه نویس اطلاع از ترکیب چندین عبارت منطقی باشد تا بدین ترتیب برنامه بتواند مقایسه هایی بسیار پیچیده را انجام داده و در نتیجه تصمیمات درست تری اتخاذ کند . برای این منظور دو عملگر بسیار پرکاربرد موجود می باشد . اولین عملگر موجود ، عملگر and (و منطقی) می باشد . این عملگر تنها در حالتی به مقدار درست منجر می شود که هر دو عملوند آن حامل مقادیر درست باشند . عملکرد این عملگر در عبارت p and q در جدول زیر مشاهده می شود:

چگونگی عملکرد and
andqp
F F F
F F T
F T F
T T T

عملگر or

این عملگر تقریباً عکس and نتیجه می دهد یعنی در همه حالات بجز حالتی که هر دو عملوند آن مقدار غلط داشته باشند منتج به مقدار درست خواهد شد. مقدار نهایی عبارت p or q را در زیر می بینید:

چگونگی عملکرد or
orqp
F F F
T F T
T T F
T T T

با توضیح مختصری که از منطق در پایتون داده شد اکنون می توانیم چیزی را که مد نظر داریم از شروط بخواهیم.

(عبارات شرطی (تصمیم گیری

if ساده

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

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

Val = raw_input("enter a number: ")
Val = int(Val)

if Val > 0 :
    print "Entered value is positive!"
if Val < 0 :
    print "Entered value is negative!"

خروجی:

enter a number: -32
Entered value is negative!
enter a number: 24
Entered value is positive!
>>> 

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

ترکیب if و elif

اگر ما if را معادل اگر بگیریم elif هم معنی واژه ای مثل و اگر نه خواهد بود . این ترکیب با if شروع شده و با elif ها ادامه می یابد . در این حالت ابتدا شرط if اصلی تست می گردد . در صورت درست بودن شرط قطعه کد مربوطه اجرا شده و برنامه بدون تست شرط سایر elif ها به روند عادی اجرا ادامه می دهد و در صورتس که شرط نادرست باشد elif بعدی مورد پردازش قرار خواهد گرفت . تا زمانی که یکی از مقادیر شرطی elif معادل True باشد . ناگفته نماند که این دستور (elif) یک عضو از دستور if می باشد و خود بطور جداگانه کاربردی ندارد .

if <شرط>:
	Code Block 1
elif <شرط دوم>:
	Code Block 2
elif <شرط سوم>:
	Code Block 3
....

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

حد اکثر یکی از این شرطها در یک زمان برقرار باشد.

اکنون مثال قبلی را که مثالی ساده بود توسط این روش باز نویسی می کنیم:

Val = raw_input("enter a number: ")
Val = int(Val)

if Val > 0 :
    print "Entered value is positive!"
elif Val < 0 :
    print "Entered value is negative!"

البته این امر در این برنامه تقریباً تاثیری ندارد اما در مثالهای بزرگت و پیچیده تر آخر فصل با این امر بهتر مواجه خواهیم شد .

عبارت else

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

Val = raw_input("enter a number: ")
Val = int(Val)

if Val > 0 :
    print "Entered value is positive!"
elif Val < 0 :
    print "Entered value is negative!"
else :
    print "Entered value is zero"

خروجی:

enter a number: 0
Entered value is zero 

مثالهای عملی

مثال 1: تبدیل شماره روز به تاریخ

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

1  # The program taking day number and returns which day it is in jalali calendar!
2
3  day = input("Enter day number: ")
4   
5  yLen = 365
6
7  mDay = 0
8  month = 0
9  #if the day is in first half of the year
10 if 0< day <= 186:
11    month = day / 31 + (day % 31 > 0)
12    mDay = day % 31
13
14 #if the day in the second half of the year
15 elif 186 < day <=365:
16    day -= 186
17    month = day / 30 + (day % 30 >0) + 6
18    mDay = day % 30
19  #day out of year
20 else:
21    print "Bad day number entered"
22
23 print "in jalali calendar ---->" ,month, ".", mDay 
 

در خطوط 11 و 17 چون از تقسیم صحیح استفاده شده است باقیمانده و اعشار در نظر گرفته نمی شود؛ پایتون خودبخود برای این عمل مثل جزء صحیح عمل کرده و حاصل را به طرف پایین گرد می کند. من با جمع بستن عبارت منطقی کاری شبیه به تابع Ceiling ریاضی انجام دادم و تقسیم را به طرف بالا گرد کردم. عبارات داخل پرانتز مقدار منطقی است که در صورت وجود باقیمانده در تقسیم مقدار 1 و در غیر این صورت صفر خواهد بود.

خروجی برنامه:

>>> 
Enter day number: 366
Bad day number entered
in jalali calendar ----> 0 . 0

>>> 
Enter day number: 56
in jalali calendar ----> 2 . 25

>>> 
Enter day number: 323
in jalali calendar ----> 11 . 17
>>> 

صفحه قبلی: پایتون
صفحه بعدی: PyGTK