Тестирование Python if и проверка истинности значения для некоммерческого фона - PullRequest
0 голосов
/ 06 июня 2019

Цель этого вопроса - ответить на него после нескольких часов копания, и я обнаружил, что этот мыслительный процесс может оказаться полезным для других, которые также, возможно, не пришли из формального компьютерного прошлого.

Все началось с путаницы из-за того, почему вводилось одно конкретное утверждение if.

>>>if (2 & 2):
...    print("true")
true

Почему это было, если заявление вводится?

1 Ответ

0 голосов
/ 06 июня 2019

Мое предыдущее использование выражений if было довольно простым, поэтому я принял это как должное и с пониманием, что только логическое True приведет к вводу оператора if. То, что составляет логическое Истина, не было так очевидно для меня после столкновения с этим утверждением if. Это, безусловно, очевидно для тех, кто имеет опыт работы с compsci, но я никогда не задумывался над тем, как операторы определяют, является ли аргумент логическим значением True или нет. Например, если (5> 2) -> True просто имеет смысл для любого, имеющего хотя бы начальное образование по математике, так что я воспринял это как должное. Напротив, если (2) -> True, не кажется слишком очевидным для специалиста, не являющегося специалистом в области компьютерных технологий.

Например

>>>2 & 2
2
>>> 2 == True
False
>>>if (2):
...    print("true")
true

Почему оператор if был введен несмотря на то, что 2 и 2 оцениваются как значение int, равное 2? Почему оператор if был введен, если ему присвоено значение int 2, хотя само 2 не == True? Это был первый раз, когда я увидел такой тип поведения, и он заставил меня понять из различных других вопросов переполнения стека, что оператор if не оценивает значение int из 2 == True, но вместо этого оценивает bool (2) == True , что на самом деле верно.

Опять же, если вы пришли из компьютерной науки, я уверен, что все это очень очевидно, но даже идея bool (2) и «проверки на истинность» как фразы была для меня новой, так что добавление этого на двоичные логические операторы сначала вызвали у меня немного путаницы. Например:

>>>2 & 4
0
>>>if (2 & 4):
...    print("true")
>>>bin(2 & 4)
'0b0'
>>>if ('0b0'):
...    print("true")
true
>>>if (0b0):
...    print("true")
>>>bool(0)
False
>>>bool(0b0)
False
>>>bool(b'0')
True
>>>bool(bin(0))
True

Во-первых, с ошибочным пониманием того, что операторы if оценивали аргумент == True, приведенные выше примеры казались довольно нелогичными, так как я думал, что двоичный 1 должен приводить к True, а двоичный 0 должен приводить к False. Я понятия не имел, почему целочисленные значения выше 1, в int или двоичной форме должны возвращать True.

После прочтения документации по Python для Проверка истинности значения Я вижу несколько примеров объектов, которые считаются ложными. Здесь, и довольно очевидно, имеет смысл, почему bool (0) и bool (0b0) возвращают False. И наоборот, для bool (b'0 ') и bool (bin (0)), где это, похоже, возвращает True. Почему это? Поскольку bin () возвращает string представление числа, так как b'0 '(строка) не является действительным двоичным значением (например, 0b0), и поскольку эти строки не являются пустыми строками, а, скорее, заполнены символами, представляющими ноль, он оценивается как Истина (см. третий пункт в Проверка значения истины ).

Я привел несколько примеров неочевидных (для меня) тестов для оценки истины, и почему они действительно имеют логический смысл. Надеюсь, что это помогает другим, которые могут быть озадачены кажущимся (для меня) меньшим общим использованием выражения if.

...