Мне было интересно, в чем разница между этими двумя фрагментами кода:
while choice != "y" and choice != "n":
while not choice == "y" and not choice == "n":
Мне было интересно, в чем разница между этими двумя фрагментами кода:
while choice != "y" and choice != "n":
while not choice == "y" and not choice == "n":
В первом используется метод объекта __ne__
, а во втором — метод объекта __eq__
и отрицает его результат.
Хотя оба метода должны связывать свои результаты, поэтому a == b
подразумевает not a != b
, на самом деле это не требуется и не применяется.
Между операторами сравнения нет подразумеваемых отношений. Истинность
x==y
не означает, чтоx!=y
ложно. Соответственно, при определении__eq__()
следует также определить__ne__()
, чтобы операторы вели себя так, как ожидается.
В вашем случае, где choice
- это строка (наверное?), это не имеет большого значения. Все встроенные типы обеспечивают обратную связь между ==
и !=
. Таким образом, единственная разница заключается в том, насколько это понятно при взгляде на код. И лично я предпочитаю более сжатую первую версию.
not
также имеет особое значение в некоторых контекстах — например,is not
— это оператор. (не два оператора, один оператор). Как иnot in
. - person kampu   schedule 20.05.2013while choice != "y" and choice != "n"
совпадает сwhile choice is not "y" and choice is not "n"
- @кампу? - person GiamPy   schedule 20.05.2013is
иis not
— это сравнения идентичности, а==
и!=
— сравнения равенства. Они не обязаны давать одинаковый результат и определенно не работают для строк. Например,'a{}'.format('b') is 'ab'
— ложь, а'a{}'.format('b') == 'ab'
— истина. - person poke   schedule 20.05.2013is not
- это другой оператор, чем!=
. (иis
— это другой оператор, чем==
). Обычно вы можете думать, что==
и!=
проверяют содержимое объектов, тогда какis
иis not
буквально проверяют, являются ли операнды одним и тем же объектом. Обычно это полезно для сравнения с единичными значениями, такими какNone
,True
иFalse
. Например,0 is False
оценивается как False, а0 == False
оценивается как True (поскольку целочисленное значение False равно 0). - person kampu   schedule 20.05.2013choice not in ['t', 'f']
в любом случае, вероятно, лучший способ написать это. - person Wooble   schedule 20.05.2013while choice == "y" or choice == "n"
илиwhile choice not in ("y", "n")
- person warvariuc   schedule 20.05.2013