在Julia中,为什么字符串有时是字符的迭代器,而不是集合



在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((一起使用是错误的吗?因为这会导致更长的执行时间或更大的内存使用率?

原因是mapfilterAbstractString有一个特殊的实现。它们迭代一个字符串,返回一个字符串。因此,在map中,您传递的函数必须返回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

相关内容

  • 没有找到相关文章

最新更新