如何改善我的笨拙的生日有效性检查代码" (蟒蛇)?

时间:2015-08-29 03:58:22

标签: python

我已经编写了一个代码来检查任何生日输入的有效性。由于我是编程新手,经过几个调试步骤后,代码变得非常难看。这是代码:

month_dict = {'jan':'January',
          'feb':'February',
          'mar':'March',
          'may':'May',
          'jul':'July',
          'sep':'September',
          'oct':'October',
          'dec':'December',
          'apr':'April',
          'jun':'June',
          'aug':'August',
          'nov':'November'}

day = int(raw_input ('Enter your birth day: '))
month = raw_input ("Enter your birth month: ")
year_input = int (raw_input ('Enter your birth year: '))

days_31 = ['jan', 'mar', 'may', 'jul', 'aug', 'oct', 'dec']
days_30 = ['apr', 'jun', 'sep', 'nov']
days_28 = ['feb']

def valid_day_finding ():
    global valid_day
    if month_name in days_31:
        if day > 0 and day < 32:
            valid_day = day
        else:
            valid_day = 'invalid'
    elif month_name in days_30:
        if day >= 1 and day <= 30:
            valid_day = day
        else:
            valid_day = 'invalid'
    elif month_name in days_28:
        if year != 'invalid':
            if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
                if day >= 1 and day <= 29:
                    valid_day = day
                else:
                    valid_day = 'invalid'
            else:
                if day >= 1 and day <= 28:
                    valid_day = day
                else:
                    valid_day = 'invalid'
        else:
            valid_day = 'invalid'
    else:
        valid_day = 'invalid'             
def valid_month_finding():   
    global month_name
    if month in month_dict.keys():
        month_name = month
    else:
        month_name = 'invalid'
def valid_year_finding():
    global year
    if year_input > 1900 and year_input <2020:
        year = year_input
    else:
        year = 'invalid'
def birthday_checking():
    if valid_day != 'invalid' and month_name != 'invalid' and year != 'invalid':
        print 'your birthdate is %d - %s - %d' % (valid_day, month_dict[month_name], year)
    else:
        print 'Your Birthday is invalid'
valid_year_finding()    
valid_month_finding()
valid_day_finding()
birthday_checking()

这段代码非常低效。您可以提出哪些改进代码的建议?提前谢谢。

1 个答案:

答案 0 :(得分:1)

首先,到处使用相同的约定!不要使用单引号,然后无缘无故地引用双引号。这同样适用于制表符与空格,但最好使用制表符进行缩进和空格对齐。以及daymonthyear_input的内容是什么?需要_input吗?不,它只提供命名不一致。

其次,在valid_day_finding()中有很多不需要的代码(即使if year != 'invalid' 一个整数吗?){... year

第三,你单片!获取更多模块化并且不要让validate_birthday()使用全局变量。请改用参数/参数。并且从不按全局范围返回值,如果它们是布尔值,则不要使用字符串/整数来保存它们!这可以引入非常微妙的错误。

首先,days_xxx validate_birthday之外的months_xxx无用,所以他们应该去那里,毕竟应该被命名为month_dict ......而且,month_dict设计很糟糕。它应该将月份名称映射为整数,而不是缩短月份名称!当然,and完全无序。

第五,为避免过多缩进,请在or语句中使用ifdef validate_birthday(day, month, year): month_limits = { 1: 31, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31 } # This won't *ever* be valid! (Negative years mean b.C.) if month <= 0 or month > 12 or day <= 0: return False # The year is leap, so let February 29 be valid if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0: month_limits[2] += 1 return day <= month_limits[month] months = { 'jan': 1, 'feb': 2, 'mar': 3, 'apr': 4, 'may': 5, 'jun': 6, 'jul': 7, 'aug': 8, 'sep': 9, 'oct': 10, 'nov': 11, 'dec': 12 } day = int(raw_input('Enter your birth day: ')) month = months[raw_input('Enter your birth month: ')] year = int(raw_input('Enter your birth year: ')) print 'Your input birthday is{} valid!'.format("n't" if not validate_birthday(day, month, year) else '') 等运算符,而不是根据缩进级别比较单个表达式。

六,不要一直重复自己

因此,鉴于此以及许多其他微妙的东西,代码可能如下所示:

< umbraco:Macro runat="server" Language="razor">
        @{  
            if(@Model.CSection != null)
            {
            string[] nodeIds = @Model.CSection.Split(',');