شرط ها در پایتون

با عرض سلام
در کد زیر 3 شرط وجود دارد و همان طور که می دانید هر سه باید true بشود تا وارد بدنه if شود
می خواستم بدونم که اگر شرط اول false بشه پایتون شرط 2 و 3 را بررسی می کنه یا شرط اول true بشه و شرط دوم false بشه آیا پایتون شرط سوم یا شرط های دیگر را چک می کند یا نه.

if x==10 and y==20 and z ==30:
     ....`

ممنون

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

# run without problem
a = 1
b = 0
if b != 0 and a / b == 2:
    print("ratio is 2")


# Arithmetic Exception
a = 1
b = 0
if a / b == 2 and b != 0:
    print("ratio is 2")

توی کد اول وقتی میبینه b صفره میفهمه شرط برقرار نیست سراغ چک کردن شرط بعدی نمیره
ولی توی دومی اول تقسیم رو انجام میده و همونجا با runtime error مواجه میشه

2 Likes

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

فقط میخوام یه نکته رو اضافه کنم.
اونهم اینه که توی and، اولین falsey یا آخرین مورد شرط که مطمئنا truthy هست (وگرنه میشد اولین false) ریترن (return) میشه.
توی or، اولین truthy یا آخرین مورد شرط که قطعا false هست (وگرنه میشد اولین truthy) ریترن میشه.

میتونید and و or رو به شکل مدار منطقیش در نظر بگیرید.
توی and ما مدار سری داریم که همه ی کلیدهامون باید 1 باشن وگرنه برق رد نمیشه و وقتی همه 1 بودن، برق از آخری میاد (ما آخری رو میبینیم) وگرنه برق توی اولین 0 گیر میکنه (ما اولین false رو میبینیم)
توی or ما مدار موازی داریم، فقط کافیه یکیشون 1 باشه و ما اون یه دونه (اولین true که برق از توش رد میشه میاد بیرون) رو ببینیم، وگرنه آخرین چیزی که کامپیوتر تست کرده تا ببینه 1 هست یا 0 رو بهمون نشون میده.


با توجه به این توضیحات، اگه ما یه and داریم، بهتره اولین مورد شرطمون چیزی باشه که فکر میکنیم توی ۹۰درصد مواقع قراره false بهمون بده.اینطوری دیگه لازم نیست شرطهای بعدش تست بشن.
و اگه or داریم، اولین مورد شرطمون چیزی باشه که تو ۹۰درصد مواقع قراره true بهمون بده. اینطوری دیگه لازم نیست شرطهای بعدش تست بشن.


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

توی سورس ۲تا لایبرری دیدم که از این مساله استفاده کرده بودن. الان اسمشونو یادم نیست.

2 Likes

ممنون از توضیح شما
از این قسمت کد بالا خیلی خوش آمد , عالی بود :clap::clap::clap:

1 Like

متشکرم.
البته باید حواسمون به چیزهای دیگه هم باشه. مثلا شاید یکی از شرطها فشاری به cpu نیاره از نظر پردازشی، ولی نیاز به یه ioی سنگین داشته باشه.
این شرط حتی اگه تو ۹۹درصد مواقع کار ما رو راه میندازه، بازم باید بره اخر صف.

کلا تا جایی که میدونم، فقط بعضی الگوریتمهای رمزنگاری هستن که زمان زیادی از cpu میگیرن (یه سریاشون by design اینطوری هستن) بجز اینا، همیشه cpu زمان کمتری میگیره و تست کردنش توی if راحتتره.


یه نکته ی دیگه هم اشاره کنم.
به خاطر همین مساله هست که توی پایتون، try-except نسبت به if-else راندمان بالاتری داره. چون اگه شرط داخل try اوکی بود، تقریبا بدون اطلاف وقت، کد ما اجرا میشه. ولی اگه همینو با if بنویسیم، حداقل باید یک if چک بشه.

2 Likes