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)

参考答案:
image

点评:
遇到了局部变量和全局变量的问题,
比如:

#为什么输出的是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](没变!)
posted @ 2025-12-21 20:19  居哥wxg  阅读(0)  评论(0)    收藏  举报