我已经编写了一个代码来检查任何生日输入的有效性。由于我是编程新手,经过几个调试步骤后,代码变得非常难看。这是代码:
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()
这段代码非常低效。您可以提出哪些改进代码的建议?提前谢谢。
答案 0 :(得分:1)
首先,到处使用相同的约定!不要使用单引号,然后无缘无故地引用双引号。这同样适用于制表符与空格,但最好使用制表符进行缩进和空格对齐。以及day
,month
和year_input
的内容是什么?需要_input
吗?不,它只提供命名不一致。
其次,在valid_day_finding()
中有很多不需要的代码(即使if year != 'invalid'
一个整数吗?){... year
。
第三,你太单片!获取更多模块化并且不要让validate_birthday()
使用全局变量。请改用参数/参数。并且从不按全局范围返回值,如果它们是布尔值,则不要使用字符串/整数来保存它们!这可以引入非常微妙的错误。
首先,days_xxx
validate_birthday
之外的months_xxx
无用,所以他们应该去那里,毕竟应该被命名为month_dict
......而且,month_dict
设计很糟糕。它应该将月份名称映射为整数,而不是缩短月份名称!当然,and
完全无序。
第五,为避免过多缩进,请在or
语句中使用if
和def 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(',');