Почему мое заявление if не работает правильно? - PullRequest
0 голосов
/ 06 июня 2019

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

class Apple:                                   
    def __init__(self, name, color, price):
        self.name = name
        self.color = color
        self.price = price

A1=Apple("Apple1", "red", 5)
A2=Apple("Apple2", "yellow", 3)

Apple_List=[A1, A2]


class Banana:
    def __init__(self, name, color, price):
        self.name = name
        self.color = color
        self.price= price

B1=Banana("Banana1","yellow", 5)
B2=Banana("Banana2", "brown", 1)

Banana_List=[B1,B2]

Пока все хорошо.Я хотел определить метод для класса бананов, который должен сначала проверить, является ли цена банана такой же, как для одного из яблочных объектов.Если это так, банан должен взять на себя имя этого яблока (опять же, в этом коде нет никакого смысла, но это актуально для реального проекта, над которым я работаю).Во-вторых, метод должен проверять, имеет ли банан тот же цвет, что и у одного из яблочных объектов, и затем принимать это название яблока (я использовал для этого утверждение elif).Вот как выглядит метод:

def evaluate(self):
    for a in Apple_List:
        if self.price==a.price:
            self.name=a.name

        elif self.color==a.color:
            self.name=a.name

        else:
            pass

    print(self.name)

Теперь, когда я пытаюсь запустить этот код с Banana1, в результате я получаю «Apple2», даже если цена Banana1 такая же, как у Apple1, и поэтому должна бытьназванный "Apple1".Похоже, оператор elif выполняется перед оператором if, поскольку Banana1 имеет тот же цвет, что и Apple2, и принимает его имя.Но не должен ли оператор if иметь приоритет над оператором elif?Извините, если есть очевидное решение этой проблемы, я очень плохо знаком с программированием на Python.Заранее спасибо за помощь!Вот полный код:

class Apple:                                   
    def __init__(self, name, color, price):
        self.name = name
        self.color = color
        self.price = price

A1=Apple("Apple1", "red", 5)
A2=Apple("Apple2", "yellow", 3)

Apple_List=[A1, A2]

class Banana:
    def __init__(self, name, color, price):
        self.name = name
        self.color = color
        self.price= price

    def evaluate(self):
        for a in Apple_List:
            if self.price==a.price:
                self.name=a.name

            elif self.color==a.color:
                self.name=a.name

            else:
                pass

        print(self.name)



B1=Banana("Banana1","yellow", 5)
B2=Banana("Banana2", "brown", 1)

Banana_List=[B1,B2]

B1.evaluate()

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

«Хорошая новость о компьютерах заключается в том, что они делают то, что вы им говорите. Плохая новость заключается в том, что они делают то, что вы им говорите». - Тед Нельсон

Разве оператор if не должен иметь приоритет над оператором elif?

Да! и это делает! Причиной вашего неожиданного поведения является не порядок условий if / elif, а тот факт, что вы зацикливаетесь на Apple_List.

Вот как протекает ваш метод evaluate:

  • Цикл с Apple1 запускается
    • У "Apple1" такая же цена, как у "Banana1"? Да!
    • Измените self.name на «Apple1».
  • Петля с концами Apple1
  • Цикл с Apple2 запускается
    • У «Apple2» такая же цена, как у «Banana1»? Нет.
    • Имеет ли "Apple2" тот же цвет, что и "Banana1"? Да!
    • Измените self.name на «Apple2».
  • Петля с концами Apple2

Как видите, оператор if имеет приоритет, но назначение self.name не приводит к завершению цикла. Он перейдет к Apple2, где self.name переназначается после соответствия цвета.

Если вы хотите остановить цикл после сопоставления цены или цвета, используйте выражение break Python .

Edit:

P.S. Вы можете удалить часть условных выражений else: pass. Это поведение идентично пропущенному предложению else.

0 голосов
/ 06 июня 2019

B1 соответствует обоим яблокам. Сначала он соответствует A1 и меняет имя на 'Apple1'. Затем он соответствует A2 и меняет свое имя на 'Apple2'. Если вы хотите увидеть это поведение явно, попробуйте:

def evaluate(self):
    for a in Apple_List:
        if self.price==a.price:
            self.name=a.name
        elif self.color==a.color:
            self.name=a.name
        print(self.name)

Если вы хотите вместо этого изменить имя только для первого совпадения, вам нужно либо break, либо return, чтобы завершить цикл:

def evaluate(self):
    for a in Apple_List:
        if self.price==a.price or self.color==a.color:
            self.name=a.name
            break
    print(self.name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...