gpt4 book ai didi

Julia splat 运算符拆包

转载 作者:行者123 更新时间:2023-12-04 16:10:39 26 4
gpt4 key购买 nike

在 Python 中,可以使用 * 运算符来解包可迭代对象。

In [1]: head, *tail = [1, 2, 3, 4, 5]

In [2]: head
Out[2]: 1

In [3]: tail
Out[3]: [2, 3, 4, 5]

我想在 Julia 中产生相同的行为。我认为等效的 ... 运算符可以工作,但它似乎只是在这种情况下产生错误。

julia> head, tail... = [1, 2, 3, 4, 5]
ERROR: syntax: invalid assignment location "tail..."

我能够使用以下方法产生我想要的结果,但这是一个丑陋的解决方案。

julia> head, tail = A[1], A[2:end]
(1,[2,3,4,5])

我能否使用 splat (...) 运算符解压数组,使 tail 包含 head 之后的其余项目?如果不是,最干净的替代品是什么?


编辑: 此功能已在 #2626 中提出.看起来它将成为 1.0 版本的一部分。

最佳答案

从 Julia 1.6 开始

It is now possible to use ... on the left-hand side of destructured assignments for taking any number of items from the front of an iterable collection, while also collecting the rest.

分配前两项而忽略其余项的示例:

julia> a, b, c... = [4, 8, 15, 16, 23, 42]
# 6-element Vector{Int64}:
# 4
# 8
# 15
# 16
# 23
# 42

julia> a
# 4

julia> b
# 8

julia> c
# 4-element Vector{Int64}:
# 15
# 16
# 23
# 42

This syntax is implemented using Base.rest, which can be overloaded to customize its behavior.

重载示例 Base.rest(s::Union{String, SubString{String}}, i::Int)使用 Vector{Char} 而不是默认的 SubString:

julia> a, b... = "hello"
julia> b
# "ello"

julia> Base.rest(s::Union{String, SubString{String}}, i=1) = collect(SubString(s, i))
julia> a, b... = "hello"
julia> b
# 4-element Vector{Char}:
# 'e': ASCII/Unicode U+0065 (category Ll: Letter, lowercase)
# 'l': ASCII/Unicode U+006C (category Ll: Letter, lowercase)
# 'l': ASCII/Unicode U+006C (category Ll: Letter, lowercase)
# 'o': ASCII/Unicode U+006F (category Ll: Letter, lowercase)

关于Julia splat 运算符拆包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42335661/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com