摩擦哥 发表于 2020-11-5 21:52:41

Python第五讲,课后习题,判断是否为闰年!

temp = input('请输入一个年份:')
while not temp.isdigit():
    temp = input("抱歉,您的输入有误,请输入一个整数:")

year = int(temp)
if year/400 == int(year/400):
    print(temp + ' 是闰年!')
else:
    if (year/4 == int(year/4)) and (year/100 != int(year/100)):
      print(temp + ' 是闰年!')
    else:
      print(temp + ' 不是闰年!')

在这里从第二行代码开始就有点不太明白是什么意思了,我知道是要开始循环了,但是循环的not temp.isdigit():,这里表示的是循环所有字符都为整数吗?

还有year/400这里是表示的是计算闰年的方式吗?

if (year/4 == int(year/4)) and (year/100 != int(year/100)):,这一句也不太明白是什么意思!

请大神们指教!!

昨非 发表于 2020-11-5 21:57:30

not temp.isdigit():,
这里时判断输入为数字组成,因为下面需要转化为int型,如果含有数字以外的内容会出错

year/400 == int(year/400):
这句的意思是,year可以整除400

if (year/4 == int(year/4)) and (year/100 != int(year/100))
这句的意思时,可以被四百整除却不能被100整除

昨非 发表于 2020-11-5 21:58:02

闰年分为普通闰年和世纪闰年。
普通闰年:公历年份是4的倍数的,且不是100的倍数,为普通闰年(如2004年、2020年就是闰年)。
世纪闰年:公历年份是整百数的,必须是400的倍数才是世纪闰年(如1900年不是世纪闰年,2000年是世纪闰年)

jackz007 发表于 2020-11-5 22:27:22

temp = input('请输入一个年份:')                         # temp 内容是一个字符串
while not temp.isdigit():                              # 如果字符串 temp 不是全部由数字字符构成就一直循环
    temp = input("抱歉,您的输入有误,请输入一个整数:") # 重新从键盘获取 temp
# 代码能够执行到这里,说明 temp 已经是全部由数字字符构成的字符串
year = int(temp)                                       # 从 temp 中提取整型数,保存到变量 year 中
if year/400 == int(year/400):                            # 如果 year 能被 400 整除
    print(temp + ' 是闰年!')
else:                                                    # 否则
    if (year/4 == int(year/4)) and (year/100 != int(year/100)):# 如果 year 可以被 4 整除,同时,又不能被 100 整除
      print(temp + ' 是闰年!')
    else:                                                      # 否则
      print(temp + ' 不是闰年!')

笨鸟学飞 发表于 2020-11-5 22:32:26

1、not temp.isdigit():
temp.isdigit()字符串的方法函数,如果字符串中至少有一个字符并且所有字符都是数字则返回 True,否则返回 False
详解:字符串的方法及注释,《零基础入门学习Python》,Python交流,鱼C论坛 - Powered by Discuz!
https://fishc.com.cn/forum.php?mod=viewthread&tid=38992&extra=page%3D1%26filter%3Dtypeid%26typeid%3D403

not表示对temp.isdigit()返回值取反,例如temp.isdigit()结果为Ture,则not temp.isdigit()结果为False

2、if year/400 == int(year/400)
(1)能整除400的是闰年,而且是世纪闰年(自行百度闰年的概念)
(2)这个语句的意思是,year/400如果不能整除,则结果是小数,int(year/400)则是取year/400计算结果的整数部分。
例如year = 2020,year/400 结果是5.05,而int(year/400)结果是5,通过这个可以判断是否能整除了

3、if (year/4 == int(year/4)) and (year/100 != int(year/100))
其他的同2的详解。
and表示并且,!=表示不等于
这句翻译成下:如果(条件1)并且(条件2)
也就是说,如果能整除4并且不能整除100

jackz007 发表于 2020-11-5 22:41:21

本帖最后由 jackz007 于 2020-11-5 22:48 编辑

      判断闰年,楼主提供的代码非常非常蹩脚,特别是判断整除的方法根本就不可取,我这里提供一个好得多的版本谨供楼主参考
#coding:gbk

while True :                                              # 死循环,如果不使用 break 语句退出,将一直循环
    try:                                                # 试探风险
      year = int(input('请输入一个年份:') . strip())   # 风险语句,当键入内容无法使用 int() 函数提取出整型数时,将会出错,然后直接跳到 except 语句处继续执行。
      break                                             # 代码执行到这里时,说明已经成功提取到了变量 year,所以,退出循环
    except:
      print('请输入整型数!\n')
                                                          # 代码执行到这里时,说明已经成功提取到了变量 year
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:#如果 year 能被 4 整除,同时不能被 100 整除,或者,year 能够被 400 整除
    print(year , '是闰年')
else:
    print(year , '不是闰年')

kogawananari 发表于 2020-11-6 01:10:52

每400年中有97年里面二月多一天{:10_289:}

摩擦哥 发表于 2020-11-7 13:16:12

昨非 发表于 2020-11-5 21:58
闰年分为普通闰年和世纪闰年。
普通闰年:公历年份是4的倍数的,且不是100的倍数,为普通闰年(如2004年、 ...

谢谢您的解答,对于这几行代码,已经基本上能够理解, 还顺便给科普了下闰年的特性和算法,很透彻清晰。

摩擦哥 发表于 2020-11-7 13:17:55

笨鸟学飞 发表于 2020-11-5 22:32
1、not temp.isdigit():
temp.isdigit()字符串的方法函数,如果字符串中至少有一个字符并且所有字符都是 ...

谢谢您的解答,此次解答条理清晰,话语通俗易懂,很容易理解!

jackz007 发表于 2020-11-7 13:23:05

本帖最后由 jackz007 于 2020-11-7 16:42 编辑

kogawananari 发表于 2020-11-6 01:10
每400年中有97年里面二月多一天

      公元 1582 年 10 月 4 日以前推行的是儒略历,这种历法以 100 年为周期,每 4 年一闰,100 年 25 闰,400 年 100 闰,从这一天的次日,也就是 1582 年 的 10 月 15 日起(1582 年 10 月 5 - 14 日一共 10 天在日历上从来就没有存在过,用于消除前期历法累积的误差),开始采用现在的格里历,格里历以 400 年为周期,按每 4 年一闰,但是, 扣除其中 100、200、300 的三个闰年,这才有了每 400 年 97 闰的结果。
页: [1]
查看完整版本: Python第五讲,课后习题,判断是否为闰年!