Поиск…


Массивное понимание

Основной синтаксис

В подходах массива Julia используется следующий синтаксис:

[expression for element = iterable]

Обратите внимание, что, как и for циклов , все значения = , in и принимаются для понимания.

Это примерно эквивалентно созданию пустого массива и использованию цикла for для push! предметов к нему.

result = []
for element in iterable
    push!(result, expression)
end

однако тип понимания массива настолько узкий, насколько это возможно, что лучше для производительности.

Например, чтобы получить массив квадратов целых чисел от 1 до 10 , может использоваться следующий код.

squares = [x^2 for x=1:10]

Это чистая, лаконичная замена дольше for -loop версии.

squares = []
for x in 1:10
    push!(squares, x^2)
end

Условное определение массива

Перед Julia 0.5 невозможно использовать условия внутри массива. Но это уже не так. В Julia 0.5 мы можем использовать условия в следующих условиях:

julia> [x^2 for x in 0:9 if x > 5] 
4-element Array{Int64,1}:
 36
 49
 64
 81

Источник приведенного выше примера можно найти здесь .

Если мы хотим использовать понимание вложенного списка:

julia>[(x,y) for x=1:5 , y=3:6 if y>4 && x>3 ]
4-element Array{Tuple{Int64,Int64},1}:
 (4,5)
 (5,5)
 (4,6)
 (5,6)

Многомерное понимание массива

Вложенные for циклов могут использоваться для повторения нескольких уникальных итераций.

result = []
for a = iterable_a
    for b = iterable_b
        push!(result, expression)
    end
end

Аналогичным образом, множественные спецификации итераций могут быть предоставлены для понимания массива.

[expression for a = iterable_a, b = iterable_b]

Например, для генерации декартова произведения 1:3 и 1:2 может быть использовано следующее.

julia> [(x, y) for x = 1:3, y = 1:2]
3×2 Array{Tuple{Int64,Int64},2}:
 (1,1)  (1,2)
 (2,1)  (2,2)
 (3,1)  (3,2)

Сглаженные многомерные измерения массива аналогичны, за исключением того, что они теряют форму. Например,

julia> [(x, y) for x = 1:3 for y = 1:2]
6-element Array{Tuple{Int64,Int64},1}:
 (1, 1)
 (1, 2)
 (2, 1)
 (2, 2)
 (3, 1)
 (3, 2)

является сплюснутым вариантом вышеприведенного. Синтаксическая разница заключается в том, что вместо запятой используется дополнительная for .

Понимание генератора

Генератор постижения следует формату , аналогичные постижения массива, но использовать круглые скобки () вместо того , чтобы квадратные скобки [] .

(expression for element = iterable)

Такое выражение возвращает объект Generator .

julia> (x^2 for x = 1:5)
Base.Generator{UnitRange{Int64},##1#2}(#1,1:5)

Аргументы функции

Понимание генератора может быть предоставлено как единственный аргумент функции, без необходимости в дополнительном наборе круглых скобок.

julia> join(x^2 for x = 1:5)
"1491625"

Однако, если предоставляется более одного аргумента, понимание генератора требует собственный набор круглых скобок.

julia> join(x^2 for x = 1:5, ", ")
ERROR: syntax: invalid iteration specification

julia> join((x^2 for x = 1:5), ", ")
"1, 4, 9, 16, 25"


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow