Python:确定第一、第二、第四个生日

Python:确定第一、第二、第四个生日,python,class,oop,Python,Class,Oop,我刚刚完成了科尔特·斯蒂尔(Colt Steele,Udemy)主持的现代Python训练营的面向对象编程视频练习。该练习使用一个类User,该类具有名字、姓氏和年龄的属性。还有一个类方法birthday(),它祝这个人生日快乐,伴随着他们的年龄 我对生日方法的问题是,它在人的年龄后有一个静态的“th”,如果人是1、61、52等,这就没有意义。我如何确定数字的末尾是1还是2,或者在数字的开头是1?我是否需要创建一个元组来测试年龄 class User: def __init__(self

我刚刚完成了科尔特·斯蒂尔(Colt Steele,Udemy)主持的现代Python训练营的面向对象编程视频练习。该练习使用一个类
User
,该类具有名字、姓氏和年龄的属性。还有一个类方法
birthday()
,它祝这个人生日快乐,伴随着他们的年龄

我对生日方法的问题是,它在人的年龄后有一个静态的
“th”
,如果人是1、61、52等,这就没有意义。我如何确定数字的末尾是1还是2,或者在数字的开头是1?我是否需要创建一个元组来测试年龄

class User:
    def __init__(self, first, last, age):
        self.first = first
        self.last = last
        self.age = age

    def full_name(self):
        return f"{self.first} {self.last}"

    def initials(self):
        return f"{self.first[0]}.{self.last[0]}."

    def likes(self, thing):
        return f"{self.first} likes {thing}"

    def is_senior(self):
        return self.age >= 65

    def birthday(self):
        self.age += 1
        return f"Happy {self.age}th, {self.first}"


user1 = User("Joe", "Smith", 21)
user2 = User("Blanca", "Lopez", 20)

print(user2.is_senior())
print(user2.birthday())
print(user1.age) 

不过,您可以使用
if-else
条件手动检查。大概是这样的:

def birthday(self):
    age = self.age + 1
    age_str = str(age)
    if age // 10 == 1:
        age_str += 'th'
    elif age % 10 == 1:
        age_str += 'st'
    elif age % 10 == 2:
        age_str += 'nd'
    elif age % 10 == 3:
        age_str += 'rd'
    else:
        age_str += 'th'
    return f"Happy " + age_str + ", {self.first}"

不过,您可以使用
if-else
条件手动检查。大概是这样的:

def birthday(self):
    age = self.age + 1
    age_str = str(age)
    if age // 10 == 1:
        age_str += 'th'
    elif age % 10 == 1:
        age_str += 'st'
    elif age % 10 == 2:
        age_str += 'nd'
    elif age % 10 == 3:
        age_str += 'rd'
    else:
        age_str += 'th'
    return f"Happy " + age_str + ", {self.first}"

最简单的做法是:

if self.age%10 == 1:
    # print with st
elif self.age%10 == 2:
    # print with nd
elif self.age%10 == 3:
    # print with rd
else:
    # print with th
首先要做的是查找可能错误的边缘情况。11号会怎么样?13? 21? 101? 111? 找到所有你能找到的并添加逻辑

接下来,寻找一种通过重构简化事情的方法。除了st/nd/rd/th之外,您的四个
print
语句几乎相同,因此将if/elif/else更改为只执行,比如说,
suffix='st'
,然后您可以有一个包含
{suffix}
print
。那重复的
年龄%10
呢?是否值得将其存储在变量中,如
lastdigit
,以避免重复?试试看

另外,还要查看数据结构是否有助于简化逻辑。如果您有一个映射了
{1:st',2:nd',3:rd'}
,您可以只执行
suffix=d.get(lastdigit,'th')
,这看起来更干净。但是,如果你再加上处理“11”之类的问题,这可能就不太可能了。再试试看


最后,这是你可能不止一次需要的东西。可能不在本程序中,但您编写的其他程序可能希望执行“第二步”。因此,将后缀代码提取到函数中。可能是一个接受数字并返回带有数字和后缀的序数字符串。

最简单的方法是:

if self.age%10 == 1:
    # print with st
elif self.age%10 == 2:
    # print with nd
elif self.age%10 == 3:
    # print with rd
else:
    # print with th
首先要做的是查找可能错误的边缘情况。11号会怎么样?13? 21? 101? 111? 找到所有你能找到的并添加逻辑

接下来,寻找一种通过重构简化事情的方法。除了st/nd/rd/th之外,您的四个
print
语句几乎相同,因此将if/elif/else更改为只执行,比如说,
suffix='st'
,然后您可以有一个包含
{suffix}
print
。那重复的
年龄%10
呢?是否值得将其存储在变量中,如
lastdigit
,以避免重复?试试看

另外,还要查看数据结构是否有助于简化逻辑。如果您有一个映射了
{1:st',2:nd',3:rd'}
,您可以只执行
suffix=d.get(lastdigit,'th')
,这看起来更干净。但是,如果你再加上处理“11”之类的问题,这可能就不太可能了。再试试看


最后,这是你可能不止一次需要的东西。可能不在本程序中,但您编写的其他程序可能希望执行“第二步”。因此,将后缀代码提取到函数中。可能是一个接受一个数字,并返回带有数字和后缀的序数字符串。

如果
age
11
结果将是
11st
Oops!我没有看到:D刚刚更新了答案。如果
age
11
结果将是
11st
Oops!我没有看到:D只是更新了答案。