簡體   English   中英

為什么我的if語句不能正常工作?

[英]Why doesn`t my if statement work correctly?

嘿伙計們,我正在使用python中的if語句遇到一些問題。 我簡化了這個問題的代碼,因為問題的核心保持不變,這使得它更容易理解:所以我想創建兩個類,一個用於Apples,一個用於Bananas。 它們的屬性基本相同(名稱,顏色和價格)。

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()

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)

“關於計算機的好消息是,他們按照你告訴他們要做的去做。壞消息是,他們做了你告訴他們做的事情。” - 泰德尼爾森

if語句不應優先於elif語句嗎?

是! 它確實! 您的意外行為的原因不是if / elif條件的順序,而是您循環Apple_List

以下是evaluate方法的流程:

  • Apple1循環啟動
    • “Apple1”的價格是否與“Banana1”相同? 是!
    • self.name更改為“ self.name ”。
  • Apple1的循環結束
  • Apple2循環啟動
    • “Apple2”的價格與“Banana1”相同嗎? 沒有。
    • “Apple2”與“Banana1”顏色相同嗎? 是!
    • 更改self.name為“Apple2”。
  • 循環與Apple2結束

如您所見, if語句確實具有優先級,但分配self.name不會導致循環結束。 它將轉移到Apple2,其中self.name在匹配顏色后重新分配。

如果要在匹配價格或顏色后停止循環,請使用Python的break語句

編輯:

PS你可以刪除else: pass條件的一部分。 此行為與省略else子句相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM