오늘의 호기심은, for loop 없이 중첩 for loop과 동일한 결과를 map 함수로 만들어보기 입니다.
먼저 간단하게 2중 for loop 코드를 준비해봅시다.
for x in range(2,10):
for y in range(1,10):
print("(%s, %s)" % (x,y))
어떤 코드일까요, 돌려보면..
(2, 1)
(2, 2)
...
(9, 8)
(9, 9)
답이 없는 구구단이었습니다.
위 코드를 조건제시법으로 표현하면 아래와 같습니다.
for tuple in [(x,y) for x in range(2,10) for y in range(1,10)]: # 수식으로 나타내면 `{ x ∈ [2,9], y ∈ [1,9] | print((x,y)) }` 요런 느낌이죠.
print(tuple)
결과는 뭐, 동일하게 나오겠지여..
자, 그러면 이제 map 함수로 짜봅시다.
map 함수의 제원은 다음과 같습니다.
map(함수,정의역)
함수와 정의역을 넣으면 함수의 결과를 결과를 뿜뿜해주는 generator가 생성됩니다.
2중 for loop과 동일하게 map 함수를 2개 겹쳐봅시다. 그리고 각각의 map 함수의 결과인 generator를 풀기 위해 list로 변환합니다.
list(map(lambda x: list(map(lambda y:print("(%s, %s)" % (x,y)), range(1,10))), range(2,10)))
결과는 짜잔
(2, 1)
(2, 2)
...
(9, 8)
(9, 9)
보시면 아시겠지만 라인은 줄어들지만, 가독성은 개판이 되는 것을 볼 수 있습니다.
그러므로 클라이언트에게 소스코드를 넘겨줘야될때는 map함수를, 오픈소스로 풀 때에는 가독성이 좋은 for loop을 사용하는게 어떨까 싶습니다.