另一种衬里:
((((y % 4) + (int((y - (y % 100)) / y) * ((y % 400) / 100))) - 1) < 0)
这是我为了好玩而拼凑起来的东西(?),它也与 C 1:1 兼容。
(y % 4)
>>>它首先通过典型的 mod-4 检查检查年份是否为闰年。
(int((y - (y % 100)) / y)
>>>然后计算能被 100 整除的年份。如果年份能被 100 整除,则结果为 1,否则结果为 0。
((y % 400) / 100)))
>>>接下来,年份除以 400(然后是 100,如果不是,则返回 1、2 或 3。
这两个值
(int(y - (y % 100)) / y)
&
((y % 400) / 100)))
然后相乘。如果年份不能被 100 整除,则它始终等于 0,否则如果它可以被 100 整除,但不能被 400 整除,则结果为 1、2 或 3。如果它同时能被 100 和 400 整除,则将导致 0。
这个值被添加到(y % 4)
,如果在考虑了边缘情况之后年份是闰年,它才会等于 0。
最后,从剩余的值中减去 1,如果年份是闰年则为 -1,否则为 0、1 或 2。使用小于运算符将此值与 0 进行比较。如果年份是闰年,这将导致 True(或 1,如果在 C 中使用),否则将返回 False(或 0,如果在 C 中使用)。
请注意:这段代码效率极低,难以理解,并且不利于任何试图遵循正确做法的代码。这是我的一个练习,看看我是否可以这样做,仅此而已。
此外,请注意 ZeroDivisionErrors 是输入年份等于 0 的结果,必须加以考虑。
例如,对 1000 次执行的非常基本的 timeit 比较表明,与使用简单 if 语句和取模运算符的等效代码块进行比较时,该单行代码比等效的 if 代码块慢大约 5 倍。
话虽如此,我确实觉得它非常有趣!