range 함수
range 함수
range는 시작 값(start), 한계 값(limit), 증감 값(step)을 이용해 숫자 리스트를 만들어내요. 일정한 규칙으로 늘어나는 수열이 필요할 때 쓰는 함수죠.
출처: Packer 공식 문서
본문
range generates a list of numbers using a start value, a limit value, and a step value.
range(max)
range(start, limit)
range(start, limit, step)
start와 step 인자는 생략할 수 있어요. 생략하면 start는 0으로, step은 limit이 start보다 크냐 작냐에 따라 1 또는 -1로 기본값이 정해져요.
결과 리스트는 주어진 start 값에서 시작해 step을 계속 더하다가, 그 결과가 limit과 같거나 limit을 넘는 순간까지 만들어져요.
limit의 해석은 step의 방향에 따라 달라져요. 양수 step이면 다음 숫자가 limit보다 크거나 같아지면 수열이 완성되고, 음수 step이면 작거나 같아지면 완성돼요.
수열 생성 알고리즘은 다음 의사코드를 따라가요:
let num = start
while num < limit: (or, for negative step, num >= limit)
append num to the sequence
num = num + step
return the sequence
수열이 메모리에 실제 리스트로 만들어지기 때문에, Packer는 결과 수열에 숫자를 최대 1024개까지만 허용해요. 예를 들어 limit에 아주 큰 값이나 step에 아주 작은 값을 실수로 넣었을 때 메모리가 무한정 늘어나는 걸 막기 위해서죠. 위 알고리즘이 1025번째 숫자를 수열에 추가하려 하면 함수는 즉시 오류를 내고 끝나요.
가능하면 범위를 새로 만들기보다 이미 있는 컬렉션을 순회하는 걸 권장해요. 다만 작은 숫자 수열을 만드는 건 컬렉션 조작 함수나 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",
# ]
# }