首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >蟒蛇的思考

蟒蛇的思考
EN

Code Review用户
提问于 2011-12-15 05:59:50
回答 3查看 286关注 0票数 3

在开始的时候,python编写了一个代码来复制内置的range()。

代码语言:javascript
复制
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

我把它改写成这样。

代码语言:javascript
复制
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背景。我的重点是代码理解。

EN

回答 3

Code Review用户

发布于 2011-12-15 06:28:15

我认为您的代码更直截了当,但其大小有点令人望而生畏。其实我更喜欢原版。它使用的唯一真正的“技巧”是多个赋值。虽然它需要您仔细考虑range的不同情况才能实现它的工作,但这并不是我介意的事情。事实上,如果我要验证它的正确性,那么我就必须花费同样多的时间,因为它的代码太多了。

我倾向于使用一些简洁的代码,但是优雅地处理所有的案例,而不是那些费力地检查每个案例并用特定案例的代码来处理这个案例的代码。这是在任何编程语言中。

票数 3
EN

Code Review用户

发布于 2011-12-16 12:01:12

这太糟了

代码语言:javascript
复制
    while start < stop:
        result.append(start)
        start+=step

不要重用start作为循环的索引。这很让人困惑。这违反了“开始”的意思。

冗长的参数解析是好的,但可以更清楚地说明。不要浪费时间检查<1>3。只需使用if语句即可。

代码语言:javascript
复制
if len(args)==1:...
elif len(args)==2:...
elif len(args)==3:...
else:
    raise TypeError( "Wrong number of arguments" )
票数 3
EN

Code Review用户

发布于 2011-12-16 14:53:29

您已经用匿名参数的可变长度列表替换了三个命名参数,以及将列表位置映射到命名变量的三种独立方法.我想问你为什么你觉得这更清楚。

然后,您将手动对解释器在原始代码中为您处理的变量长度参数列表强制执行约束。

最后,在raise异常的情况下,不需要将以下代码放在else块中:如果您来自C,请将raise更多地看作是早期返回。

例如:

代码语言:javascript
复制
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的公式更好)。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/6858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档