استفاده از عملگر or در پایتون

امیرحسین بیگدلو 12 ماه قبل

سه عملگر بولی در پایتون وجود دارد: and، or، و not. با استفاده از آنها، می توانید شرایط را آزمایش کرده و تصمیم بگیرید که برنامه های شما در کدام مسیر اجرا قرار خواهند گرفت. در گذشته نحوه استفاده از عملگر and را توضیح داده‌ایم. در این آموزش، با پایتون اپراتور or و نحوه استفاده از آن آشنا خواهید شد.

 

 

# عملگر or پایتون چطور کار میکند؟

با عملگر OR، می توانید دو عبارت بولی را به یک عبارت مرکب متصل کنید. حداقل یک عبارت فرعی باید صادق باشد تا عبارت مرکب True تلقی شود و مهم نیست کدام. اگر هر دو بیان فرعی نادرست باشند، این عبارت False است.

 

این منطق کلی پشت عملگر OR است. با این حال، اپراتور or همه اینها و بیشتر را انجام می دهد، همانطور که در بخشهای بعدی مشاهده خواهید کرد.

 

مقاله مرتبط: درک Booleanها در پایتون

+ استفاده از عملگر or در کنار عبارات boolean

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

# Syntax for Boolean expression with or in Python
exp1 or exp2

 

اگر حداقل یکی از عبارات فرعی (exp1 یا exp2) روی True ارزیابی شود، کل این عبارت True تلقی می شود. اگر هر دو عبارت فرعی با False ارزیابی شوند، این عبارت False است. این تعریف فراگیر نامیده می شود، زیرا هر دو احتمال و همچنین هر یک را امکان پذیر می کند.

 

در اینجا خلاصه ای از رفتار اپراتور or پایتون آمده است:

exp1  exp2  exp1 or exp2
True True True
True False True
False True True
False False False

 

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

>>> exp1 = 1 == 2
>>> exp1
False

>>> exp2 = 7 > 3
>>> exp2
True

>>> exp1 or exp2  # Return True, because exp2 is True
True

>>> exp2 or exp1  # Also returns True
True

>>> exp3 = 3 < 1
>>> exp1 or exp3  # Return False, because both are False
False

 

 

+ اتصال کوتاه به ارزیابی - lazy evaluation

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

>>> True or 4 < 3
True

 

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

>>> def true_func():
...     print('Running true_func()')
...     return True
...
>>> def false_func():
...     print('Running false_func()')
...     return False
...

>>> true_func() or false_func()  # Case 1
Running true_func()
True

>>> false_func() or true_func()  # Case 2
Running false_func()
Running true_func()
True

>>> false_func() or false_func()  # Case 3
Running false_func()
Running false_func()
False

>>> true_func() or true_func()  # Case 4
Running true_func()
True

 

case1: پایتون true_func () را ارزیابی کرد. از آنجا که True را برمی گرداند، عبارت بعدی (false_func ()) ارزیابی نمی شود. توجه کنید که عبارت Running false_func () هرگز چاپ نمی شود. در نهایت ، کل عبارت True در نظر گرفته می شود

 

case2: هر دو تابع را ارزیابی می کند، زیرا اولین عبارت (false_func ()) False است. سپس عبارت دوم(true_func)نتیجه را باز می گرداند، که True است.

 

case3: هر دو عبارت را ارزیابی می کند، زیرا هر دو False را برمی گردانند. مقدار برگشتی آخرین تابع False را برمی گرداند و نتیجه کلی False در نظر گرفته می شود.

 

case4: پایتون فقط عبارت اول را ارزیابی میکند که true است پس کل عبارت true خواهد بود.

 

مقاله مرتبط: 11توصیه به مبتدیان برای یادگیری پایتون

# استفاده از اپراتور or پایتون در زمینه های بولی

در این بخش ، چند نمونه کاربردی از نحوه استفاده از اپراتور or پایتون را مشاهده خواهید کرد و یاد خواهید گرفت که چگونه از رفتار تا حدودی غیرمعمول آن برای نوشتن کد پایتون بهتر استفاده کنید.

 

 

+ شرط if

فرض کنید می خواهید قبل از انتخاب مسیر مشخصی، مطمئن شوید که یکی از دو شرط (یا هر دو) درست است. در این حالت، می توانید از عملگر or پایتون برای اتصال شرایط در یک عبارت استفاده کنید و از این عبارت در دستور if استفاده کنید.

 

