确定玛雅历法中日期的不同论据

时间:2017-11-28 18:28:04

标签: python

使用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

1 个答案:

答案 0 :(得分:0)

问题出在你的电话和你的args处理中。

mayadate(date='05-0004-002294', separator='/')

没有正常的args:他们都是kwargs。因此,在您的函数中,args为空。您将其转换为None。后来,你要求它的长度;如错误所述,len(None)是非法的。

决定如何处理这种情况,并相应地更改代码。