xingdongadminer 发表于 2020-10-12 08:04:48

输入年份 算天干地支生肖

各位大神:在网上看到一段代码 输入年份 自动计算天干地支。
myyear = input('请输入年份:')
myyear = int(myyear)
tiangan_list =['甲','乙','丙','丁','戊','己','庚','辛','壬','癸']
dizhi_list =['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥']
shengxiao_list =['鼠','牛','虎','兔','龙','蛇','马','羊','猴','鸡','狗','猪']
for i in range(myyear,myyear+12):
    tiangan =tiangan_list[(i-3) % 10-1]
    dizhi=dizhi_list[(i-3) % 12-1]
    shengxiao = shengxiao_list[(i % 12)-3-1]
    tgdz =tiangan+dizhi
    print(i,tgdz,shengxiao,sep=' ')

请问

tiangan =tiangan_list[(i-3) % 10-1]这句代码中为什么i-3?
shengxiao = shengxiao_list[(i % 12)-3-1]这句代码 为啥i%12后 还要减去3 ?
不懂。
请各位指教

风过无痕1989 发表于 2020-10-12 09:04:46

本帖最后由 风过无痕1989 于 2020-10-12 09:09 编辑

我不懂 Python ,但算天干时,月份是从3月份开始算的,1月及2月作为13月和14月

      天干地支纪年计算方法
  (1)将十天干、十二地支编号。如下:
  甲 乙 丙 丁 戊 己 庚 辛 壬 癸
  4 5 6 7 8 9 0 1 2 3
  子 丑 寅 卯 辰 巳 午 未 申 酉 戌 亥
  4 5 6 7 8 9 10 11 0 1 2 3
  (2)计算时,年最后一位的数对应天干的编号、用年数除以12,得到的余数对应地支的编号,合起来就是该年的干支纪年法。
  如2011年:最后一位是1,对应的天干的编号就是“辛”,再用2011除以12得到167余7,对应地支编号为“卯”合起来即2011年为“辛卯”年。

       生肖的计算方法: 诞生年代除以12,取余数.如果能整除,如果能整除,余数为零;按照下列数字表对应生肖动物:0 --猴、1--鸡、2--狗、3--猪、4--鼠、5--牛、6--虎、7--兔、8--龙、9--蛇、10--马、11--羊

       由于 0 对应的是猴,所以,要减法4,也就是你公式中的 (i % 12) - 3 - 1,这样对应的才是12生肖之首的鼠

sunrise085 发表于 2020-10-12 09:40:53

之所以减3,是因为公元元年并不是甲子年,公元4年才是甲子年,所以在把公元年份转为天干地支纪年的时候要先减3。
先减3再求余,和先求余再减3结果是一样的。也就是说   (i % 12)-3和(i-3 )% 12结果是一样的。

wp231957 发表于 2020-10-12 10:08:56

sunrise085 发表于 2020-10-12 09:40
之所以减3,是因为公元元年并不是甲子年,公元4年才是甲子年,所以在把公元年份转为天干地支纪年的时候要先 ...

不一样,前者有负数的可能,而后者则没有

sunrise085 发表于 2020-10-12 10:37:41

wp231957 发表于 2020-10-12 10:08
不一样,前者有负数的可能,而后者则没有

这里计算结果是有差别,我说的是对列表索引无差别
例如:输入14,(i % 12)-3-1 得到的是 -2 ,(i-3 )% 12-1得到的是10,在长度为12 的列表中下标-2和下标10 索引的结果是一样的。

xingdongadminer 发表于 2020-10-12 10:49:44

谢谢 大神们

xingdongadminer 发表于 2020-10-12 10:51:05

sunrise085 发表于 2020-10-12 09:40
之所以减3,是因为公元元年并不是甲子年,公元4年才是甲子年,所以在把公元年份转为天干地支纪年的时候要先 ...

那为啥tiangan =tiangan_list[(i-3) % 10-1]中 还要减去1

sunrise085 发表于 2020-10-12 10:57:07

xingdongadminer 发表于 2020-10-12 10:51
那为啥tiangan =tiangan_list[(i-3) % 10-1]中 还要减去1

列表是从0开始索引的,天干地支,年份都是从1开始的,所以需要减1,不减一的话,都会差一年,这个和那个减3是相似的道理
减3是因为天干地支与公元纪年起始点差三,减1是因为索引起始点与纪年起始点差一

xingdongadminer 发表于 2020-10-12 11:07:04

谢谢 懂了
页: [1]
查看完整版本: 输入年份 算天干地支生肖