【问题标题】:Understanding interval function and its parameters in python Hetland's book example在 python Hetland 的书例中理解区间函数及其参数
【发布时间】:2020-05-24 15:03:35
【问题描述】:

从 Hetland 的 python 书中获得了这个示例函数。

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

if 语句中的两个开始都在做什么?为什么会出现两次?我将后者的开头更改为 int,并将列表的长度更改为该 int。

我似乎也无法理解交互部分。在示例中,start = 10。因此,当迭代时......当 10

【问题讨论】:

    标签: python loops while-loop parameters iteration


    【解决方案1】:

    赋值应该被解析为

    (start, stop) = (0, start)
    

    interval(10) 等价于interval(0, 10)。尽管第一个参数的 namestart,但如果只提供一个参数,它实际上是 stop 值。

    while 循环相当于更直接的for 循环

    for i in range(start, stop + 1, step):
        result.append(i)
    

    除了interval 之外,startstopstep 都具有int 以外的类型。


    更好的设计可能是要求使用仅限关键字的参数,以便函数体中每个参数的使用方式没有歧义:

    def interval(*, start=0, stop, step=1):
        result = []
        while start < stop:
            result.append(start)
            start += step
        return result
    

    现在您可以拨打interval(stop=10)interval(start=3, stop=10);无论哪种方式,参数start 实际上都是两种情况下的起始值。不过,这是一种权衡,因为您不能再为最常见的用例编写 interval(10)

    【讨论】:

    • 哦,所以它类似于while 0 &lt; 10 但是,为什么参数是这样构造的。我不确定我以前是否在书中遇到过。我认为除非明确说明该论点,否则它将是有序的。第二个示例,interval(1, 5) 有意义并遵循顺序。为什么如果只有一个参数,它被分配到停止而不是开始?
    • 它模拟了range 的工作方式。 0 是一个很好的隐含起点;没有很好的隐含停止点。
    • 你也不能用不同的签名覆盖函数;你不能分别定义def interval(stop)def interval(start, stop),这就是为什么你会被一个参数卡住,它的语义会根据参数的传递方式而改变。
    • 啊,是的,范围有默认值。开始和步骤是可选的。谢谢你的解释。