فرض کنید برای انجام برخی از اقدامات بسته به پاسخ کاربر ، باید از کاربر تأیید بگیرید:

>>> def answer():
...     ans = input('Do you...? (yes/no): ')
...     if ans.lower() == 'yes' or ans.lower() == 'y':
...         print(f'Positive answer: {ans}')
...     elif ans.lower() == 'no' or ans.lower() == 'n':
...         print(f'Negative answer: {ans}')
...

>>> answer()
Do you...? (yes/no): y
Positive answer: y

>>> answer()
Do you...? (yes/no): n
Negative answer: n

 

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

 

در اولین فراخوانی برای answer()، ورودی کاربر y بود که شرط اول را برآورده می کرد و بلوک کد if اجرا می شد. در فراخوانی دوم، ورودی کاربر (n) شرط دوم را برآورده کرد، بنابراین بلوک کد elif اجرا شد. اگر ورودی کاربر هیچ شرطی را برآورده نکند ، هیچ بلوک کد اجرا نمی شود.

 

یک مثال دیگر می تواند زمانی باشد که می خواهید تعیین کنید آیا یک عدد خارج از محدوده است یا خیر. در این مورد، امکان استفاده از اپراتور or پایتون نیز وجود دارد. کد زیر آزمایش می کند که آیا x خارج از محدوده 20 تا 40 است:

>>> def my_range(x):
...     if x < 20 or x > 40:
...         print('Outside')
...     else:
...         print('Inside')
...

>>> my_range(25)
Inside

>>> my_range(18)
Outside

 

هنگامی که my_range () را با x = 25 فراخوانی می کنید، دستور if 25 <20 را آزمایش می کند که False است. سپس x> 40 را آزمایش می کند که آن هم False است. نتیجه نهایی False است ، بنابراین بلاک else اجرا شد.

 

از طرف دیگر ، 18 <20 با True ارزیابی می شود. سپس اپراتور or پایتون ارزیابی اتصال کوتاه را انجام می دهد و شرط درست تلقی می شود. بلوک اصلی اجرا می شود و مقدار خارج از محدوده است.

 

مقاله مرتبط: لیست مهمترین متدهای string در پایتون

 

+ حلقه while

حلقه while نمونه دیگری از زمینه بولی هستند که در آن می توانید از عملگر or پایتون استفاده کنید. با استفاده از or در هدر while، می توانید چندین شرایط را آزمایش کرده و بدنه را اجرا کنید تا زمانی که همه شرایط به نادرست ارزیابی شود.

from time import sleep

temp = measure_temp()  # Initial temperature measurement

while temp < 100 or temp > 140:
    print('Temperature outside the recommended range')
    print('New Temperature measure in 30 seconds')
    sleep(30)
    print('Measuring Temperature...')
    temp = measure_temp()
    print(f'The new Temperature is {temp} ºF')

 

در اینجا، حلقه while اجرا می شود تا دما بین 100 ºF و 140 ºF باشد. اگر مقدار دما خارج از محدوده باشد، بدنه حلقه اجرا می شود و دوباره دما را اندازه گیری می کنید. هنگامی که measure_temp مقداری بین 100 ºF و 140 ºF برمی گرداند ، حلقه به پایان می رسد. اندازه گیری دما هر 30 ثانیه با استفاده از sleep(30) انجام می شود.

ویدیو پیشنهادی: ویدیو آموزش حلقه while در پایتون

 

# استفاده از اپراتور or پایتون در زمینه های غیربولی

می توانید از ویژگی های ویژه اپراتور or پایتون خارج از زمینه بولی استفاده کنید. قانون کلی این است که نتیجه عبارات بولی شما اولین عبارت true یا آخرین در خط است.

 

توجه داشته باشید که عملگرهای منطقی قبل از عملگر تخصیص (=) ارزیابی می شوند، بنابراین می توانید نتیجه یک عبارت بولی را به یک متغیر به همان روشی که با یک عبارت رایج انجام می دهید ، اختصاص دهید:

>>> a = 1
>>> b = 2
>>> var1 = a or b
>>> var1
1

>>> a = None
>>> b = 2
>>> var2 = a or b
>>> var2
2

>>> a = []
>>> b = {}
>>> var3 = a or b
>>> var3
{}

 

در اینجا عملگر or مطابق انتظار عمل می کند و در صورتی که هر دو به غلط ارزیابی شوند اولین عبارت true یا آخرین عبارت را برمی گرداند.

 

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

 

 

