반응형

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>
반응형

+ Recent posts