在开始的时候,python编写了一个代码来复制内置的range()。
def interval(start, stop=None, step=1):
if stop is None:
start, stop = 0, start
result = []
i = start
while i < stop:
result.append(i)
i += step
return result我把它改写成这样。
def interval(*args):
if len(args)<1:
raise TypeError('range expected at least 1 arguments, got 0')
elif len(args)>3 :
raise TypeError('range expected at most 3 arguments, got %d' % len(args))
else:
if len(args)==1:
start = 0
stop = args[0]
step = 1
elif len(args)==2:
start=args[0]
stop=args[1]
step=1
elif len(args)==3:
start=args[0]
stop=args[1]
step=args[2]
result = []
while start < stop:
result.append(start)
start+=step
return result我知道我的代码更长,但你们不认为比Hetland的代码更容易掌握/理解吗?不同的人的思想运作方式不同。在我看来,代码更容易理解,因为我来自C背景。我的重点是代码理解。
发布于 2011-12-15 06:28:15
我认为您的代码更直截了当,但其大小有点令人望而生畏。其实我更喜欢原版。它使用的唯一真正的“技巧”是多个赋值。虽然它需要您仔细考虑range的不同情况才能实现它的工作,但这并不是我介意的事情。事实上,如果我要验证它的正确性,那么我就必须花费同样多的时间,因为它的代码太多了。
我倾向于使用一些简洁的代码,但是优雅地处理所有的案例,而不是那些费力地检查每个案例并用特定案例的代码来处理这个案例的代码。这是在任何编程语言中。
发布于 2011-12-16 12:01:12
这太糟了
while start < stop:
result.append(start)
start+=step不要重用start作为循环的索引。这很让人困惑。这违反了“开始”的意思。
冗长的参数解析是好的,但可以更清楚地说明。不要浪费时间检查<1或>3。只需使用if语句即可。
if len(args)==1:...
elif len(args)==2:...
elif len(args)==3:...
else:
raise TypeError( "Wrong number of arguments" )发布于 2011-12-16 14:53:29
您已经用匿名参数的可变长度列表替换了三个命名参数,以及将列表位置映射到命名变量的三种独立方法.我想问你为什么你觉得这更清楚。
然后,您将手动对解释器在原始代码中为您处理的变量长度参数列表强制执行约束。
最后,在raise异常的情况下,不需要将以下代码放在else块中:如果您来自C,请将raise更多地看作是早期返回。
例如:
def interval(*args):
if len(args)<1:
raise TypeError('range expected at least 1 arguments, got 0')
if len(args)>3 :
raise TypeError('range expected at most 3 arguments, got %d' % len(args))
if len(args)==1:
...(虽然S.S.Lott的公式更好)。
https://codereview.stackexchange.com/questions/6858
复制相似问题