در آموزشهای گذشته به نحوۀ پیادهسازی و تعریف دستورات شرطی پرداخته و دیدیم که مفسر پایتون در صورت برقرار بودن چه شرایطی وارد بدنۀ داخلی آنها شده و دستورات مربوطه را اجرا میکند. حال در این آموزش قصد داریم تا ساختاری تحت عنوان Ternary Operator را معرفی کرده و ببینیم چگونه میتوان با بهکارگیری آن دستورات شرطی سادهتر و در عین حال کوتاهتری پیادهسازی کرد.
طراحان زبان برنامهنویسی پایتون امکان بهکارگیری ساختار Ternary Operator را از نسخۀ 2.5 Python به بعد به این زبان افزودند که در صورت استفادۀ درست و بهجا از آن میتوان سورسکدی تمیز با قابلیت خوانایی بالا توسعه داد مضاف بر اینکه برای پیادهسازی این مفهوم کیورد خاصی تعریف نشده است بلکه روشی به منظور پیادهسازی یکسری دستور شرطی به شکلی سادهتر بوده که فرم کلی آن نیز به صورت زیر میباشد:
whenTrue if condition else whenFalse
در تفسیر اسکریپت فوق باید گفت که در ابتدا دستورات مربوط به بدنۀ داخلی if
نوشته شده سپس کیورد if
درج میشود و در ادامه شرط مد نظر درج شده و به دنبال آن کیورد else
و در نهایت دستورات مرتبط با بدنۀ داخلی else
نوشته میشوند به طوری که در صورت برقرار بودن شرط مورد نظر، دستور مرتبط با عبارت whenTrue
اجرا شده و در غیر این صورت دستور نوشتهشده در جایگاه whenFalse
اجرا میگردد. برای درک بهتر نحوۀ سادهسازی دستورات شرطی با این روش، مثال زیر را مد نظر قرار میدهیم:
a = 2
b = 3
if a > b:
print("a is greather than b")
else:
print("b is greather than a")
در کد فوق، از روش رایج به منظور تعریف دستورات شرطی استفاده کردهایم که در آن دو آبجکت از جنس عدد صحیح تعریف کرده و هر یک را به ترتیب به متغیرهایی تحت عناوین a
و b
منتسب نمودهایم و در ادامه دستور if
را تعریف کردهایم بدین صورت که گفتهایم چنانچه مقدار اختصاصیافته به متغیر a
بزرگتر از مقدار منتسب به متغیر b
باشد، شرط برقرار بوده و دستورات داخلی آن اجرا شود که در صورت برقرار بودن شرط استرینگ «a is greather than b» و در غیر این صورت استرینگ «b is greather than a» چاپ میشود که نتیجۀ حاصل از اجرای کد فوق در خروجی به صورت زیر میباشد:
b is greather than a
حال اگر بخواهیم دستورات شرطی فوق را بر اساس سینتکس معرفیشده در ابتدای آموزش تحت عنوان Ternary Operator به صورت سادهتری پیادهسازی کنیم، خواهیم داشت:
print("a is greather than b") if a > b else print("b is greather than a")
همانطور که میبینیم، دستورات فوق را تنها در یک سطر نوشته و به شکل خواناتری پیادهسازی نمودیم و در تفسیر آن به راحتی میتوان گفت که اگر مقدار منتسب به متغیر a
بزرگتر از مقدار اختصاصیافته به متغیر b
باشد، استرینگ «a is greather than b» و در غیر این صورت استرینگ «b is greather than a» در خروجی چاپ گردد.
نحوۀ سادهسازی دستورات شرطی با بهکارگیری آبجکتی از دیتا تایپ تاپل
با استفاده از دیتا تایپ تاپل نیز میتوان دستورات شرطی را به صورت خلاصهتری تعریف نمود که در ادامه به بررسی نحوۀ پیادهسازی آن میپردازیم. در این روش، دستورات مربوط به بدنۀ داخلی else
به عنوان اِلِمان اول از آبجکت تاپل و دستورات مربوط به بدنۀ داخلیِ if
به عنوان اِلِمان دوم و مابین علامتهای ( )
نوشته میشوند و در نهایت هم شرط مد نظر خارج از آبجکت تاپل تعریف میشود که فرم کلی تعریف دستورات شرطی با بهکارگیری آبجکتی از جنس تاپل به صورت زیر میباشد:
(whenFalse, whenTrue)[condition]
در واقع، دستورات مرتبط با else
یا دستوراتی که در صورت برقرار نبودن شرط مورد نظر میباید اجرا شوند را به عنوان اِلِمان اول و دستور مربوط به بدنۀ داخلی if
یا دستوراتی که در صورت برقراری شرط مذکور اجرا میشوند نیز به عنوان اِلِمان دوم آبجکت تاپل نوشته شده و در ادامه شرط مد نظر خارج از آبجکت تاپل مذکور تعریف شده است.
به خاطر داشته باشید |
لازم به یادآوری است که دستورات مربوط به برقرار نبودن شرایط تعریفشده در آبجکت تاپل همواره در جایگاه اِلِمان اول از آبجکت تاپل مورد نظر قرار میگیرند. |
حال برای پیادهسازی دستورات شرطی مربوط به مثال قبل با استفاده از آبجکتی از جنس تاپل، کدی به صورت زیر خواهیم داشت:
>>> a = 2
>>> b = 3
>>> number = ("b", "a") [a > b]
>>> print("The greatest number is", number)
The greatest number is b
در کد فوق، همچون مثال پیشین، دو آبجکت از جنس عدد صحیح تعریف کرده و هر یک را به ترتیب به آبجکتهایی تحت عناوین a
و b
اختصاص دادهایم سپس متغیری تحت عنوان number
تعریف کرده و در ادامه دستوری شرطی تعریف کردهایم که در آن گفتهایم چنانچه مقدار منتسب به متغیر a
از مقدار اختصاصیافته به متغیر b
بزرگتر باشد، دستور درجشده در اِلِمان دوم مبنی بر اختصاص استرینگ «a» به متغیر number
اجرا شده و در غیر این صورت استرینگ «b» به متغیر مذکور اختصاص داده شود. در ادامه، مقدار منتسب به متغیر number
با استرینگ «The greatest number is» کانکت شده و در خروجی چاپ میگردد.
نحوۀ سادهسازی دستورات شرطی با بهکارگیری آبجکتی از دیتا تایپ دیکشنری
همچنین به منظور سادهسازی دستورات شرطی از آبجکتهایی با نوع دادۀ دیکشنری نیز میتوان استفاده نمود به طوری که فرم کلی این روش به صورت زیر میباشد:
{False: whenFalse, True: whenTrue} [condition]
# or
{True: whenTrue, False: whenFalse} [condition]
همانطور که مشاهده میکنیم، نحوۀ تعریف دستورات شرطی با استفاده از دیتا تایپ دیکشنری مشابه دیتا تایپ تاپل میباشد با این تفاوت که از علامتهای { }
به جای ( )
در آن استفاده شده به علاوه اینکه به صراحت میتوان گفت که در صورت برقراری شرط مورد نظر، دستور مرتبط با هر یک از اِلِمانهای اول یا دوم و در غیر این صورت دستور مربوط به هر یک از اِلِمانهای دوم یا اول اجرا شوند؛ به عبارتی، اِلِمان مرتبط با دستورات بدنۀ داخلی if
و else
در آبجکت دیکشنری را میتوان به دلخواه تعریف کرده و همچنین در صورت لزوم آنها را تغییر داد که برای درک بهتر نحوۀ پیادهسازی دستورات شرطی با بهکارگیری آبجکت دیکشنری، کد مربوط به مثال قبل را به صورت زیر ریفکتور میکنیم:
>>> a = 2
>>> b = 3
>>> number = {False: b, True: a}[a > b]
>>> print("The greatest number is", number)
The greatest number is 3
در مثال فوق، دو آبجکت از جنس عدد صحیح تعریف کرده و آنها را به متغیرهایی تحت عناوین a
و b
منتسب کردهایم و در ادامه گفتهایم در صورت به اصطلاح True
بودن شرط (بزرگتر بودن مقدار منتسب به a
از مقدار اختصاصیافته به متغیر b
)، مقدار متغیر a
و در غیر این صورت مقدار متغیر b
به متغیری تحت عنوان number
اختصاصیافته و در نهایت به همراه استرینگ «The greatest number is» در خروجی چاپ شود.
آشنایی با نحوۀ سادهسازی دستورات شرطی تودرتو
به علاوه، میتوان با بهکارگیری ساختار Ternary Operator دستورات شرطی تودرتو را نیز به صورت سادهتری پیادهسازی کرد. برای مثال، در کد زیر دو دستور شرطی به صورت تودرتو پیادهسازی شدهاند:
a = 10
b = 20
if a != b:
if a > b:
print("a is greater than b")
else:
print("b is greater than a")
else:
print("Both a and b are equal")
در کد فوق، دو آبجکت از جنس عدد صحیح تعریف کرده و آنها را به ترتیب به متغیرهایی تحت عناوین a
و b
اختصاص دادهایم و در ادامه دستوری شرطی تعریف کردهایم که در ابتدا بررسی میکند تا ببیند چنانچه مقادیر منتسب به دو متغیر با یکدیگر برابر نبودند، دستورات داخلی if
اجرا شود و در غیر این صورت استرینگ «Both a and b are equal» در خروجی چاپ شده و برنامه به پایان میرسد اما در صورت عدم تساوی مقادیر منتسب به دو متغیر، مفسر وارد بدنۀ دستور if
میشود که در آن گفتهایم مقادیر منتسب به دو متغیر مقایسه شده و چنانچه مقدار منتسب به متغیر a
از مقدار متغیر b
بزرگتر بود، دستور if
داخلی برقرار بوده و مفسر وارد بدنۀ آن شده و دستوری مبنی بر چاپ استرینگ «a is greater than b» را اجرا کرده و در غیر این صورت استرینگ «b is greater than a» را در خروجی چاپ میکند. بنابراین با اجرای کد فوق خواهیم داشت:
b is greater than a
حال اگر بخواهیم دستورات شرطی تودرتو در مثال فوق را به فرم سادهتری پیادهسازی کنیم، خواهیم داشت:
>>> a = 10
>>> b = 20
>>> print ("Both a and b are equal" if a == b else "a is greater than b" if a > b else "b is greater than a")
b is greater than a
همانطور که میبینیم، دستوری معادل نُه سطر کد را در سه سطر پیادهسازی نمودیم که در آن گفتهایم چنانچه مقادیر منتسب به متغیرهای a
و b
برابر باشند، استرینگ «Both a and b are equal» در خروجی چاپ شده و در غیر این صورت مجدداً دستورات شرطی دیگری بررسی شوند بدین صورت که چنانچه مقدار منتسب به متغیر a
بزرگتر از مقدار منتسب به متغیر b
بود، استرینگ «a is greater than b» و در غیر این صورت استرینگ «b is greater than a» در خروجی چاپ شود.
به طور کلی، استفاده از نوع دادۀ تاپل و دیکشنری به منظور سادهسازی دستورات شرطی توصیه نمیشود چرا که در این صورت مفسر پایتون هر دو مورد مرتبط با دستورات بدنۀ داخلی if
و else
را ارزیابی میکند که برای درک بهتر این موضوع کد زیر را مد نظر قرار میدهیم:
>>> condition = True
>>> print(2 if condition else 1/0)
2
در کد فوق، از روش اول به منظور پیادهسازی دستوری شرطی استفاده نمودهایم که در آن ابتدا مقدار بولین True
را برای متغیری به نام condition
در نظر گرفته و در ادامه گفتهایم چنانچه عبارت condition
برابر با True
باشد (برقراری شرط) عدد 2 و در غیر این صورت مقدار حاصل از تقسیم عدد 1 بر 0 در خروجی چاپ شود. همانطور که میبینیم، مقدار منتسب به متغیر condition
همواره True
بوده و از همین روی عدد 2 در خروجی چاپ شده و دستور مرتبط با else
معادل تقسیم عدد 1 بر 0 نیز بررسی نشده است. اکنون قصد داریم تا مثال فوق را با استفاده از دیتا تایپ تاپل پیادهسازی کنیم به طوری که داریم:
>>> condition = True
>>> print((1/0, 2)[condition])
Traceback (most recent call last):
File "<pyshell#15>", line 1, in <module>
print((1/0, 2)[condition])
ZeroDivisionError: division by zero
در دستور شرطی فوق، از دیتا تایپ تاپل استفاده کرده و به ترتیب دستورات مرتبط با بدنۀ داخلی else
و if
را در اِلِمان اول و دوم تعریف کرده و شرط مورد نظر خود را خارج از علائم ( )
درج کردهایم که در آن گفتهایم چنانچه عبارت condition
برابر با True
باشد، عدد 2 و در غیر این صورت مقدار حاصل از تقسیم عدد 1 بر 0 در خروجی چاپ شود و میبینیم که اجرای کد فوق منجر به بروز ارور در قالب پیامی مبنی بر عدم امکان تقسیم عدد 1 بر 0 شده است بدین معنی که مفسر پایتون هر دو دستور مرتبط با بدنۀ داخلیِ if
و else
در آبجکت تاپل فوق را در ابتدا ارزیابی میکند.
به علاوه، بهکارگیری آبجکت دیکشنری جهت سادهسازی دستورات شرطی نیز مشکلاتی مشابه آبجکت تاپل دارا است و از همین روی استفاده از دیتا تایپهای مذکور به منظور سادهسازی دستورات شرطی در پروژههای بزرگ ممکن است منجر به افزایش بارِ محاسباتی سیستم گردد.