هنر برنامه نویسی با پایتون ، بخش هشتم: اولویت یا برتری عملگرها

حاصل عبارت ساده ای چون 3*5 و یا   2+3همواره روشن و مشخص است و هرکس بدون هیچ گونه ابهامی می تواند بگوید که نتیجه عبارت اولی عدد 15 و نتیجه دومی عدد 5 است. اما حاصل عبارت  3*2+10 بسته به اینکه ابتدا عملیات ضرب انجام شود و یا عملیات جمع ، می تواند دو مقدار متفاوت باشد. چنانچه ابتدا عملیات جمع انجام  شود( 2+10=12 ) و سپس عملیات ضرب (3*12=36 ) حاصل عبارت 3*2+10 عدد 36 است اما اگر ابتدا عملیات ضرب انجام شود (3*2=6 ) و سپس عملیات جمع (6+10=16) حاصل عبارت عدد 16 است. این مثال ساده به روشنی نشان می دهد که در زبانهای برنامه نویسی  وجود قوانینی که ترتیب پردازش و اجرای عملگرهای مختلف موجود در یک عبارت را به روشنی و بدون هیچ ابهامی بیان کند ضرورتی گریزناپذیر است. در فرهنگ واژگان زبانهای برنامه نویسی به این قوانین ، اولویت یا برتری عملگرها  گفته می شود. به بیان ساده تر برتری عملگرها مجموعه‌ای از قوانین است که مشخص می‌کند هنگام ارزیابی یک عبارت معین ، کدام عملگر باید زودتر از دیگر عملگرها انجام شود. برای پیاده سازی این قوانین ، زبان برنامه نویسی به هر عملگر و یا دسته ای از عملگرها یک برتری و یا اولویت نسبت می دهد و سپس به هنگام ارزیابی یک عبارت ، عملگری که بالاترین اولویت را دارد زودتر از دیگر عملگرها پردازش می کند.  برخی از مهمترین قوانین اولویت عملگرها در زبان پایتون عبارتند از : 

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

2-    عملگر انتساب دارای پایین ترین اولویت است.

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

4-    عملگرهای حسابی ضرب ، تقسیم ، خارج قسمت صحیح و باقی مانده دارای اولویت یکسان هستند. با توجه به اینکه این عملگرها در یک دسته قرار گرفته اند و دارای اولویت یکسان هستند بنابراین در صورت ظاهر شدن همزمان در یک عبارت به ترتیب از چپ به راست ارزیابی خواهند شد.

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

6-   عملگرهای مقایسه ای دارای اولویت پایین تری نسبت به عملگرهای ریاضی هستند

7-    عملگرهای منطقی دارای اولویت پایین تری نسبت به عملگرهای مقایسه ای هستند.

8-   عملگر منطقی and دارای اولویت بالاتری نسبت به عملگر منطقی or می باشد.

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

عملگر

شرح

()

پرانتز

**

به توان رساندن

*,  ///%

عملگرهای ریاضی ضرب ، تقسیم ، خارج قسمت صحیح و باقی مانده

+-

جمع و تفریق

<<=>>=!===

عملگرهای مقایسه ای

and

عملگر منطقی and

or

عملگر منطقی or

=

عملگر انتساب















مثال : حاصل عبارت  10 - 4 * 2  چیست ؟

 حل :  این عبارت دارای دو عملگر ضرب و تفریق است که با توجه به جدول بالا ، عملگر ضرب دارای اولویت بالاتری نسبت به عملگر تفریق است پس ابتدا باید عملیات ضرب انجام شود و سپس عملیات تفریق در نتیجه :

4*2=8

10-8=2

یعنی حاصل عبارت 10 - 4 * 2 عدد 2 است

 مثال : حاصل عبارت (10 - 4) * 2 را بدست آورید.

حل :  این عبارت دارای سه عملگر ضرب ، تفریق و پرانتز است که با توجه به جدول بالا عملگر پرانتز دارای اولویت بالاتری نسبت به عملگر ضرب است پس ابتدا عبارت درون  پرانتز ارزیابی می شود و سپس عملیات ضرب در نتیجه :

10-4=6

6*2=12

