python 重复函数 3 次
python repeats function 3 times
这段代码的目的是:
- 要求用户输入他的名字。
- 要求用户输入他的出生日期
- 代码会将姓名拆分为名字、中间名和姓氏
- 代码将以年、月、日计算年龄。
- 代码会将所有这些数据存储在字典中
代码如下:
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)
您的 name
和 age
函数 re-prompt 用户每次调用它们时都会获得新的输入。缓存它们可能会更好;您可以通过将其存储为实例属性来自己完成此操作,或者只使用 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
您分别调用了 self.age
和 self.name
三次。您应该只调用一次,并将结果保存到相关变量中。
也许最好将这些变量设置为实例的属性以供将来使用,但作为对问题的最低限度的修复,这里有一个只执行一次相关调用的 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)
我建议您使用实例并调用 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)
所以当你实例化class对象时,你实际上会初始化你需要的值作为__init__
方法的输入,然后在你需要使用的任何时候使用数据方法,它会存储这些值到变量,直到你重新实例化它。
这段代码的目的是:
- 要求用户输入他的名字。
- 要求用户输入他的出生日期
- 代码会将姓名拆分为名字、中间名和姓氏
- 代码将以年、月、日计算年龄。
- 代码会将所有这些数据存储在字典中
代码如下:
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)
您的 name
和 age
函数 re-prompt 用户每次调用它们时都会获得新的输入。缓存它们可能会更好;您可以通过将其存储为实例属性来自己完成此操作,或者只使用 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
您分别调用了 self.age
和 self.name
三次。您应该只调用一次,并将结果保存到相关变量中。
也许最好将这些变量设置为实例的属性以供将来使用,但作为对问题的最低限度的修复,这里有一个只执行一次相关调用的 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)
我建议您使用实例并调用 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)
所以当你实例化class对象时,你实际上会初始化你需要的值作为__init__
方法的输入,然后在你需要使用的任何时候使用数据方法,它会存储这些值到变量,直到你重新实例化它。