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

Использование оператора AND и NOT в Python

Вот мой собственный класс, который у меня есть, который представляет собой треугольник. Я пытаюсь написать код, который проверяет, больше ли self.a, self.b и self.c больше 0, что означает, что у меня есть Angle, Angle, Angle.

Ниже вы увидите код, который проверяет A и B, однако, когда я использую только self.a != 0, тогда он отлично работает. Я считаю, что я не использую & правильно. Есть идеи? Вот как я его называю: print myTri.detType()

class Triangle:

    # Angle A To Angle C Connects Side F
    # Angle C to Angle B Connects Side D
    # Angle B to Angle A Connects Side E

    def __init__(self, a, b, c, d, e, f):
        self.a = a
        self.b = b
        self.c = c
        self.d = d
        self.e = e
        self.f = f

    def detType(self):
        #Triangle Type AAA
        if self.a != 0 & self.b != 0:
            return self.a

        #If self.a > 10:
            #return AAA

        #Triangle Type AAS

        #elif self.a = 0:
            #return AAS

        #Triangle Type ASA

        #Triangle Type SAS

        #Triangle Type SSS  

        #else:
            #return unknown
4b9b3361

Ответ 1

Вы должны написать:

if (self.a != 0) and (self.b != 0) :

"&" - бит-мудрый оператор и не подходит для булевых операций. Эквивалент "&&" есть "и" в Python.

Более короткий способ проверить, что вы хотите, использовать оператор "in" :

if 0 not in (self.a, self.b) :

Вы можете проверить, является ли что-то частью итерабельного с "in" , оно работает для:

  • кортежей. I.E: "foo" in ("foo", 1, c, etc) вернет true
  • Списки. I.E: "foo" in ["foo", 1, c, etc] вернет true
  • Строки. I.E: "a" in "ago" вернет true
  • Dict. I.E: "foo" in {"foo" : "bar"} вернет true

В качестве ответа на комментарии:

Да, использование "in" выполняется медленнее, так как вы создаете объект Tuple, но на самом деле производительность здесь не проблема, плюс читаемость имеет большое значение в Python.

Для проверки треугольника легче читать:

0 not in (self.a, self.b, self.c)

Чем

(self.a != 0) and (self.b != 0) and (self.c != 0) 

Это проще для рефакторинга.

Конечно, в этом примере это действительно не так важно, это очень простой фрагмент. Но этот стиль приводит к Pythonic-коду, что приводит к более счастливому программисту (и похуде, улучшению сексуальной жизни и т.д.) В больших программах.

Ответ 2

Используйте ключевое слово and, а не &, потому что & - бит-оператор.

Будьте осторожны с этим... так, чтобы вы знали, что на Java и С++ оператор & ТАКЖЕ является оператором бит. Правильный способ выполнения логического сравнения на этих языках - &&. Аналогично | является оператором бит, а || является булевым оператором. В Python and и or используются для булевых сравнений.

Ответ 3

Он назвал and и or в Python.