Julia Language
постижения
Поиск…
Массивное понимание
Основной синтаксис
В подходах массива 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"