使用expired函数编写函数mayadate()
。该函数有两个参数:一个参数date
,它在公历中取一个日期,一个可选参数separator
,它接受一个包含单个字符的字符串。该函数必须返回玛雅日历中与格里高利历中给定日期对应的日期。要确定Maya日历中的日期,您可以假设公历中的01/01/1970日期对应于Maya日历中的日期12.17.16.7.5。计算自此参考日期以来经过的天数,直至达到请求的日期。 Maya日历中时间段的各个值必须在没有前导零的情况下表示,并使用给定的分隔符彼此分开。如果没有显式传递给函数的分隔符,则该函数必须使用与给定格里高利日期中的数字分隔的相同字符。
我正在尝试解决不同情况的最后一个函数,但它仍然不适用于某些情况,例如它无法使用:
mayadate(date='05-0004-002294', separator='/')
正确答案:'13/14/5/6/18'
Traceback (most recent call last): File <code>, line 131, in mayadate TypeError: object of type 'NoneType' has no len()
如果我试图解决它,其他一些案例就会停止工作。
其他情况:
mayadate('5.4.2051') solution: '13.1.18.15.4'
mayadate('9+10+0002267', '|') solution: '13|12|18|9|3'
mayadate('21 12 2012', separator='+') solution: '13+0+0+0+0'
任何人都可以帮助我吗?
def dmy(n):
'''
>>> dmy('01/01/1970')
(1, 1, 1970)
>>> dmy('20-7-1988')
(20, 7, 1988)
>>> dmy('00012+00012+02012')
(12, 12, 2012)
>>> dmy('21 12 2012')
(21, 12, 2012)
>>> dmy('26.03.2407')
(26, 3, 2407)
'''
new = n.replace('/', " ")
new2 = new.replace('-', " ")
new3 = new2.replace('+', " ")
new4 = new3.replace('=', " ")
new5 = new4.replace('~', " ")
new6 = new5.replace('.', " ")
new7 = new6.replace('#', " ")
new8 = new7.replace('|', " ")
new9 = new8.replace('*', " ")
new10 = new9.replace(':', " ")
k = [int(s) for s in new10.split() if s.isdigit()]
r = tuple(k)
return r
def expired(n):
'''
>>> expired('01/01/1970')
0
>>> expired('20-7-1988')
6775
>>> expired('00012+00012+02012')
15686
>>> expired('21 12 2012')
15695
>>> expired('26.03.2407')
159695
'''
s = dmy(n)
a = s[0]
b = s[1]
c = s[2]
from datetime import date, timedelta
d1 = date(c, b, a) # start date
d2 = date(1970, 1, 1) # end date
delta = d2 - d1
return abs(delta.days)
def mayadate(*args, **kwargs):
'''
>>> mayadate('01/01/1970')
'12/17/16/7/5'
>>> mayadate('20-7-1988',separator='/')
'12/18/15/4/0'
>>> mayadate('00012+00012+02012',separator='-')
'12-19-19-17-11'
>>> mayadate('21 12 2012',separator='+')
'13+0+0+0+0'
>>> mayadate('26.03.2407')
'14.0.0.0.0
'''
args1 = args if args else None
args2 = [kwargs.get(i) for i in ['date', 'separator']]
if args1 is not None:
s = expired(args1[0]) + 1856305
if args2[0] is not None:
s = expired(args2[0]) + 1856305
w = s // 144000
q = s%144000
v = q // 7200
q2 = q%7200
u = q2 // 360
q3 = q2%360
t = q3 // 20
q4 = q3%20
r = q4
k = str()
if args1 is not None:
symbol = "~`|!@#$%^&*()_-+={}[]:>;',</?*-+.' '"
for i in args1[0]:
if i in symbol:
k = str(i)
if args2[0] is not None:
symbol = "~`|!@#$%^&*()_-+={}[]:>;',</?*-+.' '"
for i in args2[0]:
if i in symbol:
k = str(i)
import re
w = re.sub(r"\b0{2}", "", str(w))
v = re.sub(r"\b0{2}", "", str(v))
u = re.sub(r"\b0{2}", "", str(u))
t = re.sub(r"\b0{2}", "", str(t))
r = re.sub(r"\b0{2}", "", str(r))
if args2 is None and len(args1) == 1:
q = str(w) + k + str(v) + k + str(u) + k + str(t) + k + str(r)
return q
if len(args1) == 1 and args2[1] is None:
q = str(w) + k + str(v) + k + str(u) + k + str(t) + k + str(r)
return q
else:
q = str(w) + k + str(v) + k + str(u) + k + str(t) + k + str(r)
char = "~`|!@#$%^&*()_-+={}[]:>;',</?*-+.:' '"
kas = ' '
if args2[1] is not None:
for x in q:
if x in char or x in kas:
q = q.replace(x, args2[1], 4)
return q
if args1 is not None:
for x in q:
if x in char or x in kas:
q = q.replace(x, args1[1], 4)
return q
答案 0 :(得分:0)
问题出在你的电话和你的args处理中。
mayadate(date='05-0004-002294', separator='/')
没有正常的args:他们都是kwargs。因此,在您的函数中,args
为空。您将其转换为None
。后来,你要求它的长度;如错误所述,len(None)
是非法的。
决定如何处理这种情况,并相应地更改代码。