python-3.x 这个检查年龄的代码有什么问题?

k2fxgqgv  于 2022-11-26  发布在  Python
关注(0)|答案(1)|浏览(123)

我想知道输入的出生日期是18岁以上还是18岁以下。

def is_under_18(birth):
now = date.today()
return (
    now.year - birth.year < 18
    or now.year - birth.year == 18 and (
        now.month < birth.month 
        or now.month == birth.month and now.day <= birth.day
    )
)

然后道:

year = int(input("Year born: "))
month = int(input("Month born: "))
day = int(input("Day born: "))`
birth = date(year,month,day)

if is_under_18(birth):
    print('Under 18')
else:
    print('Adult')

但是,唯一的问题是,假设我添加了一个生日为2004年11月25日的用户。程序允许我添加,因为它不计算月份。如果我添加了一个生日为2005年1月1日的用户,它不允许我添加,因为2022-2005=17。

pbwdgjma

pbwdgjma1#

你的原始代码似乎没有你提到的日期问题,但确实有一个bug,因为2004年11月22日是“18岁以下”,而今天的日期是2022年11月22日(18岁生日)。请使用now.day < birth.day代替。
但如果你计算生日需要18通过取代今天的年份少18,然后直接比较日期,你不必有一个复杂的比较:

from datetime import date

def is_under_18(birth):
    # today = date.today()
    today = date(2022,11,22) # for repeatability of results
    born_on_or_before = today.replace(year=today.year - 18)
    return birth > born_on_or_before

print(f'Today is {date.today()}')
for year,month,day in [(2004,11,21), (2004,11,22), (2004,11,23), (2004,11,25), (2005,1,1)]:
    birth = date(year,month,day)

    if is_under_18(birth):
        print(f'{birth} Under 18')
    else:
        print(f'{birth} Adult')

输出量:

Today is 2022-11-22
2004-11-21 Adult
2004-11-22 Adult
2004-11-23 Under 18
2004-11-25 Under 18
2005-01-01 Under 18

相关问题