یعنی حاصل عبارت (10 - 4) * 2  عدد 12 است.

 مثال : دستور print(5 * 2 // 3) چه عددی را چاپ خواهد کرد؟

حل : عبارت 5 * 2 // 3 دارای دو عملگر ضرب و خارج قسمت صحیح است که با توجه به جدول بالا در یک دسته قرار دارند و در نتیجه دارای اولویت یکسانی هستند بنابراین ترتیب ارزیابی آنها از چپ به راست می باشد در نتیجه :

5*2=10

10//3=3

یعنی با اجرای دستور دستور print(5 * 2 // 3) عدد 3 در خروجی صفحه نمایش چاپ خواهد شد.

 مثال : دستور print(5 *( 2 // 3)) چه عددی را چاپ خواهد کرد؟

حل : با توجه به جدول بالا عملگر پرانتز دارای اولویت بالاتری نسبت به عملگر ضرب است پس ابتدا عبارت درون پرانتز انجام می شود و سپس عملیات ضرب در نتیجه :

2//3=0

0*5=0

یعنی با اجرای دستور دستور print(5 * (2 // 3)) عدد 0 در خروجی صفحه نمایش چاپ خواهد شد.

 مثال : حاصل عبارت 2 ** 3 ** 2 را بدست آورید.

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

3**2=9

2**9=512

 

یعنی حاصل عبارت 2 ** 3 ** 2 عدد 512 است.

مثال : حاصل عبارت (2 ** 3) ** 2 را بدست آورید.

حل : پرانتز دارای اولویت بالاتری نسبت به عملگر توان است پس :

2**3=8

8**2=64

یعنی حاصل عبارت (2 ** 3) ** 2  عدد 64 است.

 مثال : حاصل عبارت ((((6+4)*2)-10)//2)-4*2 را بدست آورید.

حل : چنانچه در یک عبارت پرانتزهای تودرتو وجود داشته باشند ، ترتیب ارزیابی از درونی ترین پرانتز به بیرونی ترین پرانتز است به زبان ساده تر، ابتدا درونی ترین پرانتز ارزیابی خواهد شد. پس :

(6+4)=10

(10*2)=20

(20-10)=10

(10//2)=5

حال با توجه به اینکه اولویت عملگر ضرب بالاتر از عملگر تفریق است :

4*2=8

5-8=-3

یعنی حاصل عبارت ((((6+4)*2)-10)//2)-4*2عدد -3  است.

 مثال : حاصل عبارت 5 * 3 > 10 and 4 + 6 == 11 را بدست آورید.

حل : می دانیم که اولویت عملگرهای حسابی بالاتر از عملگرهای مقایسه ای است پس ابتدا عملگرهای حسابی و از چپ به راست ارزیابی خواهند شد:

5*3=15

4+6=10

در نتیجه :

15 > 10 and 10 == 11

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

پس :

True and False

 در آخرین گام عملگر منطقی and ارزیابی می شود :

True and False

 که ارزیابی عبارت منطقی True and False مقدار منطقی False خواهد بود. پس حاصل عبارت

5 * 3 > 10 and 4 + 6 == 11  مقدار منطقی False است.

 مثال : خروجی قطعه کد زیر چیست ؟

X = (5 + 3) * 2 ** 2

print(X)

حل : با توجه به اولویت عملگرها اجرای آنها به ترتیب زیر است :

5+3=8

2**2=4

X=8*4

X=32

پس مفسر پایتون با رسیدن اجرای برنامه به دستور print(X) عدد 32 را در خروجی صفحه نمایش چاپ خواهد کرد.

 

مثال : خروجی برنامه زیر چیست؟

x = 3 + 8 * 2** 3

print(x)

y= (4 * 2) + 6 / 3 - 2

print(y)

جواب : دستور print(x)  عدد 67 و دستور print(y) عدد 8 را در خروجی صفحه نمایش چاپ خواهند کرد.

 

مثال : خروجی برنامه زیر چیست ؟

 

name = "Arash"

age = 12

if name == "Arash" or name == "Arman" and age >= 11 :

    print("Hello! Welcome.")

else :

    print("Good Bye!!")

 

 

حل : عملگرهای مقایسه ای دارای اولویت بالاتری نسبت به عملگرهای منطقی هستند و اولویت عملگر منطقی and بالاتر از اولویت عملگر منطقی or است پس در عبارت موجود در بخش شرط دستور if  یعنی عبارت name == "Arash" or name == "Arman" and age >= 11

ابتدا عملگرهای مقایسه ای ارزیابی می شوند و می دانیم که نتیجه ارزیابی یک عبارت مقایسه ای مقدار منطقی درست (True) یا نادرست (ّFalse) است حال براساس داده های برنامه می دانیم که name = "Arash" و age = 12 است پس  نتیجه عبارت  name == "Arash" مقدار منطقی True ، نتیجه عبارت name == "Arman" مقدار منطقی False  و نتیجه عبارت age >= 11 مقدار منطقی True است پس  تا اینجا عبارت name == "Arash" or name == "Arman" and age >= 11 به صورت زیر ارزیابی می شود:

 

True  or  False  and True

در گام بعدی و  با توجه به اینکه عملگر and دارای اولویت بالاتری نسبت به عملگر or است پس ابتدا عملگر and ارزیابی می شود پس عبارت گام قبل یعنی True  or  False  and True به صورت زیر ارزیابی خواهد شد :

False  and  True == False

True  or  False  == True

بنابراین نتیجه عبارت name == "Arash" or name == "Arman" and age >= 11 مقدار منطقی True است بنابراین دستور     print("Hello! Welcome.")اجرا خواهد شد.


پایان بخش هشتم

خردادماه 1401 هجری خورشیدی

محمد ایزانلو

نظرات 0 + ارسال نظر
امکان ثبت نظر جدید برای این مطلب وجود ندارد.