python题库 No.30 今日何日兮
今日何日兮?阿珍想要知道某年某月某日是这一年的第几天,给出了月份和月份对应天数的字典。
请定义函数calDay(),传入参数年月日year,month,day。
1.判断是否为闰年,若是,则将2月日期改为29;
2.判断年份格式是否正确,正确格式为4位数年份,若不在4位数年份范围,则输出"输入的年份格式错误!";
3.判断月份格式是否正确,月份格式为1-12月,若不在范围内,输出"输入的月份格式错误!";
4.判断日是否在对应月份日的范围内,如4月,若输入的是31,则输出"输入的日格式错误!";
最后计算出2021年的5月20日是这一年的第几天,调用函数并输出结果"2021年5月20日是这一年的第xx天!"。
d = {1:31, 2:28, 3:31, 4:30, 5:31, 6:30, 7:31, 8:31, 9:30, 10:31, 11:30, 12:31}
实际答案:
d = {1:31, 2:28, 3:31, 4:30, 5:31, 6:30, 7:31, 8:31, 9:30, 10:31, 11:30, 12:31}
def calDay(year, month, day):
d = {1:31, 2:28, 3:31, 4:30, 5:31, 6:30, 7:31, 8:31, 9:30, 10:31, 11:30, 12:31}
if (year % 4 == 0) & (year % 100 != 0):
d[2] = 29
else:
d[2] = 28
if (year < 1000) | (year > 9999):
print("输入的年份格式错误!")
if (month < 1) | (month > 12):
print("输入的月份格式错误!")
if (day > d[month]):
print("输入的日格式错误!")
num_day = 0
for i in range(month):
if i == 0:
continue
num_day = num_day + d[i]
num_day = num_day + day
print(f"{year}年{month}月{day}日是这一年的第{num_day}天!")
calDay(2021, 5, 20)
参考答案:

点评:
遇到了局部变量和全局变量的问题,
比如:
#为什么输出的是1呢?我想要的是根据条件输出:
a = 1
def calDay(h):
if h > 5:
a = 2
else:
a = 3
calDay(3)
print(a)
想要在函数里面更改全部变量,需要加上关键字global来声明;
a = 1
def calDay(h):
global a # 🎯 关键:告诉Python"我要修改全局变量a"
if h > 5:
a = 2
else:
a = 3
calDay(3)
print(a) # 现在输出:3 ✅
或者方案二:使用返回值return,好处是更方便、更清晰:
def calDay(h):
if h > 5:
return 2
else:
return 3
a = calDay(3) # 🎯 通过返回值重新赋值
print(a) # 输出:3 ✅
而在标准答案中:
可以直接修改!
原因:
字典和列表是特例,可以直接在函数内部进行增加、修改等操作。
但是不能重新赋值,否则视为重新定义了一个局部变量。
# 列表示例 - 可以直接修改!
my_list = [1, 2, 3]
def modify_list():
my_list.append(4) # ✅ 可以直接修改,不需要global
my_list[0] = 99 # ✅ 可以直接修改元素
modify_list()
print(my_list) # 输出:[99, 2, 3, 4]
# 但是重新赋值就不行:
def reassign_list():
my_list = [5, 6, 7] # ❌ 这会创建新的局部变量
reassign_list()
print(my_list) # 输出:[99, 2, 3, 4](没变!)

浙公网安备 33010602011771号