파이썬은 배열 회전은 zip을 이용하면 1줄에 끝내버릴 수 있습니다. 그 방법을 알아봅시다. 3번째 줄이 90도 회전하는 소스입니다. c++로 구현할 때, 줄수가 꽤 길었는데요. 파이썬은 의외입니다? zip과 asterisk, 그리고 list 컴프리헨션으로 간단하게 구현할 수 있어요. 이 과정을 하나 하나 짚어보겠습니다. 먼저, zip(*li) 부터 보겠습니다. 이것에 대한 문법적인 설명은 다음에 언급하도록 하겠습니다. zip을 쓸 때 짝꿍처럼 많이 쓰이니, 이디엄처럼 외워 봅시다. 문서를 보시면 li가 [1, 2, 3]일 때, f(*li)는 f(1, 2, 3)과 똑같습니다. 그러면, li가 [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]일 때, zip(*li)는 무엇..
파이썬 검색 결과
이번 시간에는 파이썬의 list comprehensions에 대해 알아봅시다. list를 간단하게 초기화 할 수 있는 방법입니다. 먼저 예제 3개를 보도록 하겠습니다. 예제 1번입니다. [k for k in range(10)]이 있네요. 뒤에서부터 해석해 봅시다. 일단 for K in A를 먼저 봐야 하는데요. A가 range(10)이였습니다. 게다가, range는 iterable 해요. 그러면, K의 값은 0부터 9까지 된다는 의미인데요. for 앞에 K가 붙어 있어요. 그러면 K값이 list의 원소가 된다는 의미입니다. 그러면, list에 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]가 나와야 할 텐데요. 정말 그렇게 나왔나 볼까요? 정말 그렇게 나왔습니다. 이제 필터링을 해 보겠습니다. 아..
함수 안에서 yield를 본 적이 있을 겁니다. 함수 안에서 이것을 쓰게 되면, 제너레이터가 됩니다. 이 문서에서는 어떻게 제너레이터를 쓰고 왜 쓰는지에 대해서 언급하지는 않습니다. 함수 안에서 yield를 썼을 때, 실행 문맥에 어떤 것을 저장하고 있길래, yield가 나타나면, 실행을 양보하고, 다시 foo를 호출하면, 그 다음 위치부터 실행시킬 수 있는지에 대해서 간단하게 고찰해 보겠습니다. main에서 foo를 호출했을 때를 생각해 봅시다. 이 때 foo(a)의 위치를 2, 그 다음 줄에 위치해 있는 a = a + 1을 위치 3이라고 해 보겠습니다. foo(a)를 호출하고, 리턴이 되면, 위치 3에 있는 a = a + 1이 수행됩니다. 그림으로 그려 보면 위와 같습니다. 이는, 함수를 호출할 때 ..
이번 시간에은 파이썬 divmod 메서드에 대해 알아봅시다. x와 y를 받으면 x를 y로 나눈 몫과, 나머지가 들어있는 tuple을 리턴하게 됩니다. 튜플은 for in으로 순회 가능합니다. 이를 이용해서 여러가지 작업을 해 보도록 하겠습니다. 이걸 어디에 써 먹을 수 있을까요? 7을 3으로 나눈 몫과 나머지를 구해야 한다고 생각해 봅시다. 저는 처음에 이런 식으로 썼었습니다. 7 // 3과 7 % 3을 썼었습니다. 7 / 3을 쓰지 않았음에 주의하세요. 7 / 3의 결과는 7을 3으로 나눈 몫인 2가 아닌 2.333..이 나오게 됩니다. 결과는 2 1이 나옵니다. 문제는 저렇게 쓰기가 귀찮다는 것입니다. 이런 귀찮음을 해결하기 위해, divmod를 쓴다는 것을 최근에야 알게 되었습니다. 이 메서드의 리..
multithreading을 공부하시다 보면, GIL에 대해 한 번 정도는 들어보시게 됩니다. Global Interpreter Lock의 줄임말입니다. 그런데 이것이 있으면 Lock이 필요 없을까요? 관련 질문을 봐도, 답은 한결같이 아닐 수도 있다는 것이였습니다. [관련글] 원자성을 만족하는 연산을 n번 호출하는 연산은 원자적일까요? 이 문서를 읽어 보시면, 각각의 byte code가 어쩌고 저쩌고 언급을 하다가 atomic 하다는 언급을 하고 있어요. 아래 예제를 보도록 하겠습니다. foo는 global 변수 x에 diff를 100번 더합니다. main 부분을 보겠습니다. diff가 1, -1, 1, -1이 들어감을 알 수 있어요. 18번째 줄에 target이 foo 메서드이고, args가 li의 ..
최근댓글