#python
#питон
Вопрос:
Несколько дней назад на моем экзамене у меня был такой вопрос: 4. Перепишите следующий код без оператора if. Код должен быть однострочным. (без использования каких-либо других циклов)
If not flora and fauna:
return True
else:
return False
Я не мог ответить на этот вопрос, но все же это кажется мне очень интересным / странным, поскольку я не профессионал в python. Я перепробовал много способов, таких как extend()
function, но до сих пор не знаю, как это сделать.
Есть какие-нибудь идеи или намеки?
РЕДАКТИРОВАТЬ: я неправильно сформулировал вопрос. Извините за это. Поскольку у меня не так много опыта, я подумал, что эту проблему можно решить, только составляя списки.
Комментарии:
1. Это недопустимый python… (Прописное if)
2. Немного неясно, какое это имеет отношение к
for
циклам илиextend
или получению элемента alist
. Я не вижуlist
здесь ни s, ни какой-либо причины использовать их или иным образом зацикливаться.
Ответ №1:
Поскольку вы возвращаетесь True
, когда значение if
равно true, а False
когда оно равно false, простое решение — просто вернуть то if
, что вычисляется напрямую:
return not flora and fauna
Обратите внимание, что это может возвращать не True
or False
, а скорее истинное или ложное значение (например, для falsy flora
выражение вычисляется как то, что fauna
есть; if flora, fauna = 0, "Spam"
, выражение вычисляется "Spam"
как , что является правдивым, но нет True
), и fauna
is "Spam"
. Если вам нужно значение true True
/ False
, просто преобразуйте в bool
:
return bool(not flora and fauna)
или используйте условное выражение для достижения того же эффекта:
return True if not flora and fauna else False
или (сейчас мы переходим к «забавной игре»):
return not not (not flora and fauna)
или (раздать один not
):
return not (flora or not fauna)
или (быстрее bool
, медленнее, чем not not
, вероятно, не стоит импортировать, хотя):
from operator import truth
return truth(not flora and fauna)
Однако в 99 % случаев вам не нужен true True
/ False
, так return not flora and fauna
что это действительно правильный путь.
Комментарии:
1. Лол. Я не знал, что есть оператор истины
2. @MadPhysicist: Да. И это быстрее, чем
bool
, потомуbool
что это конструктор (который не может избежать некоторых накладных расходов и гибкости, связанных с конструкторами, которыеbool
не выигрывают, поскольку он всегда возвращает существующий объект), в то времяoperator.truth
как это простая функция. Единственное реальное преимущество вbool
том, что вы можете вызывать его без аргументов (гдеtruth
требуется ровно один позиционный аргумент).bool
быстрее, чем раньше (они, наконец, запретили аргументы ключевых слов для него в 3.7, что позволяет использовать гораздо более простой синтаксический анализ аргументов), но все же медленнее, чемtruth
.3. Просто для сравнения, на моей установке Python x64 3.8.5 Alpine Linux (работающей под управлением WSLv2), в
ipython3
,%%timeit x = False; from operator import truth as t
с тестовым теломt(x)
выполняется около 32 нс на цикл;%%timeit x = False; b = bool
с тестовым теломb(x)
составляет около 69 нс на цикл. Конечно, использованиеnot not x
сокращает его до 20,5 нс, а использование plainx
— до 11 нс, так что реальный ответ заключается в том, чтобы не беспокоиться оTrue
/False
и просто возвращать правдивую / ложную вещь.4. Если оба являются bools, вы также можете это сделать
return flora < fauna
.5. @KellyBundy: Конечно, но это делает довольно строгие предположения с небольшим количеством способов убедиться, что они верны. Вы не должны заботиться о том, является ли данное значение на самом деле a
bool
(идиоматический код, который на самом деле нуждаетсяTrue
/False
вводится в нем, довольно редок), но это решение требует этого и молча ведет себя неправильно во многих случаях, когда предположение нарушается.