输入:
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:9
和 range
都是区间范围的构造函数,只不过第一个有特殊的语法糖,更好看一些。
用哪个看个人喜好。
构造浮点数区间的时间注意一下就好:
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 个赞