{
    "componentChunkName": "component---src-templates-blog-post-js",
    "path": "/19-12-18-list-value-control/",
    "result": {"data":{"site":{"siteMetadata":{"title":"irrationnelle","author":"irrationnelle","siteUrl":"https://dev.rase.blog","comment":{"disqusShortName":"","utterances":"irrationnelle/devlog"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"eceff5a3-a9b7-5eb4-8bd8-d5ccf5f47bb6","excerpt":"사실 지난 번 메소드 이야기를 잠깐 한 것은 이번에 클래스에 대해서 이야기를 해보고 싶었기 때문인데, 막상 클래스에 대해 설명하려니 클래스와 인스턴스의 관계까지 다루어야 하고 이야기가 길어질 거 같아 이번에도 리스트 이야기를 해보겠다. 여담으로 나는 클래스를 이해하는데 1년이나 걸렸는데(…) 요즘은 이렇게 말하고 다닌다, 걍 함수까지 같이 넣어주는 구ㅈ…읍읍 당신들 누구야. 물론 농담이다. 데스노트 작성하기 곧 크리스마스가 다가온다. 크리스마스 파티 준비로 바쁜 Louie…","html":"<p>사실 지난 번 메소드 이야기를 잠깐 한 것은 이번에 클래스에 대해서 이야기를 해보고 싶었기 때문인데, 막상 클래스에 대해 설명하려니 클래스와 인스턴스의 관계까지 다루어야 하고 이야기가 길어질 거 같아 이번에도 리스트 이야기를 해보겠다. 여담으로 나는 클래스를 이해하는데 1년이나 걸렸는데(…) 요즘은 이렇게 말하고 다닌다, 걍 함수까지 같이 넣어주는 구ㅈ…읍읍 당신들 누구야. <strong>물론 농담이다</strong>.</p>\n<h1 id=\"데스노트-작성하기\" style=\"position:relative;\"><a href=\"#%EB%8D%B0%EC%8A%A4%EB%85%B8%ED%8A%B8-%EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0\" aria-label=\"데스노트 작성하기 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>데스노트 작성하기</h1>\n<p>곧 크리스마스가 다가온다. 크리스마스 파티 준비로 바쁜 Louie 는 길을 가다가 데스노트를 발견한다. 평생 사람을 미워해본 적이 없는 Louie 는 이 쓸모없는 공책을 어떻게 사용할까 고민하다가 좋은 아이디어를 떠올린다. 그래서 당장 친구목록을 작성했다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">friend_list <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'Tylo'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Amy'</span><span class=\"token punctuation\">]</span></code></pre></div>\n<p>잠깐, 흥분하지 말자. 데스노트는 본명을 적어야만 죽는다. 규칙대로 하지 않으면 원하는 결과가 나오지 않는 것이 마치 프로그래밍 언어와 비슷하다.</p>\n<p>친구목록이 조금 부족한 거 같다. 새로운 친구 목록을 추가하자.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">friend_list <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'Tylo'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Amy'</span><span class=\"token punctuation\">]</span>\n\nanother_friend_list <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'Claude'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Ta-Gong'</span><span class=\"token punctuation\">]</span>\n\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>friend_list<span class=\"token punctuation\">)</span>\n\nfriend_list<span class=\"token punctuation\">.</span>extend<span class=\"token punctuation\">(</span>another_friend_list<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>friend_list<span class=\"token punctuation\">)</span></code></pre></div>\n<p>그럼 이 친구들을 데스노트에 적어보자. 다음 문구와 함께</p>\n<blockquote>\n<p>will die full of years and honors</p>\n</blockquote>\n<p>반복문을 사용해서 해보자.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">for</span> friend <span class=\"token keyword\">in</span> friend_list<span class=\"token punctuation\">:</span>\n    text <span class=\"token operator\">=</span> friend <span class=\"token operator\">+</span> <span class=\"token string\">' will die full of years and honors'</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>text<span class=\"token punctuation\">)</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">Tylo will die full of years and honors\nAmy will die full of years and honors\nClaude will die full of years and honors\nTa-Gong will die full of years and honors</code></pre></div>\n<p>그런데 <code class=\"language-text\">print()</code> 함수는 단순히 보여주기만 할 뿐, 공책에 적으려면 이 문구가 담긴 리스트를 재생성해야 할 것 같다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">friend_list <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'Tylo'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Amy'</span><span class=\"token punctuation\">]</span>\n\nanother_friend_list <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'Claude'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Ta-Gong'</span><span class=\"token punctuation\">]</span>\n\nfriend_list<span class=\"token punctuation\">.</span>extend<span class=\"token punctuation\">(</span>another_friend_list<span class=\"token punctuation\">)</span>\n\nnote_text <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">for</span> friend <span class=\"token keyword\">in</span> friend_list<span class=\"token punctuation\">:</span>\n    text <span class=\"token operator\">=</span> friend <span class=\"token operator\">+</span> <span class=\"token string\">' will die full of years and honors'</span>\n    note_text<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>text<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>note_text<span class=\"token punctuation\">)</span></code></pre></div>\n<p>이제 노트 텍스트가 완성되었다. 그런데 이 방법은 그다지 pythonic 하지 못하다.</p>\n<p>일단 note_text 라는 값이 비어있는 리스트가 필요하며, for 문을 사용해서 장황하게 비어있는 리스트에 값을 추가하는 작업을 진행한다.</p>\n<h1 id=\"람다-사용하기\" style=\"position:relative;\"><a href=\"#%EB%9E%8C%EB%8B%A4-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0\" aria-label=\"람다 사용하기 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>람다 사용하기</h1>\n<p>람다에 대해서는 이전에 간략하게 이야기해보았다. 여기서는 람다 보다는 <code class=\"language-text\">map()</code> 이라는 이름의 내장함수가 더 중요하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">friend_list <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'Tylo'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Amy'</span><span class=\"token punctuation\">]</span>\n\nanother_friend_list <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'Claude'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Ta-Gong'</span><span class=\"token punctuation\">]</span>\n\nfriend_list<span class=\"token punctuation\">.</span>extend<span class=\"token punctuation\">(</span>another_friend_list<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># 여기에서 lambda 가 쓰인다.</span>\nnote_text <span class=\"token operator\">=</span> <span class=\"token builtin\">list</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">map</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> text<span class=\"token punctuation\">:</span> text<span class=\"token operator\">+</span><span class=\"token string\">' will die full of years and honors'</span><span class=\"token punctuation\">,</span> friend_list<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>note_text<span class=\"token punctuation\">)</span></code></pre></div>\n<p>앞서서 람다를 이야기할 때 파이썬은 함수를 인자로 전달하는 것이 가능하다고 했던 것이 기억나는가?</p>\n<p><code class=\"language-text\">map()</code> 내장함수가 바로 그런 경우로, 이 함수를 사용하기 위해서는 반드시 첫번째 인자에 함수를 전달하여야 한다.</p>\n<h1 id=\"map-내장함수\" style=\"position:relative;\"><a href=\"#map-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%98\" aria-label=\"map 내장함수 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>map() 내장함수</h1>\n<p><code class=\"language-text\">map()</code> 함수는 간단히 말해서, 두번째 인자로 받는 <code class=\"language-text\">iterable</code> 한 속성의 값들을 각각 하나씩 뽑아서 첫번째 인자에 있는 함수에게 인자로 전달한 뒤, 그 함수가 반환하는 값들을 모아서 새로운 <code class=\"language-text\">iterator</code> 값을 준다. 이런 전혀 간단하지 않군</p>\n<p>예를 들어 <code class=\"language-text\">y = x+1</code> 이다 라는 함수가 있다고 하자. 그리고 정의역으로 <code class=\"language-text\">{1, 2, 3}</code> 이 있다고 할 때, 이 함수의 치역은 <code class=\"language-text\">{2, 3, 4}</code>가 된다.</p>\n<p>이 때, 정의역인 <code class=\"language-text\">{1, 2, 3}</code> 은 <code class=\"language-text\">map()</code> 함수의 두번째 인자로 전달하는 <code class=\"language-text\">iterable</code>한 속성의 값이 된다. 그리고 <code class=\"language-text\">y=x+1</code> 이라는 함수는 첫번째 인자로 전달하는 함수이다.</p>\n<p>따라서 파이썬 코드로 나타내면 다음과 같다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token builtin\">map</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> x<span class=\"token punctuation\">:</span> x<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>하지만 여기서 <code class=\"language-text\">map()</code> 함수가 반환하는 것은 <code class=\"language-text\">[2, 3, 4]</code> 라는 리스트가 아니라 <code class=\"language-text\">iterator</code> 이다. <code class=\"language-text\">iterator</code> 는 <code class=\"language-text\">next()</code> 내장함수를 통해 값을 차례대로 꺼낼 수 있는 타입을 이야기한다.</p>\n<p>그래서 우리에게 익숙한 리스트 형태의 값을 받기 위해서는, <code class=\"language-text\">list()</code> 함수를 사용해서 인자로 저 <code class=\"language-text\">iterator</code>를 전달해야 한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">num_iterator <span class=\"token operator\">=</span> <span class=\"token builtin\">map</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">lambda</span> x<span class=\"token punctuation\">:</span> x<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\nnum_list <span class=\"token operator\">=</span> <span class=\"token builtin\">list</span><span class=\"token punctuation\">(</span>num_iterator<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>num_list<span class=\"token punctuation\">)</span> <span class=\"token comment\"># [2, 3, 4] 의 값을 가진다.</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token punctuation\">[</span><span class=\"token number\">2</span>, <span class=\"token number\">3</span>, <span class=\"token number\">4</span><span class=\"token punctuation\">]</span></code></pre></div>\n<p>여기까지 이해가 되었는가? 뭔가 굉장히 수학적인 느낌으로 코딩을 했다는 느낌이 들 수 있다. 내장함수 <code class=\"language-text\">map()</code> 은 함수형 프로그래밍에서 개념을 착안한 함수이기 때문이다.</p>\n<p>파이썬의 함수형 프로그래밍에 대한 자세한 이야기는 다음 <a href=\"https://docs.python.org/3/howto/functional.html\">공식 문서</a> 를 참조하도록 하자.</p>\n<p>또한 <code class=\"language-text\">map()</code> 을 사용해서 리스트를 다룬 경우 <em>지연 평가(lazy evaluation)</em> 의 효과를 얻을 수 있다. 앞서 말한 것처럼 <code class=\"language-text\">iterator</code> 를 반환하기 때문이며, <code class=\"language-text\">iterator</code> 는 <code class=\"language-text\">차례대로 값을 꺼낼 수 있다</code> 는 점과 <code class=\"language-text\">값을 꺼내달라고 요청하지 않으면, 즉 next() 내장 함수를 사용하지 않으면 값을 주지 않는다</code> 는 점이 매우 중요하다.</p>\n<p>이 개념에 대해 숙지하고 있어야 추후에 등장하는 제네레이터(Generator) 를 이해하는데 수월해진다.</p>\n<h1 id=\"리스트-컴프리헨션\" style=\"position:relative;\"><a href=\"#%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EC%BB%B4%ED%94%84%EB%A6%AC%ED%97%A8%EC%85%98\" aria-label=\"리스트 컴프리헨션 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>리스트 컴프리헨션</h1>\n<p>하지만 <code class=\"language-text\">map()</code>을 사용하여 지연 평가의 효과를 얻는다고 하더라도 어지간한 작업에서는 미미한 효과만 얻을 것이다.</p>\n<p>이 경우 pythonic 한 접근법은 보다 간결하고 가독성이 높은 코드로 작성하는 것이다. 물론 map 과 lambda 를 조합하는 쪽이 더 가독성이 높다고 생각하는 부류도 있다. 이 때에는 개발에 착수하기 전 개발팀들끼리 상의하는 것이 필요하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">note_text <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>name <span class=\"token operator\">+</span> <span class=\"token string\">' will die full of years and honors'</span> <span class=\"token keyword\">for</span> name <span class=\"token keyword\">in</span> friend_list<span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>note_text<span class=\"token punctuation\">)</span></code></pre></div>\n<p>위의 방법은 리스트 컴프리헨션이라고 하는데, 리스트의 값을 for 문처럼 사용하되 for 문 앞에 위치한 값들이 리스트를 채워나갈 일종의 <em>형식</em> 이라는 것을 짐작케 해준다. 따라서 가독성이 올라가는 것을 알 수 있다.</p>\n<h1 id=\"마치며\" style=\"position:relative;\"><a href=\"#%EB%A7%88%EC%B9%98%EB%A9%B0\" aria-label=\"마치며 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>마치며</h1>\n<p>이번에는 어려운 개념들이 많이 나왔다. 특히 <code class=\"language-text\">iterable</code> 과 <code class=\"language-text\">iterator</code> 가 매우 중요한 개념이다. <em>지연 평가</em>의 경우 당장은 중요한 개념이 아니며, <em>제네레이터</em> 역시 <code class=\"language-text\">iterable</code> 과 <code class=\"language-text\">iterator</code> 개념이 선행되어야 한다. 다음번에는 이것들을 다뤄보도록 하자.</p>","frontmatter":{"title":"list comprehension 과 map","date":"December 18, 2019"}}},"pageContext":{"slug":"/19-12-18-list-value-control/","previous":{"fields":{"slug":"/19-12-16-list-comprehension/"},"frontmatter":{"title":"list 이해하기","category":"Python","draft":false}},"next":{"fields":{"slug":"/20-04-22-cra-dockerize/"},"frontmatter":{"title":"CRA 앱 Dockerize 하기","category":"Devops","draft":false}}}},
    "staticQueryHashes": ["3128451518","3474900066"]}