Получение элемента списка без блоков if или for в python

#python

#питон

Вопрос:

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

 If not flora and fauna:
      return True
else:
      return False
 

Я не мог ответить на этот вопрос, но все же это кажется мне очень интересным / странным, поскольку я не профессионал в python. Я перепробовал много способов, таких как extend() function, но до сих пор не знаю, как это сделать.

Есть какие-нибудь идеи или намеки?

РЕДАКТИРОВАТЬ: я неправильно сформулировал вопрос. Извините за это. Поскольку у меня не так много опыта, я подумал, что эту проблему можно решить, только составляя списки.

Комментарии:

1. Это недопустимый python… (Прописное if)

2. Немного неясно, какое это имеет отношение к for циклам или extend или получению элемента a list . Я не вижу 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 нс, а использование plain x — до 11 нс, так что реальный ответ заключается в том, чтобы не беспокоиться о True / False и просто возвращать правдивую / ложную вещь.

4. Если оба являются bools, вы также можете это сделать return flora < fauna .

5. @KellyBundy: Конечно, но это делает довольно строгие предположения с небольшим количеством способов убедиться, что они верны. Вы не должны заботиться о том, является ли данное значение на самом деле a bool (идиоматический код, который на самом деле нуждается True / False вводится в нем, довольно редок), но это решение требует этого и молча ведет себя неправильно во многих случаях, когда предположение нарушается.