파이썬 개발자라면 풀어볼만한 문제

허준현·2021년 8월 19일
0
post-thumbnail

오늘은 파이썬 자료형 iter를 찾아보다가 새로운 지식을 배워서 나누고자 합니다.
우선 이 글을 읽는 사람들은 list, zip, iter,range 자료형에 대해 알고 있는 것으로 가정하고 적겠습니다.

문제 1번 range(5)의 출력값?

네 먼저 손을 풀고 가도록 하겠습니다. 파이썬에서 range의 정의는 무엇일까요?
파이썬에서는 range를 사용자가 작성한 숫자에 대한 범위를 제공합니다.
더 나아가서 iterable 자료형이며 이 외에도 list, dictionary, set, string, tuple 자료형이 있습니다.
하지만 문제에서는 range()를 도는 것이 아닌 단순 출력이므로

range(0,5)

가 정답이 되겠습니다. 다음 문제로 가보죠

문제 2번 list(range(5))*2 와 list(range(5)*2)의 출력값?

우선적으로 range, list 둘다 iterable 자료형입니다. 하지만 자세히 보면 *2한 위치가 다르다는 것을 알 수 있습니다. list* (a) 를 한 경우에는 list 안의 값을 a 번 만큼 복사하게 됩니다. 그러면 range도 될까요? 아쉽지만 range를 지원하지 않습니다. 따라서 첫번째 값은 0~4 값을 2번 반복하며 두번째 는 아래와 같은 에러를 출력합니다.

TypeError: unsupported operand type(s) for *: 'range' and 'int'

더 나아가서 a=[1,2,3] 이라는 리스트가 있는데 b=a*3 을 할경우 b=[1,2,3,1,2,3,1,2,3] 이 될 것입니다. 여기서 모든 1의 메모리의 위치가 같을까요? 다를까요?

네 단순 복사를 한 것이기 때문에 같은 숫자를 가지는 int값은 같은 메모리를 참고 하고 있는 것을 알 수 있습니다.

문제 3번 *[iter(list(range(5)))]*10 의 출력값?

네 이제 슬슬 어려워 지고 있습니다. range() 를 list()로 바꾸어 주고 iter() 함수를 통해서 iterator() 객체를 생성하고 있습니다. * 과 []는 서로 소거 된다고 생각하고 *10를 해주었기 때문에 결과는 이터레이터가 10개가 출력 될 것입니다.
앞에서 말한 단순 복사이기 때문에 가르키는 위치도 동일합니다.

<list_iterator object at 0x0000020E33004190> 
<list_iterator object at 0x0000020E33004190>  ....

자 이제 다 왔습니다. 마지막 문제를 살펴보도록 하겠습니다.

문제 4번 list(zip(*[iter(list(range(5)))]*10))의 출력값?

자 이제 위에서 배웠던 것처럼 생각해보록 하겠습니다. zip을 통해서 list_iterator 12개를 묶게 됩니다. 여기서 zip()은 iterable한 객체를 인덱스로 묶어서 반환하게 됩니다.

ex) [a,b][c,d] => [(a,c) , (b,d)]

자 그러면 10개에 해당하게

[(1,1,1,1,1,1,1,1,1,1) , (2,2,2,2,2,2,2,2,2,2) , ..... (4,4,4,4,4,4,4,4,4)] 가 생성되고 문제 해결!

하지만 여기가 끝이 아닙니다!

다시 한번 생각해 볼까요? 저희가 iterator를 생각 할 때 C언어에서 다음 구조체를 가르키는 것을 많이 연상합니다. 그래서 next()를 하면서 다음 노드로 이동할 수 있는 것이지요

하지만 파이썬에서의 iterator는 한 번 지나간 노드에 대해서는 참조 하고 있지 않습니다.

따라서 [(1,1,1,1,1,1,1,1,1,1) , (2,2,2,2,2,2,2,2,2,2) , ..... (4,4,4,4,4,4,4,4,4)] 에서 마지막 값을 제외한 나머지 값들은 소멸하게 되어

[(1,2,3,4,)] 가 나오게 됩니다.

iter() 에 대해 다시 한 번 찾아보는 계기가 되었고 공부하게 되는 시간을 가졌는데 다른분들은 어떻게 생각하셨는지 댓글로 달아주세요 :)
이상으로 개발자가 풀어볼만한 파이썬 문제였습니다!!

profile
best of best

0개의 댓글