Çoğu durumda, Python doğal İngilizce gibi görünür ve davranır, ancak bu, soyutlamanın başarısız olduğu bir durumdur. İnsanlar, "Jon" ve "Inbar" ın "eşittir" fiiliyle birleştirilen nesneler olduğunu belirlemek için bağlam ipuçlarını kullanabilir, ancak Python yorumlayıcısı daha gerçek fikirlidir.
if name == "Kevin" or "Jon" or "Inbar":
mantıksal olarak şuna eşdeğerdir:
if (name == "Kevin") or ("Jon") or ("Inbar"):
Bob kullanıcısı için şuna eşdeğerdir:
if (False) or ("Jon") or ("Inbar"):
or
Operatör pozitif ilk argüman seçer gerçeği değeri :
if ("Jon"):
Ve "Jon" pozitif bir doğruluk değerine sahip olduğu için if
blok çalışır. "Erişim verildi" nin verilen addan bağımsız olarak yazdırılmasına neden olan budur.
Bütün bu akıl yürütme, ifade için de geçerlidir if "Kevin" or "Jon" or "Inbar" == name
. ilk değer, "Kevin"
true olduğundan if
blok yürütülür.
Bu koşulu düzgün bir şekilde inşa etmenin iki yaygın yolu vardır.
==
Her bir değeri açıkça kontrol etmek için birden çok operatör kullanın :
if name == "Kevin" or name == "Jon" or name == "Inbar":
Bir dizi geçerli değer oluşturun ve in
operatörü üyeliği test etmek için kullanın :
if name in {"Kevin", "Jon", "Inbar"}:
Genel olarak, okunması daha kolay ve aynı zamanda daha hızlı olduğu için ikincisi tercih edilmelidir:
>>> import timeit
>>> timeit.timeit('name == "Kevin" or name == "Jon" or name == "Inbar"', setup="name='Inbar'")
0.4247764749999945
>>> timeit.timeit('name in {"Kevin", "Jon", "Inbar"}', setup="name='Inbar'")
0.18493307199999265
if a == b or c or d or e: ...
Gerçekten de bu şekilde ayrıştırılmış bir kanıt isteyenler için . Yerleşik ast
modül bir cevap sağlar:
>>> import ast
>>> ast.parse("if a == b or c or d or e: ...")
<_ast.Module object at 0x1031ae6a0>
>>> ast.dump(_)
"Module(body=[If(test=BoolOp(op=Or(), values=[Compare(left=Name(id='a', ctx=Load()), ops=[Eq()], comparators=[Name(id='b', ctx=Load())]), Name(id='c', ctx=Load()), Name(id='d', ctx=Load()), Name(id='e', ctx=Load())]), body=[Expr(value=Ellipsis())], orelse=[])])"
>>>
Yani test
bir if
böyle deyimi görünüyor:
BoolOp(
op=Or(),
values=[
Compare(
left=Name(id='a', ctx=Load()),
ops=[Eq()],
comparators=[Name(id='b', ctx=Load())]
),
Name(id='c', ctx=Load()),
Name(id='d', ctx=Load()),
Name(id='e', ctx=Load())
]
)
Görüldüğü gibi, boolean operatör var or
birden uygulanan values
, yani a == b
ve c
, d
ve e
.