Python-эквивалент && (логического-и) в операторе if - PullRequest
721 голосов
/ 21 марта 2010

Вот мой код:

def front_back(a, b):
  # +++your code here+++
  if len(a) % 2 == 0 && len(b) % 2 == 0:
    return a[:(len(a)/2)] + b[:(len(b)/2)] + a[(len(a)/2):] + b[(len(b)/2):] 
  else:
    #todo! Not yet done. :P
  return

Я получаю ошибку в условии IF.Что я делаю не так?

Ответы [ 11 ]

1283 голосов
/ 21 марта 2010

Вы бы хотели and вместо &&.

208 голосов
/ 21 марта 2010

Python использует and и or условных выражений.

т.е.

if foo == 'abc' and bar == 'bac' or zoo == '123':
  # do something
35 голосов
/ 21 марта 2010

Два комментария:

  • Используйте and и or для логических операций в Python.
  • Используйте 4 пробела для отступа вместо 2. Позже вы будете благодарны, потому что ваш код будет выглядеть почти так же, как и код других. Подробнее см. PEP 8 .
26 голосов
/ 26 июня 2018

Я получаю ошибку в условном выражении IF.Что я делаю не так?

Есть причина, по которой вы получаете SyntaxError, состоит в том, что в Python нет оператора &&.Аналогичным образом || и ! являются недопустимыми операторами Python.

Некоторые операторы, которые вы, возможно, знаете из других языков, имеют другое имя в Python.Логические операторы && и || на самом деле называются and и or.Аналогично, оператор логического отрицания ! называется not.

Так что вы можете просто написать:

if len(a) % 2 == 0 and len(b) % 2 == 0:

или даже:

if not (len(a) % 2 or len(b) % 2):

Некоторая дополнительная информация(это может пригодиться):

Я суммировал операторы "эквиваленты" в этой таблице:

+------------------------------+---------------------+
|  Operator (other languages)  |  Operator (Python)  |
+==============================+=====================+
|              &&              |         and         |
+------------------------------+---------------------+
|              ||              |         or          |
+------------------------------+---------------------+
|              !               |         not         |
+------------------------------+---------------------+

См. также Документация Python: 6.11.Булевы операции .

Помимо логических операторов Python также имеет побитовые / двоичные операторы:

+--------------------+--------------------+
|  Logical operator  |  Bitwise operator  |
+====================+====================+
|        and         |         &          |
+--------------------+--------------------+
|         or         |         |          |
+--------------------+--------------------+

В Python нет побитового отрицания (только побитовый обратный оператор ~ -но это не эквивалентно not).

См. также 6.6.Унарные арифметические и побитовые / двоичные операции и 6.7.Двоичные арифметические операции .

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

Чтобы показать это, я использую функцию, которая просто принимает значение, печатает его и возвращает его снова.Это удобно, чтобы увидеть, что на самом деле оценивается из-за операторов печати:

>>> def print_and_return(value):
...     print(value)
...     return value

>>> res = print_and_return(False) and print_and_return(True)
False

Как вы можете видеть, выполняется только один оператор печати, поэтому Python действительно даже не смотрел на правильный операнд.

Это не относится к бинарным операторам.Они всегда оценивают оба операнда:

>>> res = print_and_return(False) & print_and_return(True);
False
True

Но если первого операнда недостаточно, тогда, конечно, вычисляется второй оператор:

>>> res = print_and_return(True) and print_and_return(False);
True
False

Подводя итог, приведу еще одинТаблица:

+-----------------+-------------------------+
|   Expression    |  Right side evaluated?  |
+=================+=========================+
| `True` and ...  |           Yes           |
+-----------------+-------------------------+
| `False` and ... |           No            |
+-----------------+-------------------------+
|  `True` or ...  |           No            |
+-----------------+-------------------------+
| `False` or ...  |           Yes           |
+-----------------+-------------------------+

* True и False представляют то, что bool(left-hand-side) возвращает, они не должны быть True или False, они просто должны вернуть True илиFalse когда к ним вызывается bool (1).

Таким образом, в псевдокоде (!) Функции and и or работают следующим образом:

def and(expr1, expr2):
    left = evaluate(expr1)
    if bool(left):
        return evaluate(expr2)
    else:
        return left

def or(expr1, expr2):
    left = evaluate(expr1)
    if bool(left):
        return left
    else:
        return evaluate(expr2)

Обратите внимание, что это псевдокод, а не код Python.В Python вы не можете создавать функции с именем and или or, потому что это ключевые слова.Также вам никогда не следует использовать «оценивать» или if bool(...).

Настройка поведения ваших собственных классов

Этот неявный вызов bool можно использовать для настройки поведения ваших классов с and, or и not.

Чтобы показать, как это можно настроить, я использую этот класс, который снова print s что-то для отслеживания происходящего:

class Test(object):
    def __init__(self, value):
        self.value = value

    def __bool__(self):
        print('__bool__ called on {!r}'.format(self))
        return bool(self.value)

    __nonzero__ = __bool__  # Python 2 compatibility

    def __repr__(self):
        return "{self.__class__.__name__}({self.value})".format(self=self)

Итакдавайте посмотрим, что происходит с этим классом в сочетании с этими операторами:

>>> if Test(True) and Test(False):
...     pass
__bool__ called on Test(True)
__bool__ called on Test(False)

>>> if Test(False) or Test(False):
...     pass
__bool__ called on Test(False)
__bool__ called on Test(False)

