Есть ли встроенная функциональная версия `and` и / или` or` в Python?

Этот вопрос для удовольствия; Я не ожидаю, что ответ будет полезен.

Когда я вижу, что люди делают вещи с помощью функции reduce() в Python, они часто используют встроенную функцию в Python, часто из модуля operator .

Это работает:

 result = reduce(lambda a, b: a + b, range(5)) 

Но обычно вы увидите следующее:

 from operator import add result = reduce(add, range(5)) 

Что странно для меня, так это то, что operator модуль, похоже, не имеет функции для логического and . Он имеет побитовое и, но не логическое and .

Предположим, вы это делаете:

 result = reduce(lambda a, b: a and b, range(1, 6)) 

Есть встроенная функция, которая может быть использована здесь?

Мне также интересно, есть ли встроенная функция, которая может заменить or .

Если сначала сопоставить аргументы с Booleans, вы можете использовать побитовое и от operator или просто использовать bool.__and__ , например:

 from operator import and_ result = reduce(and_, map(bool, range(1, 6))) result = reduce(bool.__and__, map(bool, range(1, 6))) 

А также с operator.or_() или bool.__or__ для операции or . Но я ищу функцию, которая не нуждается в значениях, сопоставленных с Booleans.

Если бы вы знали наверняка, что ваши значения являются целыми числами, вы можете использовать operator.mul для and и operator.add для or . Это было бы грубым взломом, и я не хочу этого ответа … особенно учитывая, насколько дорого будут умножаться, если бы столкнулись многие числа, и ни один из них не был равен нулю!

Примечание. Я знаю all() и any() , которые являются лучшими заменами для этого использования reduce() . Как я сказал наверху, я прошу это для удовольствия.

Примечание. Функция, которая имеет побочный эффект форсирования всех значений в bool будет приемлемым ответом. Встроенный and ключевое слово не делает этого:

 x = 3 and 5 # sets x to 5, not to True 

Но для этого вопроса меня интересует только функция, которая может работать с reduce() для выполнения логических операций and / or операций.

  • Не разрешено запрашивать области - Google OAuth2 для устройств
  • Есть ли преимущества использования метода @static?
  • f.write vs print >> f
  • Python: создать глобальную переменную из строки?
  • пакет импорта python - подпапка не должна отображаться в таблице символов
  • Как передать свой идентификатор и пароль на сайт в Python с помощью Google App Engine?
  • Python - поиск проблем unicode / ascii
  • Запуск сценариев Python внутри Android Studio
  • 3 Solutions collect form web for “Есть ли встроенная функциональная версия `and` и / или` or` в Python?”

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

    all/any примененные к генераторам, также имеют короткое замыкание

     def gen(): yield 1 yield this_wont_be_evaluated print any(gen()) 

    но я понятия не имею, как это работает с аргументами во время выполнения

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

     >>> def newand(a,b): ... return a and b ... >>> def newor(a,b): ... return a or b ... >>> reduce(newand, map(bool, range(5))) # Will return False, because bool(0) == False False >>> reduce(newand, map(bool, range(1,5))) # Now 0 is excluded True 

    Примечание. Функция, которая имеет побочный эффект форсирования всех значений в bool, будет приемлемым ответом. Встроенный и ключевое слово не делает этого

    но встроенное not ключевое слово делает.

     In : not 255 Out: False In : not 0 Out: True 

    конечно, вам придется вернуть свою логику назад, а затем:

     In : not (not 5 and not 0) # mimics: 5 or 0 Out: True 

    так что с этим вы можете эмулировать all() помощью reduce , map и operator.* :

     In : not reduce(operator.or_,map(operator.not_,[1,2,3,4,5])) # mimics all(1,2,3,4,5) Out: True In : not reduce(operator.or_,map(operator.not_,[1,2,3,0,5])) # mimics all(1,2,3,0,5) Out: False 

    это то, что вы хотели достичь? Боюсь, мы не сможем приблизиться.

    Python - лучший язык программирования в мире.