如果 x > y,range(x, y) 的输出是什么?

What would be the output of range(x, y) if x > y?

xy为两个整数:

如果 x > y 在 Python 中被考虑,range(x, y) 会如何?

我尝试了以下代码:

for i in range(10, 3):
    print(i)

我认为 range(10, 3) 应该被视为列表 [0, 3, 6, 9],但是这部分代码没有渲染任何东西。

range 的签名是

range(start, stop[, step])

range(10, 3)startstop 分别设置为 10 和 3,因此如果您要提供 step 参数,您需要提供 start 参数:

In [1]: range(0, 10, 3) # list(range(0, 10, 3)) in Python3+
Out[1]: [0, 3, 6, 9]

步骤的默认值为 1 并且(引用我之前链接的文档页面)

For a positive step, the contents of a range r are determined by the formula r[i] = start + step*i where i >= 0 and r[i] < stop.

range(10, 3) 是空的,因为 r[i] < stop 从一开始就是假的 (r[0]10 + 1*0 = 10 并且 10 大于 3).

你有两个选择:

  1. 重新排列输入值,

    range(0, 10, 3)     # => (0, 3, 6, 9)
    
  2. 编写一个包装函数,为您重新排列它们:

    def safe_range(a, b):
        return range(0, max(a,b), min(a,b))
    
    safe_range(3, 10)   # => (0, 3, 6, 9)
    

编辑: 想了想,我明白了;你正在尝试做类似

的事情
range({start=0,} stop, step)

但是如果你只给出两个值,就无法区分它和

range(start, stop, {step=1})

为了解决这种歧义,Python 语法要求默认值参数只能出现在所有位置参数之后 - 也就是说,第二个示例有效 Python,第一个无效。

range() 只有两个参数将这些参数解释为 startstop。来自 range() function documentation:

range(stop)
range(start, stop[, step])

请注意,[, step] 在第二种形式中是可选的。通过提供小于或等于 startstop 而将 step 保留为默认值 1,您创建了一个空范围。该文档明确将此案例作为给出的示例之一:

>>> range(1, 0)
[]

Python 3 version of the documentation 更明确一点:

A range object will be empty if r[0] does not meet the value constraint.

如果您想提供一个 step 值,您 必须 指定开始:

for i in range(0, 10, 3):

Python这里拒绝猜测;对 startstop 参数使用变量都有合法用途,其中给定算法的某些运行,停止值最终等于或低于开始值;在这种情况下,这样的代码 期望 range() 为空。