https://www.acmicpc.net/problem/11720
문자열로 입력이 들어오는 모든 개별 1자리 단위 숫자를 합해서 출력하는 간단한 문제다.
정답 코드
import sys
next(sys.stdin)
s = list(next(sys.stdin))[:-1]
print(sum(int(i) for i in s))
간단한 문제이지만, 따로 블로그로 기록을 남기게 된 이유는 아래 문구를 사용하면서 새로 배운 게 있기 때문이다.
sum(int(i) for i in s)
먼저 VS Code에서 sum 함수에 대한 설명을 보면, 첫째 인자로 iterable을 받는다는 것을 알 수 있다.
그말인즉슨 sum() 안의 int(i) for i in s 가 iterable이라는 뜻이다. 엄밀히 말하면 generator이다.
여태까지는 x for x in y 형태의 표현이 generator이다라는 것을 생각 안하고 사용해왔다.
이러한 x for x in y 형태의 generator 표현법을 "Generator Expression"이라고 한다.
아래에서 확인 가능하다.
print(type(i for i in range(5))) # 출력: <class 'generator'>
print(i for i in range(5)) # 출력: <generator object <genexpr> at 0x0000014C60D77400>
generator는 iterable이기도 하므로, generator expression도 list(), [], tuple() 등으로 감싸서 사용할 수 있다.
또한 map()등에도 전달할 수 있다.
print(list(i for i in range(5))) # 출력: [0, 1, 2, 3, 4]
print([i for i in range(5)]) # 출력: [0, 1, 2, 3, 4]
print(tuple(i for i in range(5))) # 출력: (0, 1, 2, 3, 4)
print(list(map(lambda x : x * 2, (i for i in range(5))))) # 출력: [0, 2, 4, 6, 8]
중요한 점
x for x in y 형태의 generator expression은 함수의 인자로 전달될 때만 유효한 표현이고, 인자가 아닌 독립적인 형태로 존재하려면 괄호로 감싸서 (x for x in y) 형태여야 한다.
함수의 인자로 전달되는 generator expression은 괄호로 감싸지 않아도 파이썬이 generator expression인 것으로 알아서 처리하는 한다.
반면, 독립적으로 존재하는 generator expression은 괄호로 감싸지 않으면 아래처럼 SyntaxError가 발생하는 것을 확인할 수 있다. 에러 문구에서도 괄호로 감싸라고 친절히 알려주고 있다.
print(map(lambda x : x * 2, i for i in range(5)))
File "<stdin>", line 1
print(map(lambda x : x * 2, i for i in range(5)))
^^^^^^^^^^^^^^^^^^^
SyntaxError: Generator expression must be parenthesized
아래처럼 괄호로 감싸야 에러가 발생하지 않는다.
print(map(lambda x : x * 2, (i for i in range(5)))) # 출력: <map object at 0x0000014C60FA9D20>
'baekjoon' 카테고리의 다른 글
[BOJ] 25083번: 새싹 / Python - multiline string, raw string 사용 (0) | 2024.12.23 |
---|---|
[BOJ] 5622번: 다이얼 / Python (0) | 2024.12.21 |
[BOJ] 10807번: 개수 세기 / Python (0) | 2024.12.20 |
[BOJ] 28278번: 스택 2 / Python (1) | 2024.12.20 |
[BOJ] 4613번: Quicksum / Python (0) | 2024.12.16 |