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

2024-09-28 17:29:09 发布

您现在位置:Python中文网/ 问答频道 /正文

嘿,伙计们,我在用python编写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]

到目前为止还不错。我想为banana类定义一个方法,首先检查banana的价格是否与apple对象的价格相同。如果是这样的话,香蕉应该取代苹果的名字(同样,在这段代码中它没有任何意义,但是它与我正在工作的实际项目相关)。第二,该方法应该检查香蕉是否与一个苹果对象具有相同的颜色,然后接管该苹果名称(我对该名称使用了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()

Tags: 代码nameself苹果appleifdef语句
2条回答

“关于计算机的好消息是,它们按照你告诉它们的去做。坏消息是他们按照你的吩咐去做。” -泰德·纳尔逊

Shouldn't the if statement have priority over the elif statement?

是的!是的!你意外行为的原因不是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的^{} statement。你知道吗

编辑:

另外,你可以删除条件的else: pass部分。此行为与省略else子句相同。你知道吗

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)

相关问题 更多 >