range 함수
range 함수
range는 시작 값(start), 한계 값(limit), 단계 값(step)을 사용해 숫자 리스트를 생성하는 함수예요.
range(max)
range(start, limit)
range(start, limit, step)
start와 step 인자는 생략할 수 있는데, 생략하면 start는 0으로 기본값이 정해지고, step은 limit가 start보다 큰지 작은지에 따라 1 또는 -1로 기본값이 정해져요.
결과 리스트는 주어진 start 값에서 시작해, 그 결과가 limit보다 같거나 커질 때까지 step을 반복해서 더하면서 만들어져요. 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
수열이 메모리에 실제 리스트로 생성되기 때문에, Terraform은 결과 수열이 1024개를 넘지 않도록 인위적인 제한을 두어요. 예를 들어 매우 큰 값이 limit로 실수로 전달되거나 매우 작은 값이 step으로 전달되어 메모리가 무한정 사용되는 것을 막기 위한 것이에요. 위 알고리즘이 1025번째 숫자를 수열에 추가하려고 하면 함수는 즉시 오류와 함께 종료돼요.
가능하면 range를 만드는 대신 기존 컬렉션을 반복하는 것을 권장해요. 다만, 컬렉션 조작 함수나 for 표현식에서 다른 컬렉션과 결합할 때는 작은 숫자 수열을 만드는 것이 유용할 때도 있어요.
출처: 문서
본문
예제
> 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",
# ]
# }
더 알아보기 (Learn more)
format— 숫자와 다른 값을 문자열로 형식화해요.