이터럴,이터레이블

5_wintaek·2025년 1월 16일
0

코테를 풀다가 궁금한게 있어 좀 적어본다.

🤔 arr 는 리스트인데 가장 작은 값을 반환하라 할 때 왜 숫자로 나오는걸까 ?

arr = list(map(int,input().split())) # 8,-5,10
# 여기서 arr 를 출력해보면 -> [8,-5,10]

print(min(arr)) # -5

A : list 안에서 가장 작은 값을 반환하기 때문이다.

🤔 map은 이터러블(반복 가능한 객체)의 모든 항목에 함수를 적용한 결과를 반환한다. a,b,c 할당 부분에서 map 객체에서 값을 하나씩 거내서 각각 a,b,c 변수에 할당하니까 ‘값’이다. 리터럴(값)인건가 ?

a,b,c = map(int,input().split()) # 8,-5,10

print(a,b,c)

A :

우선 이터러블(iterable)은 자료를 반복할 수 있는 객체 를 말하는 것이다.
우리가 흔히 쓰는 배열 역시 이러러블 객체이다.
이때 반환되는 객체는 map 객체이며, 이터레이터이다.

반면에 리터럴은 소스 코드에 직접 나타내는 값 그 자체를 의미한다. 예를들어, 10, 3.14, "hello", [1, 2, 3], (4, 5), { 'a': 1, 'b': 2 } 등은 모두 리터럴이다. 이들은 코드에 직접 값을 나타낸다.

밑에코드를 다시 살펴보자

a,b,c = map(int,input().split()) # 8,-5,10

print(a,b,c)
  1. input().split(): 입력받은 문자열을 공백으로 분리하여 문자열 리스트를 생성한다. 예를 들어 "8 -5 10"을 입력하면 ['8', '-5', '10']이 생성된다. 이때 '8', '-5', '10'은 문자열 리터럴이다.
  2. map(int, ...): map 함수는 문자열 리스트의 각 요소에 int 함수를 적용한다. int 함수는 문자열을 정수로 변환한다. map의 결과는 map 객체 (이터레이터)이다.
  3. a, b, c = ...: 이 할당 부분에서 map 객체는 값을 생성하여 a, b, c에 각각 할당한다.

이때 a,b,c에 할당되는 값은 8,-5,10 이다. 이 값들은 정수 값이다. 하지만 int() 함수를 통해 문자열에서 변환된 값이디 때문에 리터럴이라고 할 수 없다.

map 객체는 이터레이터이기 때문에 한 번 순회하면 더 이상 값을 생성하지 않는다 !

예시 코드를 보여주자면

numbers = ['1', '2', '3', '4', '5']
mapped_numbers = map(int, numbers)

# 첫 번째 순회
print("첫 번째 순회:")
for num in mapped_numbers:
    print(num)

# 두 번째 순회
print("\n두 번째 순회:")
for num in mapped_numbers:
    print(num)

# list()로 변환 후 순회
mapped_numbers = map(int, numbers) # map 객체를 다시 생성해야 함
list_numbers = list(mapped_numbers)

print("\nlist()로 변환 후 첫 번째 순회:")
for num in list_numbers:
    print(num)

print("\nlist()로 변환 후 두 번째 순회:")
for num in list_numbers:
    print(num)

실행 결과

첫 번째 순회:
1
2
3
4
5

두 번째 순회:

list()로 변환 후 첫 번째 순회:
1
2
3
4
5

list()로 변환 후 두 번째 순회:
1
2
3
4
5

❗️결론

이터레이터는 한 번 순회하면 모든 값을 소진한다. 따라서 다시 사용하려면 이터레이터를 다시생성해야 한다. list(), tuple(), set() 등을 사용하여 이터레이터의 모든 값을 컨테이너 객체(리스트, 튜플, 집합)로 변환하면 여러 번 사용할 수 있다.

profile
물음표를 느낌표로 바꾸는 개발자

0개의 댓글

관련 채용 정보