【问题标题】:What would be the output of range(x, y) if x > y?Python:如果 x>y,range(x,y) 的输出是什么
【发布时间】:2015-04-09 10:18:11
【问题描述】:

设 x 和 y 为两个整数:

在 Python 中如何考虑 range(x,y) 这样的 x>y
我在 python 2.7 和 python 3.3 中都尝试了以下代码:

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

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

【问题讨论】:

  • 默认步长是1,怎么加1才能从10到3呢?
  • 我以为开始是0,这里认为是3但是我认为我忽略了参数的顺序
  • 你应该阅读文档 - 检查range(start, stop[, step])
  • @mounaim:文档给了你两个签名。一个带有 一个 参数,另一个带有 三个 参数*,第三个是可选的。
  • @mounaim:你也可以给出 negative 步骤,并提供x > y 你也会得到一个范围:例如range(10, 3, -1)

标签: python range


【解决方案1】:

range的签名是

范围(开始,停止[,步骤])

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 并且(引用我之前链接的文档页面)

对于一个正的step,范围r的内容由公式r[i] = start + step*i决定其中 i >= 0r[i] .

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

【讨论】:

  • 还添加了答案:“但这部分代码没有呈现任何内容。” (关于 - 我们在做什么)
【解决方案2】:

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

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

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

>>> range(1, 0)
[]

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

如果r[0] 不满足值约束,则范围对象将为空。

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

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

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

【讨论】:

  • 好的,我忘记了第二个 range() 签名中的步骤是可选的,非常感谢@Martjin
【解决方案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,第一个不是。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    相关资源
    最近更新 更多