+ مقدار پیشفرض برای متغیرها

یکی از روش های متداول برای استفاده از عملگر or پایتون، انتخاب یک شی از مجموعه ای از اشیاء با توجه به مقدار حقیقی آن است. می توانید این کار را با استفاده از دستور تخصیص انجام دهید:

>>> x = a or b or None

 

در اینجا، شما اولین عبارت true را به x اختصاص داده اید. اگر همه اشیاء (a و b در این مورد) شیء False باشند، or پایتون عملگر None را برمی گرداند، که آخرین عملوند است. این کار به این دلیل است که عملگر or یکی از عملوندهای خود را بسته به مقدار حقیقی آنها برمی گرداند.

 

همچنین می توانید از این ویژگی برای تعیین مقدار پیش فرض به متغیرهای خود استفاده کنید. مثال زیر اگر a درست است، و در غیر اینصورت پیش فرض را قرار می دهد:

>>> x = a or default

 

 

+ مقدار پیشفرض برای return

می توانید مقدار برگشتی برخی از توابع داخلی را در زمان فراخوانی دستکاری کنید. توابعی مانند max () و min () ، که به عنوان یک استدلال تکرارپذیر هستند و یک مقدار واحد را برمی گردانند، می توانند کاندیدای مناسب شما برای این نوع هک ها باشند.

 

اگر یک آبجکت خالی به min() یا max() ارائه دهید، یک ValueError دریافت خواهید کرد. با این حال، می توانید این رفتار را با استفاده از اپراتور or پایتون تغییر دهید. بیایید نگاهی به کد زیر بیندازیم:

>>> lst = []  # Empty list to test max() and min()
>>> max(lst)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    max(lst)
ValueError: max() arg is an empty sequence

>>> min(lst)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    min(lst)
ValueError: min() arg is an empty sequence

>>> # Use Python or operator to modify this behavior
>>> max(lst or [0])  # Return 0
0

>>> min(lst or [0])  # Return 0
0

 

رفتار پیش فرض max () و min () این است که اگر ValueError را با یک آبجکت خالی فراخوانی کنید، یک ValueError دهد. با این حال، با استفاده از اپراتور or، مقدار برگشتی پیش فرض این توابع را ارائه می دهید و رفتار پیش فرض آنها را لغو می کنید.

 

 

+ تقسیم به صفر

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

>>> def divide(a, b):
...     if not b == 0:
...         return a / b
...

>>> divide(15, 3)
5.0

>>> divide(0, 3)
0.0

>>> divide(15, 0)

 

در اینجا ، شما تست کردید که آیا مخرج (b) برابر 0 نیست، و سپس نتیجه عملیات تقسیم را برگردانید. اگر b == 0 روی True ارزیابی شود، divide() به طور ضمنی هیچکدام را بر نمی گرداند. بیایید ببینیم چگونه می توان نتیجه مشابهی گرفت، اما این بار با استفاده از اپراتور or پایتون:

>>> def divide(a, b):
...     return b == 0 or a / b
...

>>> divide(15, 3)
5.0

>>> divide(0, 3)
0.0

>>> divide(15, 0)
True

 

در این حالت ،اپراتور or پایتون اولین عبارت فرعی (b == 0) را ارزیابی می کند. فقط اگر این عبارت فرعی نادرست باشد، عبارت دوم (a / b) مورد ارزیابی قرار می گیرد و نتیجه نهایی تقسیم a و b خواهد بود.

 

تفاوت با مثال قبلی در این است که اگر b == 0 به True ارزیابی شود، divide() به جای None، مقدار True را برمی گرداند.

 

ویدیو پیشنهادی: ویدیو آموزش لامبدا(lambda) در پایتون

+ چند عبارت در لامبدا

پایتون عبارات lambda را ارائه می دهد که به شما امکان می دهد توابع ساده ناشناس ایجاد کنید. lambda parameters: expression یک شیء تابع را ارائه می دهد. اگر بخواهید توابع اجرایی ساده و کلیدهای اصلی را تعریف کنید، این نوع عملکرد ممکن است مفید باشد.

 

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

>>> lambda_func = lambda hello, world: print(hello, end=' ') or print(world)

>>> lambda_func('Hello', 'World!')
Hello World!

 

 

# نتیجه گیری

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

مطالب مشابه



مونگارد