在 Julia 中,为什么字符串有时会显示为字符的迭代器而不是集合?
In Julia, why does a string sometimes present as an iterator of characters but not a collection?
在 Julia 中,这些将字符串视为迭代器(传递字符)的示例有效:
number = "1234"
notnumber = "123z"
isgood = all(isdigit, number) # true
isobad = all(isdigit, notnumber) # false
isgood = mapreduce(isdigit, &, number) # also true
isbad = mapreduce(isdigit, &, notnumber) # also false
myhex = mapreduce(codepoint, &, number) # 0x00000030
avector = map(codecode, collect(number))
但这不起作用,尽管 isdigit() 和 codepoint() 具有非常相似的签名:
avector = map(codepoint, number) # causes error
为什么有时需要对字符串使用 collect()?如果答案是因为all()和mapreduce()取iter而map()取collection,请说明区别?
将 collect() 与 map() 一起使用是否错误,因为它会导致更长的执行时间或更大的内存使用量?
原因是map
和filter
对AbstractString
有特殊的实现。他们迭代一个字符串和return一个字符串。因此,在map
中要求你传递的函数returns AbstractChar
。这是一个例子:
julia> x = "a12b3"
"a12b3"
julia> map(uppercase, x)
"A12B3"
和 filter
的类似示例:
julia> filter(isdigit, x)
"123"
现在,如果您不想将字符串作为 map
的结果,而是希望使用向量,则使用 collect
(正如您所注意到的那样昂贵),或使用理解:
julia> [codepoint(c) for c in x]
5-element Vector{UInt32}:
0x00000061
0x00000031
0x00000032
0x00000062
0x00000033
在 Julia 中,这些将字符串视为迭代器(传递字符)的示例有效:
number = "1234"
notnumber = "123z"
isgood = all(isdigit, number) # true
isobad = all(isdigit, notnumber) # false
isgood = mapreduce(isdigit, &, number) # also true
isbad = mapreduce(isdigit, &, notnumber) # also false
myhex = mapreduce(codepoint, &, number) # 0x00000030
avector = map(codecode, collect(number))
但这不起作用,尽管 isdigit() 和 codepoint() 具有非常相似的签名:
avector = map(codepoint, number) # causes error
为什么有时需要对字符串使用 collect()?如果答案是因为all()和mapreduce()取iter而map()取collection,请说明区别?
将 collect() 与 map() 一起使用是否错误,因为它会导致更长的执行时间或更大的内存使用量?
原因是map
和filter
对AbstractString
有特殊的实现。他们迭代一个字符串和return一个字符串。因此,在map
中要求你传递的函数returns AbstractChar
。这是一个例子:
julia> x = "a12b3"
"a12b3"
julia> map(uppercase, x)
"A12B3"
和 filter
的类似示例:
julia> filter(isdigit, x)
"123"
现在,如果您不想将字符串作为 map
的结果,而是希望使用向量,则使用 collect
(正如您所注意到的那样昂贵),或使用理解:
julia> [codepoint(c) for c in x]
5-element Vector{UInt32}:
0x00000061
0x00000031
0x00000032
0x00000062
0x00000033