Julia 范围的包容性

Inclusivity of Julia ranges

我讨厌范围包括结尾。这是我故意删除范围末尾的示例。

N = 100
for x in 0.0 : 2*pi/N : 2*pi*(N-1)/N
    println(x)
end

有什么办法可以避免这种for循环的丑陋吗?

也许不是最优雅的方式...取前n-1个元素

r = 0.0 : 2*pi/N : 2*pi
r = Iterators.take(r,length(r)-1)

不幸的是,包含范围(和基于 1 的索引)在基本层面上融入了 Julia 的习语。

但是,对于这种特定情况,请注意使用浮点值步进可能会出现问题,因为添加 N 个值可能小于、等于或大于最终值,从而为 for 循环提供不同的结果.尽管 julia tries really hard,但没有办法在所有情况下都做正确的事。作为奖励,仅在范围内使用整数值可以简化事情。您可能需要考虑:

for ix in 0:N-1
    x = ix * 2 * pi / N
    println(x)
end

或者,range() 函数有一个带有 len 参数的形式:

for x in range(0, 2*pi*(N-1)/N, length=n)
    println(x)
end

或者实际上,将此与仅取 (N-1) 的另一个答案结合起来可能会奏效。

您实际上可以定义自己的运算符,例如:

▷(a,b) = a:b-1

现在你可以写:

julia> 3▷6
3:5

Julia 还原生支持数组的自定义索引。有一个软件包 CustomUnitRanges 在这里可能有点矫枉过正。

有,有

N = 100
for x in range(0; step=2π/N, length=N)
    println(x)
end