为什么我的if语句不能正常工作?

时间:2019-06-06 14:24:08

标签: python class for-loop if-statement

伙计们,我在研究if语句中的if语句时遇到了一些麻烦。我简化了该问题的代码,因为问题的核心保持不变,并且更易于理解: 所以可以说我创建了两个类,一个用于苹果,一个用于香蕉。 它们的属性基本相同(名称,颜色和价格)。

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运行该代码时,即使Banana1与Apple1的价格相同,因此也将得到“ Apple2”,因此应将其命名为“ 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 :(得分:0)

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)

如果您只想更改第一个匹配项的名称,则希望循环结束时需要使用breakreturn

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)

答案 1 :(得分:0)

“关于计算机的好消息是他们按照您告诉他们的方式去做。坏消息是计算机按照您告诉他们的方式去做。” -泰德·尼尔森

  

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

如果要在匹配价格或颜色后停止循环,请使用Python的break statement

编辑:

P.S。您可以删除条件语句的else: pass部分。此行为与省略else子句相同。