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",
#   ]
# }

더 알아보기 (Learn more)