>>> if not Test(True):
...     pass
__bool__ called on Test(True)

Если у вас нет метода __bool__, тогда Python также проверяет, есть ли у объекта метод __len__ и возвращает ли онзначение больше нуля.Это может быть полезно знать в случае создания контейнера последовательности.

См. Также 4.1.Проверка истинности значения .

Массивы и подклассы NumPy

Возможно, это немного выходит за рамки исходного вопроса, но в случае, если вы имеете дело с массивами или подклассами NumPy (такими как Pandas Series илиDataFrames), тогда неявный вызов bool вызовет ужас ValueError:

>>> import numpy as np
>>> arr = np.array([1,2,3])
>>> bool(arr)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> arr and arr
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

>>> import pandas as pd
>>> s = pd.Series([1,2,3])
>>> bool(s)
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> s and s
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

В этих случаях вы можете использовать логическую и функцию из NumPy, которая выполняет поэлементноand (или or):

>>> np.logical_and(np.array([False,False,True,True]), np.array([True, False, True, False]))
array([False, False,  True, False])
>>> np.logical_or(np.array([False,False,True,True]), np.array([True, False, True, False]))
array([ True, False,  True,  True])

Если вы имеете дело только с логическими массивами , вы также можете использовать двоичные операторы с NumPy, они выполняют поэлементно(но также двоичные) сравнения:

>>> np.array([False,False,True,True]) & np.array([True, False, True, False])
array([False, False,  True, False])
>>> np.array([False,False,True,True]) | np.array([True, False, True, False])
array([ True, False,  True,  True])

(1)

То, что вызов bool для операндов должен возвращать True или False, неполностью правильно.Это просто первый операнд, который должен возвращать логическое значение в методе __bool__:

class Test(object):
    def __init__(self, value):
        self.value = value

    def __bool__(self):
        return self.value

    __nonzero__ = __bool__  # Python 2 compatibility

    def __repr__(self):
        return "{self.__class__.__name__}({self.value})".format(self=self)

>>> x = Test(10) and Test(10)
TypeError: __bool__ should return bool, returned int
>>> x1 = Test(True) and Test(10)
>>> x2 = Test(False) and Test(10)

Это потому, что and фактически возвращает первый операнд, если первый операнд оценивается как False, а если он оценивается как True, то он возвращает второй операнд:

>>> x1
Test(10)
>>> x2
Test(False)

Аналогично для or но наоборот:

>>> Test(True) or Test(10)
Test(True)
>>> Test(False) or Test(10)
Test(10)

Однако, если вы используете их в операторе if, if также неявно вызовет bool для результата.Так что эти тонкие моменты могут не иметь отношения к вам.

10 голосов
/ 10 июня 2014

Я выбрал чисто математическое решение:

def front_back(a, b):
  return a[:(len(a)+1)//2]+b[:(len(b)+1)//2]+a[(len(a)+1)//2:]+b[(len(b)+1)//2:]
8 голосов
/ 12 ноября 2016

Вы используете and и or для выполнения логических операций, как в C, C ++. Как буквально and это && и or это ||.


Взгляните на этот забавный пример,

Скажем, вы хотите построить логические ворота в Python:

def AND(a,b):
    return (a and b) #using and operator

def OR(a,b):
    return (a or b)  #using or operator

Теперь попробуйте позвонить им:

print AND(False, False)
print OR(True, False)

Будет выведено:

False
True

Надеюсь, это поможет!

5 голосов
/ 25 мая 2011

Возможно, это не лучший код для этой задачи, но работает -

def front_back(a, b):

 if len(a) % 2 == 0 and len(b) % 2 == 0:
    print a[:(len(a)/2)] + b[:(len(b)/2)] + a[(len(a)/2):] + b[(len(b)/2):]

 elif len(a) % 2 == 1 and len(b) % 2 == 0:
    print a[:(len(a)/2)+1] + b[:(len(b)/2)] + a[(len(a)/2)+1:] + b[(len(b)/2):] 

 elif len(a) % 2 == 0 and len(b) % 2 == 1:
     print a[:(len(a)/2)] + b[:(len(b)/2)+1] + a[(len(a)/2):] + b[(len(b)/2)+1:] 

 else :
     print a[:(len(a)/2)+1] + b[:(len(b)/2)+1] + a[(len(a)/2)+1:] + b[(len(b)/2)+1:]
0 голосов
/ 16 мая 2019

В операторе «If» в Python вы должны использовать и, или, а не , и это эквивалентно &&, ||,! логическим операторам, которые используются в других программах языки

0 голосов
/ 03 марта 2018

Достаточно одного & (не двойного &&) или, как показывает верхний ответ, вы можете использовать 'и'. Я также нашел это в пандах

cities['Is wide and has saint name'] = (cities['Population'] > 1000000) 
& cities['City name'].apply(lambda name: name.startswith('San'))

если мы заменим «&» на «и», это не сработает.

0 голосов
/ 04 февраля 2017

Использование «а» в условных выражениях. Я часто использую это при импорте в Jupyter Notebook:

def find_local_py_scripts():
    import os # does not cost if already imported
    for entry in os.scandir('.'):
        # find files ending with .py
        if entry.is_file() and entry.name.endswith(".py") :
            print("- ", entry.name)
find_local_py_scripts()

-  googlenet_custom_layers.py
-  GoogLeNet_Inception_v1.py
...