区别range()和collect()

输入:
typeof(collect(1:9))
输出:
Vector{Int64} (alias for Array{Int64, 1})
输入:
typeof(range(1,9,step=1))
输出:
StepRange{Int64, Int64}
这两个输出的类型有什么区别吗?两个函数在哪些场合更实用?

julia> 1:9 |> typeof
UnitRange{Int64}

1:9range 都是区间范围的构造函数,只不过第一个有特殊的语法糖,更好看一些。
用哪个看个人喜好。

构造浮点数区间的时间注意一下就好:


collect 基本可以理解为把可迭代的东西转化为一个数组。和区间不是一个层面的东西。

一般来说可以大多数接受迭代器函数都可以指直接传迭代器,不需要手动 collect
循环也可以直接在迭代器上循环。

我个人一般是调试的时候会 collect 看一下中间结果,感觉是用的不多。
或许列表推断用的多一些。

collect(1:9)
[i for i in 1:9]
[println("i=$i") for i in 1:9]

按照文档,collect 可以在转数组的时候同时转一下元素类型,感觉也是用的不多。

help?> collect
search: collect

  collect(element_type, collection)

  Return an Array with the given element type of all items in a collection or iterable. The result has the same shape
  and number of dimensions as collection.

  collect(collection)

  Return an Array of all items in a collection or iterator. For dictionaries, returns Pair{KeyType, ValType}. If the
  argument is array-like or is an iterator with the HasShape trait, the result will have the same shape and number of
  dimensions as the argument.

  Used by comprehensions to turn a generator into an Array.
1 个赞

我是这么理解的:1:9是一个iterator,别名range,实际存储的时候只有首、尾、和间隔信息。这意味着,无论你的iterator用collect展开成普通的数组有多大,iterator本身的大小是固定的。在实际使用时,相比于数组,使用iterator类似于拿计算换空间。现代处理器计算的开销远小于内存访问,所以iterator的使用就更普遍了。

举一个实际的例子。Plots.jl里面许多绘图函数的网格部分允许range输入,就不需要手动生成实际的网格位置,节约了内存。如果你用MATLAB或者Python,以前你会经常使用meshgrid或者ndgrid——现在即便是在MATLAB里面最新的例子都不推荐这么操作了。

如果有误请指正。

1 个赞