簡體   English   中英

python重復函數3次

[英]python repeats function 3 times

這段代碼的目的是:

  1. 要求用戶輸入他的名字。
  2. 要求用戶輸入他的出生日期
  3. 該代碼會將姓名拆分為名字、中間名和姓氏
  4. 該代碼將以年、月和日為單位計算年齡。
  5. 該代碼將所有這些數據存儲在一個字典中

這是代碼:

from datetime import datetime
from dateutil.relativedelta import relativedelta


    class Test:
        def __init__(self):
            self.today = datetime.today()
    
        def name(self):
            first_name, middle_name, last_name = input("enter your name:\n".title()).split(' ')
            return first_name, middle_name, last_name
    
        def age(self):
            date_of_birth = input("enter your date of birth:\n")
            date_of_birth = datetime.strptime(date_of_birth, "%d/%m/%Y")
            age = relativedelta(self.today, date_of_birth)
            return age
    
        def data(self):
            data = {"first name": self.name()[0],
                    "middle_name": self.name()[1],
                    "last name": self.name()[2],
                    "age years": self.age().years,
                    "age months": self.age().months,
                    "age days": self.age().days}
            print(data)
    
    
    Test().data()

代碼沒有錯誤。

但是名字和年齡的問題每個都重復了三遍。 像這樣的東西

輸入您的出生日期:

26/9/1986

輸入您的出生日期:

26/9/1986

輸入您的出生日期:

26/9/1986

您正在調用age()三次。 你可以調用它一次,然后訪問它的成員:

def data(self):
    name = self.name()
    age = self.age()
    data = {"first name": name[0],
            "middle_name": name[1],
            "last name": name[2],
            "age years": age.years,
            "age months": age.months,
            "age days": age.days}
    print(data)

我建議您使用實例並調用 init 方法本身中的名稱輸入,如下所示:

class Test:
    def __init__(self):
        self.today = datetime.today()
        self.full_name = input("enter your full name:\n".title()).split(' ')
        self.dob = input("enter your date of birth:\n")

    @property
    def name(self):
        first_name, middle_name, last_name = self.full_name
        return first_name, middle_name, last_name

    @property
    def age(self):
        date_of_birth = self.dob
        date_of_birth = datetime.strptime(date_of_birth, "%d/%m/%Y")
        age = relativedelta(self.today, date_of_birth)
        return age

    def data(self):
        data = {"first name": self.name[0],
                "middle_name": self.name[1],
                "last name": self.name[2],
                "age years": self.age.years,
                "age months": self.age.months,
                "age days": self.age.days}
        print(data)

因此,當您實例化類對象時,您將實際初始化所需的值作為__init__方法中的輸入,然后在任何需要使用的時候使用 data 方法,它會將值存儲到變量中,直到您重新實例化它。

您分別調用了self.ageself.name 3 次。 您應該只調用它們一次,並將結果保存到相關變量中。

也許將這些變量設置為實例的屬性以備將來使用可能會很好,但作為對問題的最小修復,這里有一個僅執行一次相關調用的data版本。

    def data(self):

        first_name, middle_name, last_name = self.name()
        
        age = self.age()
        
        data = {"first name": first_name,
                "middle_name": middle_name,
                "last name": last_name,
                "age years": age.years,
                "age months": age.months,
                "age days": age.days}
        print(data)

每次調用時,您的nameage函數都會重新提示用戶進行新的輸入。 緩存它們可能會更好; 您可以通過將其存儲為實例屬性來自己完成此操作,或者僅使用functools.lru_cache

from functools import lru_cache

...

    @lru_cache
    def name(self):
        first_name, middle_name, last_name = input("enter your name:\n".title()).split(' ')
        return first_name, middle_name, last_name

    @lru_cache
    def age(self):
        date_of_birth = input("enter your date of birth:\n")
        date_of_birth = datetime.strptime(date_of_birth, "%d/%m/%Y")
        age = relativedelta(self.today, date_of_birth)
        return age

暫無
暫無

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

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