Подтвердить что ты не робот

Являются ли эти два оператора python одинаковыми?

У меня есть два утверждения

return self.getData() if self.getData() else ''

и

return self.getData() or ''

Я хочу знать, они такие же или есть какая-то разница

4b9b3361

Ответ 1

Я бы сказал Нет, потому что если self.getData() что-то изменяет во время его работы, то первый оператор имеет возможность возвращать другой результат, так как он сделает второй вызов.

Ответ 2

Может быть, но только если self.getData() является чистой функцией и не имеет побочных эффектов. Более того, объект, возвращаемый self.getData(), также должен быть свободным от каких-либо побочных эффектов и последовательно возвращать логическое значение.

В простейшем случае, если f() определяется как:

def f():
    return ["Hello World!"]

Тогда следующее:

x = f() if f() else ""

логически эквивалентно:

x = f() or ""

Так как f() рассматривается как логическое выражение в обоих случаях, а f() будет оценивать значение True (ish) или False (ly), оба выражения вернут тот же результат.

Это называется Логическая эквивалентность

В логике утверждения p и q логически эквивалентны, если они имеют то же логическое содержание. Это семантическая концепция; два заявления эквивалентно, если они имеют одинаковое значение истинности в каждой модели (Мендельсон 1979: 56). Логическая эквивалентность p и q иногда выражается как p\equiv q, Epq или p\Leftrightarrow q. Однако эти символы также используется для эквивалентности материалов; правильная интерпретация зависит в контексте. Логическая эквивалентность отличается от материала эквивалентности, хотя эти два понятия тесно связаны.

Ответ 3

Они будут иметь одинаковый результат, поскольку оба метода лечения self.getData() приводят к булевому контексту, но остерегайтесь:

1) return self.getData() if self.getData() else ''

будет запускать функцию getData дважды, а

2) return self.getData() or ''

будет запускаться только один раз. Это может быть важно, если для выполнения getData() требуется некоторое время, а это означает, что 1) не совпадает с 2), если функция getData() имеет какие-либо побочные эффекты.

Придерживайтесь 2).

Ответ 4

Единственное различие, которое я вижу, состоит в том, что первый из них дважды вызовет self.getData(), причем первый из них будет использоваться для вычисления логического значения, а второй может быть возвращен (если первый оценивается как True).

Другая опция будет оценивать функцию только один раз, используя ее как логическую проверку, так и возврат.

Это может иметь решающее значение, если, например, self.getData() удаляет или изменяет данные после их возврата или функция занимает много времени для вычисления.