range 함수
range 함수
range 는 시작값(start value), 한계값(limit value), 증분값(step value)을 사용해서 숫자 리스트를 생성해요.
출처: 문서
본문
range 는 시작값, 한계값, 증분값을 사용해서 숫자 리스트를 생성해요.
range(max)
range(start, limit)
range(start, limit, step)
start 와 step 인자는 생략할 수 있어요. 생략하면 start 는 0으로, step 은 limit 이 start 보다 큰지 작은지에 따라 1 또는 -1로 기본 설정돼요.
결과 리스트는 주어진 start 값에서 시작해서 step 을 계속 더해 그 결과가 limit 에 도달하거나 넘어설 때까지 만든 리스트예요. limit 의 해석은 step 의 방향에 따라 달라져요. 양수 step이면 다음 숫자가 limit 이상이 되면 시퀀스가 완성되고, 음수 step이면 이하가 되면 완성돼요.
시퀀스 생성 알고리즘은 다음 의사코드(pseudocode)를 따릅니다:
let num = start
while num < limit: (or, for negative step, num >= limit)
append num to the sequence
num = num + step
return the sequence
시퀀스가 메모리에 실제 리스트로 만들어지기 때문에, Nomad는 결과 시퀀스에 숫자 1024개라는 인위적인 상한을 둬요. 예를 들어 아주 큰 값이 실수로 limit으로 전달되거나 아주 작은 값이 step으로 전달돼서 메모리를 무한정 쓰는 일을 막기 위해서죠. 위 알고리즘이 시퀀스에 1025번째 숫자를 추가하려 하면 이 함수는 즉시 오류와 함께 종료돼요.
가능하면 범위(range)를 만드는 대신 기존 컬렉션을 순회하는 것을 권장해요. 다만 작은 숫자 시퀀스를 만드는 것은 다른 컬렉션과 함께 컬렉션 조작 함수나 for 표현식에서 쓸 때 유용할 때가 있어요.
Examples
> range(3)
[
0,
1,
2,
]
> range(1, 4)
[
1,
2,
3,
]
> range(1, 8, 2)
[
1,
3,
5,
7,
]
> range(1, 4, 0.5)
[
1,
1.5,
2,
2.5,
3,
3.5,
]
> range(4, 1)
[
4,
3,
2,
]
> range(10, 5, -2)
[
10,
8,
6,
]
range 함수는 주로 다른 컬렉션과 함께 써서 특정 개수의 무언가의 인스턴스를 만들 때 유용해요. 예를 들어:
variable "name_counts" {
type = map(number)
default = {
"foo" = 2
"bar" = 4
}
}
locals {
expanded_names = {
for name, count in var.name_counts : name => [
for i in range(count) : format("%s%02d", name, i)
]
}
}
output "expanded_names" {
value = local.expanded_names
}
# Produces the following expanded_names value when run with the default
# "name_counts":
#
# {
# "bar" = [
# "bar00",
# "bar01",
# "bar02",
# "bar03",
# ]
# "foo" = [
# "foo00",
# "foo01",
# ]
# }