<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Python World</title>
    <link>https://python-world.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Mon, 11 May 2026 07:56:05 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>nickas</managingEditor>
    <item>
      <title>아메리슬립 침대 구매 후기</title>
      <link>https://python-world.tistory.com/entry/%EC%95%84%EB%A9%94%EB%A6%AC%EC%8A%AC%EB%A6%BD-%EC%B9%A8%EB%8C%80-%EA%B5%AC%EB%A7%A4-%ED%9B%84%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;7년전 아메리슬립 AS4 슈퍼싱글 매트리스를 잘 사용하고 있다가 퀸 사이즈 침대가 필요했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 브랜드도 살펴 보았지만 역시 아메리슬립이 가격도 좋고, 품질도 제일 좋아 구매 결정 고고씽!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적으로는 완전 푹신한 매트리스를 좋아하는데, Hybrid는 어떤 느낌일지 궁금하여&amp;nbsp; Hybrid&amp;nbsp; AS5 최상위 모델로 구매 결정!!!! AS5 모델이 제일 푹신한 매트리스이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에도 후기를 작성하면 플렉스 베게를 준다길래 귀찮음을 뒤로하고 작성 ㅋ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;퀸 사이즈는 무려 베게를 2개나 준다니 마다할 이유가 없잖음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 빨리 사용하고 싶은 마음에 박스 개봉 전 후 사진을 제대로 찍지 못했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_2820.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3l2l5/btsKWRXtG7I/LEdTV3ZWHT2hyrQQPF908K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3l2l5/btsKWRXtG7I/LEdTV3ZWHT2hyrQQPF908K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3l2l5/btsKWRXtG7I/LEdTV3ZWHT2hyrQQPF908K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3l2l5%2FbtsKWRXtG7I%2FLEdTV3ZWHT2hyrQQPF908K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4032&quot; height=&quot;3024&quot; data-filename=&quot;IMG_2820.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리폼 매트리스는 압축된 형태로 택배 배달되고 포장을 풀면 위와 같은 형태로 부풀어 오른다. 포장을 풀고 최고 4시간 후에 사용해야 하기 때문에 개봉날에는 그냥 바닥에서 잠 ㅋ. 전에는 후기를 작성해야 매트리스 커버를 받을 수 있었는데, 이번에는 매트리스 커버가 기본 포함! 강남점에서 10% 할인 행사를 하길래 퇴근 후 부랴부랴 강남점을 찾아가 10% 할인을 받을 수 있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_2821.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhYVFH/btsKUFR4Nu7/jKX9ES9G0ZZtik950QA8z0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhYVFH/btsKUFR4Nu7/jKX9ES9G0ZZtik950QA8z0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhYVFH/btsKUFR4Nu7/jKX9ES9G0ZZtik950QA8z0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhYVFH%2FbtsKUFR4Nu7%2FjKX9ES9G0ZZtik950QA8z0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4032&quot; height=&quot;3024&quot; data-filename=&quot;IMG_2821.jpeg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 프레임도 같이 구매. 헤드가 필요 없기에 가장 저렴한 제품인 에이 파운데이션을 구매했다. 매트리스 아래 평평한 것이 프레임이다.아래에 다리를 결합해서 사용하거나, 저렇게 다리 없이 사용할 수도 있는데. 배송일에 나사가 같이 배송이 안되서 어쩔 수 없이 다리 없이 조립 ㅠㅠ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tGeaO/btsKWnbovEk/fqUVBU8nqQk1K8KDiWmTKk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tGeaO/btsKWnbovEk/fqUVBU8nqQk1K8KDiWmTKk/img.jpg&quot; data-origin-width=&quot;5712&quot; data-origin-height=&quot;4284&quot; data-is-animation=&quot;false&quot; data-filename=&quot;IMG_2824.jpeg&quot; style=&quot;width: 63.2558%; margin-right: 10px;&quot; data-widthpercent=&quot;64&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tGeaO/btsKWnbovEk/fqUVBU8nqQk1K8KDiWmTKk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtGeaO%2FbtsKWnbovEk%2FfqUVBU8nqQk1K8KDiWmTKk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;5712&quot; height=&quot;4284&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N8PsU/btsKW3pXyU6/ME5DJftcqlRWd9RJCWxDrK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N8PsU/btsKW3pXyU6/ME5DJftcqlRWd9RJCWxDrK/img.jpg&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot; data-is-animation=&quot;false&quot; data-filename=&quot;IMG_2823.jpeg&quot; style=&quot;width: 35.5814%;&quot; data-widthpercent=&quot;36&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N8PsU/btsKW3pXyU6/ME5DJftcqlRWd9RJCWxDrK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN8PsU%2FbtsKW3pXyU6%2FME5DJftcqlRWd9RJCWxDrK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4284&quot; height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다리를 결합 할 경우 저 부품?을 프레임 중간에 붙여야 한다고 한다. 중간 지지대 역할을 하는 듯&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간 중간 스템플러가 박혀 있는데 하나가 잘 못 박혀 있었다ㅠ 사용에는 지장이 없을 것 같아 그냥 쓰기로.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6CIZa/btsKVrTqTL5/UsedTPEc8QMrSj3uVZechK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6CIZa/btsKVrTqTL5/UsedTPEc8QMrSj3uVZechK/img.jpg&quot; data-origin-width=&quot;5712&quot; data-origin-height=&quot;4284&quot; data-is-animation=&quot;false&quot; data-filename=&quot;IMG_2825.jpeg&quot; style=&quot;width: 63.2558%; margin-right: 10px;&quot; data-widthpercent=&quot;64&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6CIZa/btsKVrTqTL5/UsedTPEc8QMrSj3uVZechK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6CIZa%2FbtsKVrTqTL5%2FUsedTPEc8QMrSj3uVZechK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;5712&quot; height=&quot;4284&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m5Z6A/btsKXAgDryk/9bQSlaWM83gRazwfeLOUy1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m5Z6A/btsKXAgDryk/9bQSlaWM83gRazwfeLOUy1/img.jpg&quot; data-origin-width=&quot;4284&quot; data-origin-height=&quot;5712&quot; data-is-animation=&quot;false&quot; data-filename=&quot;IMG_2827.jpeg&quot; style=&quot;width: 35.5814%;&quot; data-widthpercent=&quot;36&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m5Z6A/btsKXAgDryk/9bQSlaWM83gRazwfeLOUy1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm5Z6A%2FbtsKXAgDryk%2F9bQSlaWM83gRazwfeLOUy1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4284&quot; height=&quot;5712&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프레임 다리들&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_2826.jpeg&quot; data-origin-width=&quot;5712&quot; data-origin-height=&quot;4284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s2Euc/btsKWKKW6eY/qbkZ9k2mNHvsmWTHMI9aH0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s2Euc/btsKWKKW6eY/qbkZ9k2mNHvsmWTHMI9aH0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s2Euc/btsKWKKW6eY/qbkZ9k2mNHvsmWTHMI9aH0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs2Euc%2FbtsKWKKW6eY%2FqbkZ9k2mNHvsmWTHMI9aH0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;5712&quot; height=&quot;4284&quot; data-filename=&quot;IMG_2826.jpeg&quot; data-origin-width=&quot;5712&quot; data-origin-height=&quot;4284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제의 나사들 ㅋ. 바로 배송해 주셨다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언제 다시 프레임 다리를 조립하지.....ㅋ.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확실히 슈퍼 싱글 보다는 많이 무겁다. 매트리스를 프레임 위에 올리는데 아이고 허리야 ㅋ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 보름? 정도 사용 중인데, 역시 만족도 최상. 매일 매일 숙면 중. 가격면에서 비싼감이 있지만 숙면을 중요하게 생각하기에 나에게 하는 가장 좋은 투자라고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약간 아쉬운 점은 프레임을 직접 조립해야 하는데 설명서가 없다는 것이다ㅠ. 조립이 어려운건 아니지만 완변한? 조립을 위해 홈페이지에라도 설명서를 올려 주면 좋을 듯 하다.&lt;/p&gt;</description>
      <category>구매후기</category>
      <author>nickas</author>
      <guid isPermaLink="true">https://python-world.tistory.com/51</guid>
      <comments>https://python-world.tistory.com/entry/%EC%95%84%EB%A9%94%EB%A6%AC%EC%8A%AC%EB%A6%BD-%EC%B9%A8%EB%8C%80-%EA%B5%AC%EB%A7%A4-%ED%9B%84%EA%B8%B0#entry51comment</comments>
      <pubDate>Mon, 25 Nov 2024 21:58:39 +0900</pubDate>
    </item>
    <item>
      <title>Scrapy 구조 알아보기</title>
      <link>https://python-world.tistory.com/entry/Scrapy-architecture</link>
      <description>&lt;p&gt;Scrapy를 잘 사용하기 위해 구조와 작동 순서를 아는것이 필요.&lt;/p&gt;
&lt;h2&gt;Components&lt;/h2&gt;
&lt;p&gt;Scrapy는 아래와 같은 component들로 구성되어 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scrapy Engine&lt;br /&gt;각 component들에 데이터(&lt;code&gt;Request&lt;/code&gt;, &lt;code&gt;Response&lt;/code&gt;, &lt;code&gt;Item&lt;/code&gt;)를 전달(Controller)하고 액션이 발생 했을 때 이벤트를 발생시키는 역활을 함.&lt;/li&gt;
&lt;li&gt;Scheduler&lt;br /&gt;엔진으로 부터 &lt;code&gt;Request&lt;/code&gt;을 전달 받고 이 &lt;code&gt;Request&lt;/code&gt;을 queue에 추가한 후 나중에 엔진이 &lt;code&gt;Request&lt;/code&gt;를 요청할 때 다시 엔진에 전달.&lt;/li&gt;
&lt;li&gt;Downloader&lt;br /&gt;&lt;code&gt;Request&lt;/code&gt;에 포함된 URL에서 웹 페이지를 가져와서 &lt;code&gt;Response&lt;/code&gt; 오브젝트를 만들어 엔진에게 전달하는 역활을 한다. 엔진은 전달 받은 이 웹 페이지를 다시 스파이더에게 전달.&lt;/li&gt;
&lt;li&gt;Spider&lt;br /&gt;요청할 URL을 사용하여 &lt;code&gt;Request&lt;/code&gt; 오브젝트를 만들고, callback 메서드를 사용하여 &lt;code&gt;Response&lt;/code&gt;에서 원하는 데이터를 추출하거나 &lt;code&gt;Response&lt;/code&gt;에 포함된 URL을 사용하여 새로운 &lt;code&gt;Request&lt;/code&gt;를 만드는 역활을 함.&lt;/li&gt;
&lt;li&gt;Item Pipeline&lt;br /&gt;스파이더로 부터 추출된 아이템을 처리하는 역활을 함(정확히는 &lt;code&gt;Item&lt;/code&gt; 오브젝트가 전달됨). 일반적으로 아이템을 cleansing, 검증 그리고 데이터베이스 같은 곳에 저장하는 일을 함.&lt;/li&gt;
&lt;li&gt;Downloader middleware&lt;br /&gt;엔진과 다운로더 사이에 위치한 hook으로 엔진으로 부터 다운로더로 전달되는 &lt;code&gt;Request&lt;/code&gt;를 처리하고, 다운로더로 부터 엔진으로 전달 되는 &lt;code&gt;Response&lt;/code&gt;를 처리.&lt;br /&gt;아래와 같은 것이 필요할 경우 다운로더 미들웨어를 사용한다.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Request&lt;/code&gt;가 다운로더로 전달되기 전에 처리하기 위해. 예를 들어 웹사이트로 request를 보내기 전에 문제가 없는지 확인하기 위해.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Response&lt;/code&gt;를 스파이더로 전달되기 전에 변경하기 위해.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Response&lt;/code&gt;를 스파이더로 전달하는 대신 새로운 &lt;code&gt;Request&lt;/code&gt;를 요청하기 위해.&lt;/li&gt;
&lt;li&gt;웹 페이지를 가져오지 않고 스파이더에 &lt;code&gt;Response&lt;/code&gt;를 전달하기 위해.&lt;/li&gt;
&lt;li&gt;몇몇 &lt;code&gt;Request&lt;/code&gt;를 drop하기 위해.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Spider middleware&lt;br /&gt;엔진과 스파이더 사이에 위치한 hook으로 스파이더의 input(&lt;code&gt;Reponse&lt;/code&gt;)와 output(아이템과 &lt;code&gt;Request&lt;/code&gt;)를 처리할 수 있다.&lt;br /&gt;아래와 같은 경우가 필요할 때 사용
&lt;ul&gt;
&lt;li&gt;스파이더 콜백의 아웃풋인 &lt;code&gt;Request&lt;/code&gt;와 아이템를 변경하거나 추가, 삭제.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;start_requests&lt;/code&gt;의 후처리&lt;/li&gt;
&lt;li&gt;스파이터의 예외 처리&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Response&lt;/code&gt;을 기반으로 &lt;code&gt;Request&lt;/code&gt;들 중 일부에 callback을 호출하는 대신 errback를 호출(예를들어 response가 정상(200)이 아닌 경우 callback을 호출하지 않고 errback를 호출하여 처리)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;데이터 흐름&lt;/h2&gt;
&lt;p&gt;데이터(request, response, item)이 Scrapy 시스템 안에서 어떻게 흘러 가는지 아래 그림이 설명해 주고 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;scrapy_architecture_02.png&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;940&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nMywK/btqEbuwSIK8/0mhmM8tG1YEvWjZ51IvWO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nMywK/btqEbuwSIK8/0mhmM8tG1YEvWjZ51IvWO1/img.png&quot; data-alt=&quot;Scrapy Data Flow&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nMywK/btqEbuwSIK8/0mhmM8tG1YEvWjZ51IvWO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnMywK%2FbtqEbuwSIK8%2F0mhmM8tG1YEvWjZ51IvWO1%2Fimg.png&quot; data-filename=&quot;scrapy_architecture_02.png&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;940&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Scrapy Data Flow&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Scrapy에서 데이터는 엔진에 의해서 컨트롤 되고 아래와 같이 흘러 간다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;엔진은 스파이더로 부터 crawl을 하기 위한 초기 &lt;code&gt;Request&lt;/code&gt; 오브젝트를 받음.&lt;/li&gt;
&lt;li&gt;엔진은 이 &lt;code&gt;Request&lt;/code&gt;를 스케줄러 안에 등록하고 crawl를 진행 할 다음 &lt;code&gt;Request&lt;/code&gt;를 요청.&lt;/li&gt;
&lt;li&gt;스케줄러는 엔진에게 다음으로 crawl을 진행 할 &lt;code&gt;Request&lt;/code&gt;을 전달.&lt;/li&gt;
&lt;li&gt;엔진은 이 &lt;code&gt;Request&lt;/code&gt;를 다운로더에 전달하고, &lt;code&gt;Request&lt;/code&gt;는 다운로더로 전달되면서 다운로더 미들웨어를 거쳐 감. 내부적으로는 미들웨어의 &lt;code&gt;process_request()&lt;/code&gt;를 실행.&lt;/li&gt;
&lt;li&gt;다운로더는 &lt;code&gt;Request&lt;/code&gt; 오브젝트에 포함되어 있는 URL의 페이지를 가져(fetch) 온 후 이 페이지를 이용하여 &lt;code&gt;Response&lt;/code&gt; 오브젝트를 생성하고 엔진에게 다시 전달. &lt;code&gt;Response&lt;/code&gt;는 엔진으로 전달되면서 다시 다운로더 미들웨어를 거쳐 감. 내부적으로는 미들웨어의 &lt;code&gt;process_response()&lt;/code&gt;를 실행.&lt;/li&gt;
&lt;li&gt;엔진은 다운로더로 부터 &lt;code&gt;Response&lt;/code&gt;를 전달 받고 이 &lt;code&gt;Response&lt;/code&gt;를 스파이더에게 전달. &lt;code&gt;Response&lt;/code&gt;는 스파이더로 전달되면서 스파이더 미들웨어를 거쳐 감. 내부적으로는 미들웨어의 &lt;code&gt;process_spider_input()&lt;/code&gt;를 실행.&lt;/li&gt;
&lt;li&gt;스파이더는 &lt;code&gt;Response&lt;/code&gt;를 처리하고 스크랩한 아이템과 새로운 &lt;code&gt;Request&lt;/code&gt;를 엔진에게 전달(&lt;code&gt;Response&lt;/code&gt;에 포함된 링크를 따라 &lt;code&gt;Request&lt;/code&gt;를 만들 경우). 스크랩과 새로운 &lt;code&gt;Request&lt;/code&gt;는 엔진으로 전달되면서 스파이더 미들웨어를 거쳐 감. 내부적으로는 미들웨어의 &lt;code&gt;process_spider_output()&lt;/code&gt;를 샐행.&lt;/li&gt;
&lt;li&gt;엔진은 아이템을 &lt;code&gt;Item Pipelines&lt;/code&gt;에 전달하고 새로운 &lt;code&gt;Request&lt;/code&gt;는 스케쥴러에 전달하면서 다음으로 crawl 해야 하는 &lt;code&gt;Request&lt;/code&gt;를 요청.&lt;/li&gt;
&lt;li&gt;이 모든 프로세스는 스케쥴러로 부터 더 이상 &lt;code&gt;Request&lt;/code&gt;가 없을 때 까지 1번 부터 반복적으로 진행.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;위 절차를 요약 하자면,&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;내가 작성한 스파이더에서 &lt;code&gt;Request&lt;/code&gt; 오브젝트를 만들어 리턴하면&lt;/li&gt;
&lt;li&gt;다운로더가 페이지를 가져와서 &lt;code&gt;Response&lt;/code&gt; 오브젝트를 만들어 스파이더로 전달해 주고&lt;/li&gt;
&lt;li&gt;스파이더는 내가 작성한 callback를 실행해서 내가 원하는 아이템을 추출하고 파이프라인으로 전달.&lt;/li&gt;
&lt;li&gt;내가 작성한 파이프라인이 있으면(데이터베이스로 저장 등) 파이프라인에서 아이템을 다시 처리하고 더 이상 &lt;code&gt;Request&lt;/code&gt;가 없을 때 까지 반복.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;Reqeust&lt;/code&gt;와 &lt;code&gt;Response&lt;/code&gt;가 전달되는 과정에서 미들웨어들을 거쳐감.&lt;/p&gt;</description>
      <category>Web Crawling</category>
      <category>scrapy</category>
      <category>web crawling</category>
      <author>nickas</author>
      <guid isPermaLink="true">https://python-world.tistory.com/50</guid>
      <comments>https://python-world.tistory.com/entry/Scrapy-architecture#entry50comment</comments>
      <pubDate>Sun, 17 May 2020 19:38:01 +0900</pubDate>
    </item>
    <item>
      <title>Scrapy 간단 사용법</title>
      <link>https://python-world.tistory.com/entry/Simple-Scrapy</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;Scrapy_logo.jpg&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uXvo4/btqD2GJIU0Y/H0uSNxpVTn8xBdonET2Uv1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uXvo4/btqD2GJIU0Y/H0uSNxpVTn8xBdonET2Uv1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uXvo4/btqD2GJIU0Y/H0uSNxpVTn8xBdonET2Uv1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuXvo4%2FbtqD2GJIU0Y%2FH0uSNxpVTn8xBdonET2Uv1%2Fimg.jpg&quot; data-filename=&quot;Scrapy_logo.jpg&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;206&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;설치&lt;/h2&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ pip install scrapy&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;프로젝트 생성&lt;/h2&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ scrapy startproject project_name&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;아래와 같이 디렉토리와 파일들이 생성됨&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ tree project_name
project_name
├── scrapy.cfg
└── project_name
    ├── __init__.py
    ├── items.py
    ├── middlewares.py
    ├── pipelines.py
    ├── settings.py
    └── spiders
        └── __init__.py&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;간단 spider 생성&lt;/h2&gt;
&lt;p&gt;Spiders 디렉토리 안에 파이썬 파일 생성&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ cd project_name/project_name/spiders
$ touch example.py&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;scrapy.Spider&lt;/code&gt;를 상속하는 클래스를 생성&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;# example.py
import scrapy

class ExampleSpider(scrapy.Spider):
    name = 'example'

    def start_requests(self):
        urls = [
            'http://www.example.com/'
        ]

        return [scrapy.Request(url=url, callback=self.parse) for url in urls]
        # 또는
        #for url in urls
        #    yield scrapy.Reqest(url=url, callback=self.parse

    def parse(self, response):
        url = response.url
        title = response.css('h1::text').get()
        print(f'URL is: {url}')
        print(f'Title is: {title}')&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;name (필수)&lt;br /&gt;spider 이름을 지정. 프로젝트 안에서 유일한 이름이어야 함.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;start_requests(self)&lt;/code&gt; (필수)
&lt;ul&gt;
&lt;li&gt;spider 시작 시 실행되는 메서드로 &lt;code&gt;scrapy.Request()&lt;/code&gt;를 사용하여 &lt;code&gt;Request&lt;/code&gt; 오브젝트를 만들어 리턴하면 Scrapy 스케쥴러에(queue) 등록되고 순서가 되면 Scrapy &lt;code&gt;downloader&lt;/code&gt;가 파라미터로 전달된 url을 사용하여 페이지를 요청.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;callback&lt;/code&gt; 파라미터를 사용하여 &lt;code&gt;downloader&lt;/code&gt;가 전달해 주는 &lt;code&gt;Response&lt;/code&gt; 오브젝트를 처리할 메서드를 지정.&lt;/li&gt;
&lt;li&gt;이 메서드는 spider 시작 시 한번만 실행되기 때문에 위와 같이 &lt;code&gt;Request&lt;/code&gt; 오브젝트를 리스트 형식으로 만들어 리턴하거나 &lt;code&gt;yield&lt;/code&gt;를 사용하여 generator 형식으로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.scrapy.org/en/latest/topics/request-response.html&quot;&gt;scrapy.Request()&lt;/a&gt;&lt;br /&gt;&lt;code&gt;Request&lt;/code&gt; 오브젝트를 만들기 위해 사용.
&lt;ul&gt;
&lt;li&gt;url&lt;br /&gt;요청할 사이트 주소 http 형식&lt;/li&gt;
&lt;li&gt;callback&lt;br /&gt;&lt;code&gt;Response&lt;/code&gt; 오브젝트를 처리할 메서드를 지정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;parse(self, response)&lt;/code&gt; (필수)
&lt;ul&gt;
&lt;li&gt;Response&lt;code&gt;오브젝트를 처리하는 callback 메서드로 argument로&lt;/code&gt;Response` 오브젝트를 받음.&lt;/li&gt;
&lt;li&gt;위 코드와 같이 &lt;code&gt;Request&lt;/code&gt; 오브젝트를 만들 때 callback를 사용자가 지정하기 때문에 parse란 이름 대신 다른 이름으로 사용해도 됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;response.css('h1::text').get()&lt;/code&gt;&lt;br /&gt;&lt;a href=&quot;https://docs.scrapy.org/en/latest/topics/selectors.html&quot;&gt;css selector&lt;/a&gt;를 사용하여 h1 태그를 찾고 텍스트를 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;$ scrapy genspider [template_name] &amp;lt;spider_name&amp;gt; &amp;lt;domain_name&amp;gt;&lt;/code&gt; 명령을 사용하면 템플릿을 사용하여 자동으로 템플릿에 맞는 클래스가 작성된 &lt;code&gt;spider_name&lt;/code&gt;으로된 파이썬 파일을 spiders 폴더 안에 만듬.&lt;br /&gt;클래스는 아래에 있는 코드가 줄여진 형태.&lt;br /&gt;&lt;code&gt;$ scrapy genspider -l&lt;/code&gt; 명령으로 사용할 수 있는 템플릿을 확인할 수 있음.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Scrapy 실행&lt;/h2&gt;
&lt;p&gt;위에서 정의한 spider를 실행하고 &lt;code&gt;start_requests&lt;/code&gt; 메서드를 실행함.&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ scrapy runspider example.py
# 또는 
# scrapy crawl &amp;lt;spider name&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Spider 코드 줄이기&lt;/h2&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;# example.py
import scrapy

class ExampleSpider(scrapy.Spider):
    name = 'example'
    start_urls = [
        'http://www.example.com/'
    ]

    def parse(self, response):
        url = response.url
        title = response.css('h1::text').get()
        print(f'URL is: {url}')
        print(f'Title is: {title}')&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;start_requests&lt;/code&gt; 메서드 대신 &lt;code&gt;start_urls&lt;/code&gt;를 사용하면 spider가 시작 될 때 알아서 작성된 URL을 사용하여 &lt;code&gt;Request&lt;/code&gt; 오브젝트를 생성하고 리턴.&lt;/li&gt;
&lt;li&gt;callback으로 &lt;code&gt;self.parse&lt;/code&gt; 메서드를 사용하기 때문에 이름을 변경하면 안됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href=&quot;https://docs.scrapy.org/en/latest/topics/items.html&quot;&gt;Item&lt;/a&gt; 사용하기&lt;/h2&gt;
&lt;p&gt;Crawl한 페이지에서 원하는 데이터를 추출한 후 구조적으로 저장하기 위해 사용.&lt;br /&gt;&lt;code&gt;Item&lt;/code&gt;이라는 오브젝트에 attribute 형태로 데이터가 저장되고 원할 경우 이 데이터를 JSON이나 CSV 같이 파일로 저장할 수 있음.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;물론 파이썬에서 제공하는 &lt;code&gt;open&lt;/code&gt; 모듈을 사용하여 parsing 단계에서 파일 형태로 저장할 수 있지만 이런 수고로움 없이 Scrapy에서 편리하게 사용할 수 있는 방법을 제공. 또한 많은 양의 데이터를 파일로 저장할 경우 I/O 병목이나 오버헤드 또는 쓰레드 처리 등등 여러가지 문제들이 발생할 수 있기 때문에 심신의 안정과 평안을 얻기 위해서도 Scrapy에서 제공하는 방법을 사용. 근본적으로 framework를 사용하는 이유이기도&amp;hellip;&amp;hellip;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;보통 &lt;code&gt;items.py&lt;/code&gt;에 클래스를 정의(그냥 spyder가 정의된 파일에 같이 사용해도 되나 편의상 구분하여 정의)&lt;/p&gt;
&lt;p&gt;클래스는 &lt;code&gt;scrapy.Item&lt;/code&gt;을 상속해야 하고 데이터들을 저장할 필드를 &lt;code&gt;scrapy.Filed&lt;/code&gt; 오브젝트로 만듬.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;example&lt;/code&gt; 스파이더를 item을 사용하게 변경 하면&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;# items.py
import scrapy

class ExampleItem(scrapy.Item):
    url = scrapy.Field()
    title = scrapy.Field()

# example.py
import scrapy
from ..items import ExampleItem  # 위에서 정의한 클래스 import

class ExampleSpider(scrapy.Spider):
    name = 'example'
    start_urls = [
        'http://www.example.com/'
    ]

    def parse(self, response):
        example_item = ExampleItem()        # Item 오브젝트 생성
        example_item['url'] = response.url  # 데이터 저장
        example_item['title'] = response.css('h1::text').get()

        return example_item&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;처음 작성한 코드와 다른 점은 &lt;code&gt;Item&lt;/code&gt; 오브젝트는 반드시 리턴되어야 한다는 것이다.&lt;br /&gt;처음 작성한 코드는 명시적으로 데이터를 출력하게 한것이고, 여기서는 오브젝트를 리턴해야 로그에 데이터가 출력도 되고 나중에 파일로 저장될 때 사용되어 진다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Django를 경험해 본 사람은 item이 Django의 Model과 비슷한걸 느낄 것이다. 실제로 Scrapy 문서에도 유사하다고 나와 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Item 파일로 저장하기&lt;/h2&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ scrapy runspider examle.py -o example.csv -t csv
$ scrapy runspider examle.py -o example.json -t json
$ scrapy runspider examle.py -o example.xml -t xml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;-t&lt;/code&gt; 옵션을 사용하지 않아도 Scrapy가 파일 확장자를 보고 자동으로 확장자에 맞게 저장 해줌.&lt;/p&gt;
&lt;h2&gt;Logging 사용하기&lt;/h2&gt;
&lt;p&gt;CLI에서 Scrapy를 실행하면 실행되는 내용이 출력되는데 내용이 길 경우(보통은 긴 내용이 출력됨) 확인하기가 어렵기 때문에 출력 내용을 파일로 저장해서 확인하면 편함.&lt;/p&gt;
&lt;p&gt;아래와 같이 &lt;code&gt;settings.py&lt;/code&gt;에서 로깅을 설정할 수 있음(CLI에 출력 안됨).&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;LOG_FILE = 'spider.log'  # log 파일 위치
LOG_LEVEL = 'INFO'       # 기본은 DEBUG 임&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;또는 Scrapy를 실행 할 때 설정&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ scrapy runspider example.py -s LOG_FILE=spider.log&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;팁&lt;/h2&gt;
&lt;h3&gt;사이트 제한으로 crawling이 안되는 경우&lt;/h3&gt;
&lt;p&gt;Scrapy를 실행 할 경우 간혹 사이트에서 제한을 걸어 crawling을 못하는 경우가 발생. 왜냐하면 Scrapy는 실행 시 &lt;a href=&quot;https://support.google.com/webmasters/answer/6062608?hl=ko&quot;&gt;robots.txt&lt;/a&gt; 파일을 확인해서 제한이 걸려 있는 페이지를 crawling 하지 않기 때문.&lt;br /&gt;이 문제를 해결할려면 &lt;code&gt;settings.py&lt;/code&gt;에서 &lt;code&gt;ROBOTSTXT_OBEY = True&lt;/code&gt;을 False로 수정하면 됨.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(주의)그러나 과도하게 사이트에 부하(crawling)를 주면 IP가 차단될 수도 있음.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;과도한 요청으로 인한 차단을 피하는 방법&lt;/h3&gt;
&lt;p&gt;과도하게 사이트를 crawling 할 경우 사이트에서(관리가 잘되는 곳)에서 IP를 차단 할 수도 있다. 이를 예방하기 위해 &lt;code&gt;DOWNLOAD_DELAY&lt;/code&gt;와 &lt;code&gt;CONCURRENT_REQUESTS&lt;/code&gt; 수정해 요청(request)을 조절할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;# settings.py
DOWNLOAD_DELAY = 0.25    # 250ms 기다림, 기본값은 안기다림
CONCURRENT_REQUESTS = 1  # 기본값은 16&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 설정은 한 개의 request 후 0.25초를 기다림&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DOWNLOAD_DELAY&lt;/code&gt;은 request 후 얼마를 기다릴 지 설정&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CONCURRENT_REQUESTS&lt;/code&gt;은 한번 request 할 때 동시에 몇개의 request를 할지 설정. 예를 들어 총 100개의 페이지(url)를 요청(request)해야 한다면, 한번 요청할 때 20개 씩 나눠서 요청 할 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;HTTP cache를 사용&lt;/h3&gt;
&lt;p&gt;아래와 같이 &lt;code&gt;settings.py&lt;/code&gt;에 설정을 하면 cache 기능을 사용할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;# settings.py
HTTPCACHE_ENABLED = True  # 기본 값은 False&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위와 같이 설정을 하면 한번 request한 페이지 정보들이 프로젝트 디렉토리의 &lt;code&gt;.scrapy&lt;/code&gt; 안에 저장(cache)되고 다음에 같은 페이지를 request 할 때 cache를 사용하여 속도를 향상 시킬 수 있다.&lt;/p&gt;</description>
      <category>Web Crawling</category>
      <category>scrapy</category>
      <category>web crawling</category>
      <author>nickas</author>
      <guid isPermaLink="true">https://python-world.tistory.com/49</guid>
      <comments>https://python-world.tistory.com/entry/Simple-Scrapy#entry49comment</comments>
      <pubDate>Sun, 10 May 2020 23:25:06 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 조건문 그리고 반복문</title>
      <link>https://python-world.tistory.com/entry/python-if-for-while</link>
      <description>&lt;p&gt;조건문은 어떤 조건이 참일 때 수행되는 구문이고 반복문은 구문을 반복적으로 수행하기 위해 사용&lt;br&gt;조건문을 만들기 위해서는 &lt;code&gt;if&lt;/code&gt;를 사용하고 반복문은 &lt;code&gt;for&lt;/code&gt;와 &lt;code&gt;while&lt;/code&gt;을 사용.&lt;/p&gt;
&lt;h2&gt;if&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;if&lt;/code&gt;는 영어가 의미하는 대로 만약(if) 조건이  참(True)이면 if문(들여쓴문) 아래 행동을 실행.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;if 1:  # 여기서 1은 True를 의미
    print(&amp;#39;True&amp;#39;)

# output
&amp;#39;True&amp;#39;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;elif&lt;/code&gt; 문 사용&lt;/h3&gt;
&lt;p&gt;조건을 여러 개 추가 할 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;a = 0

if a == 1:
    print(&amp;#39;a는 1이다&amp;#39;)
elif a == 2:
    print(&amp;#39;a는 2이다&amp;#39;)
elif a == 0:
    print(&amp;#39;a는 0이다&amp;#39;)

# output
&amp;#39;a는 0이다&amp;#39;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;membership 확인&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;list&lt;/code&gt; 같은 데이터 모음에 주어진 아이템이 존재하는지 확인&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;a = [1, 2, 3, 4, 5]
if 1 in a:  # 1이 존재하면 True 반환
    print(&amp;#39;true&amp;#39;)&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;for&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;for&lt;/code&gt;는 조건에 iterable(반복 가능한)가 주어지고 iterable에서 값을 가져와 주어진 행동을 반복적으로 실행.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;iterable이란 굳이 번역하자면 반복 가능한 객체 정로도 번역할 수 있는데 이게 사전에는 없는 프로그래밍 영역에서 만들어진(프로그래머들 사이에서 쓰이는) 단어이다(이렇게 사전에는 없는 새로 만들어진 단어들이 존재). iteration(반복)이라는 단어를 형용사 형태로 만들어 사용하는 듯.&lt;br&gt;파이썬에서 말하는(다른 프로그램 언어에서도 이 단어를 사용) iterable를 이해 할려면 generator 부분을 보면 됨.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;for i in [1, 2, 3, 4, 5]:  # i는 loop 변수라 불림
    print(i)

# output
1
2
3
4
5&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Dictionary 사용&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;d = {1: &amp;#39;a&amp;#39;, 2: &amp;#39;b&amp;#39;, 3: &amp;#39;c&amp;#39;}
for key in d:  # key 값이 반환 됨. d.keys()와 같음
    print(key)

# output
1
2
3

for value in d.values():  # .value() 메서드를 사용하여 value 값을 반환
    print(value)

# output 
&amp;#39;a&amp;#39;
&amp;#39;b&amp;#39;
&amp;#39;c&amp;#39;

for key, value in d.items():  # .items() 메서드를 사용하여 key와 value 값을 반환
    print(key, value)

# output
1 &amp;#39;a&amp;#39;
2 &amp;#39;b&amp;#39;
3 &amp;#39;c&amp;#39;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;확장된 loop 변수 할당 사용법&lt;/h3&gt;
&lt;p&gt;nested된 list가 iterable로 주어 졌을 때 처리 방법&lt;br&gt;예를 들어, &lt;code&gt;[(1, 2, 3), (4, 5, 6)]&lt;/code&gt; 이와 같이 list 안에 tuple로 정의된 아이템이 있고 tuple이 아닌 각각의 아이템을 구하고? 싶을 때&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;for a, b, c in [(1, 2, 3), (4, 5, 6)]:
    print(a, b, c)

# output
1 2 3
4 5 6&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;nested for loop&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;for&lt;/code&gt; 문 안에 &lt;code&gt;for&lt;/code&gt; 문을 사용 할 수 있음.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;a = [&amp;#39;a&amp;#39;, &amp;#39;b&amp;#39;, &amp;#39;c&amp;#39;, &amp;#39;d&amp;#39;]
for i in a:
    for x in a:
        print(i + x)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;for&lt;/code&gt;문 안에 &lt;code&gt;for&lt;/code&gt;문 사용은 제한이 없으나 대부분의 경우는 2개의 &lt;code&gt;for&lt;/code&gt;문 사용으로 문제를 해결할 수 있다. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;필터로써 if 사용&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;if&lt;/code&gt;를 사용하여 내가 원하는 값만 획득하거나 원하지 않는 값을 제외할 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# list a에서 짝수 인 값을 구하기
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for i in a:
    if i % 2 == 0:  # 2로 나눈 나머지가 0이면 짝수
        print(i, &amp;#39;는 짝수&amp;#39;)

# list a에서 짝수인 값과 홀수인 값 구별하기
for i in a:
    if i % 2 == 0:
        print(i, &amp;#39;는 짝수&amp;#39;)
    else:
        print(i, &amp;#39;는 홀수&amp;#39;)&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;while&lt;/h2&gt;
&lt;p&gt;영어 단어 그대로 조건이 참일 동안(while) 주어진 행동을 반복적으로 수행&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;while True:
    print(&amp;#39;True&amp;#39;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;for&lt;/code&gt;와 다른 점은 &lt;code&gt;for&lt;/code&gt;는 주어진 값(iterable한 값)이 존재하는 동안 실행되는 반면, &lt;code&gt;while&lt;/code&gt;은 주어진 조건이 참(True)일 동안(거짓(False)으로 바뀌지 않으면 무한 실행) 반복적으로 특정 행동을 실행할 필요가 있을 때 사용.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;a = 10
while a:  # 0은 거짓(False)을 의미하기 때문에 a가 0이 되면 실행 안됨.
    print(a)
    a -= 1&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;&lt;code&gt;else&lt;/code&gt; 문 사용&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;if&lt;/code&gt;와 함께 사용 시 조건이 거짓(False) 일 때 다른 행동을 하게 하고 싶을 때 사용&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;if not 1:  # 1(True(참))이 아닌 것은 False(거짓)이다.
    print(&amp;#39;True&amp;#39;)
else:
    print(&amp;#39;False&amp;#39;)

# output
&amp;#39;False&amp;#39;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;while&lt;/code&gt;와 함께 사용 시 조건이 거짓일 될 때만 &lt;code&gt;else&lt;/code&gt; 문이 실행됨(한번).&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;a = 10
while a:
    print(a)
    a -= 1
else:
    print(a)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;for&lt;/code&gt;와 함께 사용 시 &lt;code&gt;for&lt;/code&gt; 구문이 끝나고(더 이상 가지고 올 값이 없을 때) &lt;code&gt;else&lt;/code&gt; 구문이 실행 됨.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;for i in (1, 2, 3, 4):
    print(i)
else:
    print(&amp;#39;done&amp;#39;)

# output
1
2
3
4
&amp;#39;done&amp;#39;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;code&gt;break&lt;/code&gt; 문 사용&lt;/h2&gt;
&lt;p&gt;반복문(&lt;code&gt;for&lt;/code&gt;, &lt;code&gt;while&lt;/code&gt;) 실행 중 &lt;code&gt;break&lt;/code&gt;를 만나면 반복문이 종료됨&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;x = 10
while True:
    x = x -1
    if x % 2 != 0:  # x를 2로 나눈 나머지가 0일 경우
        break
    print(x)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;for i in (1, 2, 3, 4, 5):
    if i % 2 == 0:
        break
    print(i)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;else&lt;/code&gt;와 함께 사용 시 &lt;code&gt;break&lt;/code&gt;를 만나면 &lt;code&gt;else&lt;/code&gt;는 실행 되지 않고 반복문이 종료됨&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;x = 10
while x:
    if x % 2 == 0:
        break
    x -= 1
else:
    print(x, &amp;#39;는 0&amp;#39;)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;for i in (1, 2, 3, 4, 5):
    if i % 2 == 0:
        break
    print(i)
else:
    print(&amp;#39;done&amp;#39;)&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;code&gt;continue&lt;/code&gt; 문 사용&lt;/h2&gt;
&lt;p&gt;반복문 실행 중  &lt;code&gt;continue&lt;/code&gt;를 만나면 반복문 시작으로 돌아가 실행.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;x = 10
while x:           # 숫자가 0이 아닐 경우 참(True).
    x = x - 1
    if x % 2 == 0:
        continue   # 다시 while 문으로 돌아가 실행
    print(x)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;for i in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10):
    if i % 2 == 0:
        continue
    print(i)&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;code&gt;pass&lt;/code&gt; 문 사용&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;pass&lt;/code&gt;는 단어 그대로 아무것도 하지 않음.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;x = 10
while x:
    if x % 2 == 0:
        pass
    print(x)
    x -= 1&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;for i in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10):
    if i % 2 == 0:
        pass
    print(i)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Basic</category>
      <author>nickas</author>
      <guid isPermaLink="true">https://python-world.tistory.com/48</guid>
      <comments>https://python-world.tistory.com/entry/python-if-for-while#entry48comment</comments>
      <pubDate>Sun, 26 Apr 2020 17:02:15 +0900</pubDate>
    </item>
    <item>
      <title>Set</title>
      <link>https://python-world.tistory.com/entry/Set</link>
      <description>&lt;h1&gt;Set&lt;/h1&gt;
&lt;h2&gt;특징&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Set&lt;/code&gt;은 중복을 허용하지 않음(중복제거, unique한 값을 가짐)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Set&lt;/code&gt;은 순서가 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Set 만들기&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s1 = set()  # 빈 set 만듬
&amp;gt;&amp;gt;&amp;gt; s1
set()
&amp;gt;&amp;gt;&amp;gt; s2 = set([1, 2, 1, 3])
&amp;gt;&amp;gt;&amp;gt; s2
{1, 2, 3}
# 또는
&amp;gt;&amp;gt;&amp;gt; s2 = set(range(1, 4))

&amp;gt;&amp;gt;&amp;gt; s3 = {1, 2, 1, 3}
&amp;gt;&amp;gt;&amp;gt; s3
{1, 2, 3}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ez9bZ4/btqDISDbIJs/TI1bKyZxUAoa8gCbK8ecX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ez9bZ4/btqDISDbIJs/TI1bKyZxUAoa8gCbK8ecX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ez9bZ4/btqDISDbIJs/TI1bKyZxUAoa8gCbK8ecX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fez9bZ4%2FbtqDISDbIJs%2FTI1bKyZxUAoa8gCbK8ecX0%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;아이템 추가&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s = set()
&amp;gt;&amp;gt;&amp;gt; s.add(1)
&amp;gt;&amp;gt;&amp;gt; s.add(2)
&amp;gt;&amp;gt;&amp;gt; s.add(1)
&amp;gt;&amp;gt;&amp;gt; s
{1, 2}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;여러 아이템 추가 한번에 추가&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s = set()
&amp;gt;&amp;gt;&amp;gt; s.update([1, 2, 3])
&amp;gt;&amp;gt;&amp;gt; s
{1, 2, 3}&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;아이템 가져오기&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;.pop()&lt;/code&gt;을 사용하면 맨 왼쪽의 아이템이 반환되고 지워짐&lt;br&gt;&lt;code&gt;set&lt;/code&gt;은 순서가 없기 때문에 index를 사용하여 아이템을 가져 올 수 없음&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s = {1, 2, 3, 4}
&amp;gt;&amp;gt;&amp;gt; s.pop()
1
&amp;gt;&amp;gt;&amp;gt; s
{2, 3, 4}&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;아이템 제거&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;.remove()&lt;/code&gt; 사용&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s = set([1, 2, 3])
&amp;gt;&amp;gt;&amp;gt; s.remove(1)
&amp;gt;&amp;gt;&amp;gt; s
{2, 3}
&amp;gt;&amp;gt;&amp;gt; s.remove(1)  # key error 발생
KeyError: 1&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.discard()&lt;/code&gt; 사용&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s = {1, 2, 3}
&amp;gt;&amp;gt;&amp;gt; s.discard(1)
&amp;gt;&amp;gt;&amp;gt; s
{2, 3}
&amp;gt;&amp;gt;&amp;gt; s.discard(1)  # 아이템이 없어도 에러 발생 안함&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.clear()&lt;/code&gt; 사용&lt;/h3&gt;
&lt;p&gt;전체 아이템을 삭제&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s = {1, 2, 3}
&amp;gt;&amp;gt;&amp;gt; s.clear()
&amp;gt;&amp;gt;&amp;gt; s
set()&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;연산&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s1 = set([1, 2, 3, 4, 5, 6])
&amp;gt;&amp;gt;&amp;gt; s2 = set([4, 5, 6, 7, 8, 9])&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;교집합&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s1 &amp;amp; s2
{4, 5, 6}

&amp;gt;&amp;gt;&amp;gt; s1.intersection(s2)
{4, 5, 6}
&amp;gt;&amp;gt;&amp;gt; s2.intersection(s1)
{4, 5, 6}

&amp;gt;&amp;gt;&amp;gt; s1 &amp;amp;= s2  # 교집한 후 s1에 대입
&amp;gt;&amp;gt;&amp;gt; s1
{4, 5, 6}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;합집합&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s1 | s2
{1, 2, 3, 4, 5, 6, 7, 8, 9}

&amp;gt;&amp;gt;&amp;gt; s1.union(s2)
{1, 2, 3, 4, 5, 6, 7, 8, 9}
&amp;gt;&amp;gt;&amp;gt; s2.union(s1)
{1, 2, 3, 4, 5, 6, 7, 8, 9}

&amp;gt;&amp;gt;&amp;gt; s1 |= s2  # 합집합 후 s1에 대입
&amp;gt;&amp;gt;&amp;gt; s1
{1, 2, 3, 4, 5, 6, 7, 8, 9}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;차집합&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s1 - s2
{1, 2, 3}
&amp;gt;&amp;gt;&amp;gt; s2 - s1
{8, 9, 7}

&amp;gt;&amp;gt;&amp;gt; s1.difference(s2)
{1, 2, 3}
&amp;gt;&amp;gt;&amp;gt; s2.difference(s1)
{8, 9, 7}

&amp;gt;&amp;gt;&amp;gt; s1 -= s2  # 차집합 후 s1에 대입
&amp;gt;&amp;gt;&amp;gt; s1
{1, 2, 3}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;대칭차집함&lt;/h3&gt;
&lt;p&gt;합집합과 교집합을 따로 실행 후 합집합에서 교집합 빼기(합집합 - 교집합)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s1 ^ s2
{1, 2, 3, 7, 8, 9}

&amp;gt;&amp;gt;&amp;gt; s1.symmetric_difference(s2)
{1, 2, 3, 7, 8, 9}
&amp;gt;&amp;gt;&amp;gt; s2.symmetric_difference(s1)
{1, 2, 3, 7, 8, 9}

&amp;gt;&amp;gt;&amp;gt; s1 ^= s2  # 대칭차집합 후 s1에 대입
&amp;gt;&amp;gt;&amp;gt; s1
{1, 2, 3, 7, 8, 9}&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Set 메서드&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;.issubset()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;부분 집합 여부 확인&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s1 = {1, 2, 3, 4, 5}
&amp;gt;&amp;gt;&amp;gt; s2 = {1, 2, 3}
&amp;gt;&amp;gt;&amp;gt; s1.issubset(s2)
False
&amp;gt;&amp;gt;&amp;gt; s2.issubset(s1)
True&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.issuperset()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;.issubset()&lt;/code&gt;의 반대(포함 여부 판단)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s1 = {1, 2, 3, 4, 5}
&amp;gt;&amp;gt;&amp;gt; s2 = {1, 2, 3}
&amp;gt;&amp;gt;&amp;gt; s1.issuperset(s2)
True
&amp;gt;&amp;gt;&amp;gt; s2.issuperset(s1)
False&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.isdisjoint()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;교집합이 없으면 &lt;code&gt;True&lt;/code&gt;, 있으면 &lt;code&gt;False&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s1 = {1, 2, 3, 4, 5}
&amp;gt;&amp;gt;&amp;gt; s2 = {1, 2, 3}
&amp;gt;&amp;gt;&amp;gt; s1.isdisjoint(s2)
True
&amp;gt;&amp;gt;&amp;gt; s2.isdisjoint(s1)
True

&amp;gt;&amp;gt;&amp;gt; s1 = {1, 2, 3}
&amp;gt;&amp;gt;&amp;gt; s2 = {4, 5, 6}
&amp;gt;&amp;gt;&amp;gt; s1.isdisjoint(s2)
False
&amp;gt;&amp;gt;&amp;gt; s2.isdisjoint(s1)
False&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Set 복사&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s = {1, 2, 3}
&amp;gt;&amp;gt;&amp;gt; c = s.copy()
&amp;gt;&amp;gt;&amp;gt; s
{1, 2, 3}
&amp;gt;&amp;gt;&amp;gt; c
{1, 2, 3}
&amp;gt;&amp;gt;&amp;gt; id(s)
4554012032
&amp;gt;&amp;gt;&amp;gt; id{c}
4554012704

&amp;gt;&amp;gt;&amp;gt; s = set(1, 2, 3)
&amp;gt;&amp;gt;&amp;gt; c = set(s)
&amp;gt;&amp;gt;&amp;gt; s
{1, 2, 3}
&amp;gt;&amp;gt;&amp;gt; c
{1, 2, 3}
&amp;gt;&amp;gt;&amp;gt; id(s)
4554012032
&amp;gt;&amp;gt;&amp;gt; id(c)
4554012928&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Comprehensions&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; l = [1, 2, 3, 4, 5]
&amp;gt;&amp;gt;&amp;gt; {i for i in l}
{1, 2, 3, 4, 5}&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;frozenset&lt;/h2&gt;
&lt;p&gt;한번 만들어 지면 변경할 수 없는 &lt;code&gt;set&lt;/code&gt;(immutable)&lt;br&gt;아이템을 추가하거나 변경하는 메서드를 제공하지 않음(add, remove, pop, clear, update)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s = frozenset()  # 빈 set
&amp;gt;&amp;gt;&amp;gt; s = frozenset([1, 2, 3])
&amp;gt;&amp;gt;&amp;gt; s = frozenset(range(1, 4))&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;연산&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;set&lt;/code&gt;의 연산법과 같음&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s1 = frozenset([1, 2, 3, 4, 5])
&amp;gt;&amp;gt;&amp;gt; s2 = frozenset([4, 5, 6, 7, 8])

# 교집합
&amp;gt;&amp;gt;&amp;gt; s1 &amp;amp; s2
frozenset({4, 5})
&amp;gt;&amp;gt;&amp;gt; s1.intersection(s2)

# 합집합
&amp;gt;&amp;gt;&amp;gt; s1 | s2
frozenset({1, 2, 3, 4, 5, 6, 7, 8})
&amp;gt;&amp;gt;&amp;gt; s1.union(s2)
frozenset({1, 2, 3, 4, 5, 6, 7, 8})

# 차집합
&amp;gt;&amp;gt;&amp;gt; s1 - s2
frozenset({1, 2, 3})
&amp;gt;&amp;gt;&amp;gt; s1.difference(s2)
frozenset({1, 2, 3})

# 대칭차집합
&amp;gt;&amp;gt;&amp;gt; s1 ^ s2
frozenset({1, 2, 3, 6, 7, 8})
&amp;gt;&amp;gt;&amp;gt; s1.symmetric_difference(s2)
frozenset({1, 2, 3, 6, 7, 8})&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;메서드&lt;/h3&gt;
&lt;h4&gt;&lt;code&gt;.issubset()&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;부분 집합 여부 확인&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s1 = frozenset([1, 2, 3, 4, 5])
&amp;gt;&amp;gt;&amp;gt; s2 = frozenset([1, 2, 3])
&amp;gt;&amp;gt;&amp;gt; s1.issubset(s2)
False
&amp;gt;&amp;gt;&amp;gt; s2.issubset(s1)
True&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;.issuperset()&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;.issubset()&lt;/code&gt;의 반대(포함 여부 판단)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s1 = frozenset([1, 2, 3, 4, 5])
&amp;gt;&amp;gt;&amp;gt; s2 = frozenset([1, 2, 3])
&amp;gt;&amp;gt;&amp;gt; s1.issuperset(s2)
True
&amp;gt;&amp;gt;&amp;gt; s2.issuperset(s1)
False&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;code&gt;.isdisjoint()&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;교집합이 없으면 &lt;code&gt;True&lt;/code&gt;, 있으면 &lt;code&gt;False&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s1 = frozenset([1, 2, 3, 4, 5])
&amp;gt;&amp;gt;&amp;gt; s2 = frozenset([1, 2, 3])
&amp;gt;&amp;gt;&amp;gt; s1.isdisjoint(s2)
True
&amp;gt;&amp;gt;&amp;gt; s2.isdisjoint(s1)
True

&amp;gt;&amp;gt;&amp;gt; s1 = frozenset([1, 2, 3])
&amp;gt;&amp;gt;&amp;gt; s2 = frozenset([4, 5, 6])
&amp;gt;&amp;gt;&amp;gt; s1.isdisjoint(s2)
False
&amp;gt;&amp;gt;&amp;gt; s2.isdisjoint(s1)
False&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;복사&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s = frozenset([1, 2, 3])
&amp;gt;&amp;gt;&amp;gt; c = s.copy()
&amp;gt;&amp;gt;&amp;gt; s
frozenset({1, 2, 3})
&amp;gt;&amp;gt;&amp;gt; c
frozenset({1, 2, 3})
&amp;gt;&amp;gt;&amp;gt; id(s)
4581973344
&amp;gt;&amp;gt;&amp;gt; id(c)
4581973344&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Basic</category>
      <category>Python</category>
      <author>nickas</author>
      <guid isPermaLink="true">https://python-world.tistory.com/47</guid>
      <comments>https://python-world.tistory.com/entry/Set#entry47comment</comments>
      <pubDate>Sat, 25 Apr 2020 09:53:46 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 Tuple</title>
      <link>https://python-world.tistory.com/entry/python-tuple</link>
      <description>&lt;p&gt;&lt;code&gt;Tuple&lt;/code&gt;은 &lt;code&gt;list&lt;/code&gt;나 &lt;code&gt;dictionary&lt;/code&gt;와 다른게 한번 만들어 지면 변경될 수 없음(immutable).&lt;br /&gt;데이터 모음이 변경되지 않는 것을 보장해야 할 때 사용.&lt;br /&gt;&lt;code&gt;()&lt;/code&gt;를 사용하여 만듬.&lt;/p&gt;
&lt;h2&gt;Tuple 만들기&lt;/h2&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; t = ()       # 빈 tuple 
&amp;gt;&amp;gt;&amp;gt; t = tuple()  # tuple() 빌트인 함수 사용&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btjS5J/btqDxK0kO0P/BniaGIuidmKJBxAtvBbtQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btjS5J/btqDxK0kO0P/BniaGIuidmKJBxAtvBbtQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btjS5J/btqDxK0kO0P/BniaGIuidmKJBxAtvBbtQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtjS5J%2FbtqDxK0kO0P%2FBniaGIuidmKJBxAtvBbtQ0%2Fimg.png&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;194&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;아이템 추가&lt;/h2&gt;
&lt;p&gt;한번 만들어진 tuple은 아이템을 추가하거나 변경 할 수 없기 때문에 사실상 아이템을 추가 할 수 있는 방법이 없고 tuple을 만들면서 아이템을 추가하여야 함.&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; t = (0,)
&amp;gt;&amp;gt;&amp;gt; t = 0, 'spam', 1.2
&amp;gt;&amp;gt;&amp;gt; t = tuple('spam')
('s', 'p', 'a', 'm')

&amp;gt;&amp;gt;&amp;gt; t = tuple(0)  # iterable한 아이템만 사용가능
TypeError: 'int' object is not iterable&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eBjC0G/btqDvZqHmfk/LKyoyQaQZCLezlpvquHvKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eBjC0G/btqDvZqHmfk/LKyoyQaQZCLezlpvquHvKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eBjC0G/btqDvZqHmfk/LKyoyQaQZCLezlpvquHvKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeBjC0G%2FbtqDvZqHmfk%2FLKyoyQaQZCLezlpvquHvKK%2Fimg.png&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;322&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(주의) &lt;code&gt;t = (0)&lt;/code&gt; 이렇게 &lt;code&gt;,(콤마)&lt;/code&gt; 없이 사용하면 그냥 &lt;code&gt;integer&lt;/code&gt; 타입이 됨. 반드시 콤마를 사용해야 함.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;아이템 가져오기&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;list&lt;/code&gt;와 같이 index를 사용.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; t = (0, 1, 2, 3)
&amp;gt;&amp;gt;&amp;gt; t[0]
0&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;netsted 아이템 가져오기&lt;/h3&gt;
&lt;p&gt;사용법은 &lt;code&gt;list&lt;/code&gt;와 같음&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; t = (1, [2, 3], 4)
&amp;gt;&amp;gt;&amp;gt; t[1][0]
2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;810&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lBfXm/btqDwDnerEG/0GLKklLO5cYCg8w7NXyvq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lBfXm/btqDwDnerEG/0GLKklLO5cYCg8w7NXyvq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lBfXm/btqDwDnerEG/0GLKklLO5cYCg8w7NXyvq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlBfXm%2FbtqDwDnerEG%2F0GLKklLO5cYCg8w7NXyvq0%2Fimg.png&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;810&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;아이템 변경하기&lt;/h2&gt;
&lt;p&gt;한번 만들어지 tuple은 아이템을 변경 할 수 없음.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; t = (0, 1, 2, 3)
&amp;gt;&amp;gt;&amp;gt; t[0] = 4
TypeError: 'tuple' object does not support item assignment&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그러나 nested 아이템이 &lt;code&gt;list&lt;/code&gt; 같이 mutable 아이템이면 변경가능.&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; t = (0, [1, 2], 3)
&amp;gt;&amp;gt;&amp;gt; t[1][0] = 'a'
&amp;gt;&amp;gt;&amp;gt; t
(0, ['a', 2], 3)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;804&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXcBUL/btqDx5pFvXN/7lj8fVL1aTx2j3glWsR5t1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXcBUL/btqDx5pFvXN/7lj8fVL1aTx2j3glWsR5t1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXcBUL/btqDx5pFvXN/7lj8fVL1aTx2j3glWsR5t1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXcBUL%2FbtqDx5pFvXN%2F7lj8fVL1aTx2j3glWsR5t1%2Fimg.png&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;804&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Nested된 mutable 아이템을 사용할 때 주의사항&lt;/p&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; l = [0, 1]
&amp;gt;&amp;gt;&amp;gt; t = (0, l, 2)
&amp;gt;&amp;gt;&amp;gt; t
(0, [0, 1], 2)

&amp;gt;&amp;gt;&amp;gt; l[0] = 3  # list 아이템을 변경 시 tuple에서 사용한 list도 같이 변경 됨
&amp;gt;&amp;gt;&amp;gt; t
(0, [3, 1], 2)&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;연산&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; (1, 2) + (3, 4)
(1, 2, 3, 4)
&amp;gt;&amp;gt;&amp;gt; (1, 2) * 4
(1, 2, 1, 2, 1, 2, 1, 2)&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Slicing&lt;/h2&gt;
&lt;p&gt;사용법은 &lt;code&gt;list&lt;/code&gt;와 같음&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; t = 0, 1, 2, 3
&amp;gt;&amp;gt;&amp;gt; t[1:3]
(1, 2)&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;정렬하기&lt;/h2&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;# list로 변환 후 .sort() 메서드 사용
&amp;gt;&amp;gt;&amp;gt; t = (3, 2, 1, 0)
&amp;gt;&amp;gt;&amp;gt; l = list(t)
&amp;gt;&amp;gt;&amp;gt; l.sort()
&amp;gt;&amp;gt;&amp;gt; l
[0, 1, 2, 3]
&amp;gt;&amp;gt;&amp;gt; t = tuple(l)
&amp;gt;&amp;gt;&amp;gt; t
(0, 1, 2, 3)

# sorted() 빌트인 함수 사용
&amp;gt;&amp;gt;&amp;gt; t = (3, 2, 1, 0)
&amp;gt;&amp;gt;&amp;gt; sorted(t)
[0, 1, 2, 3)&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Tuple 메서드&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;.index()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;아이템의 index 위치를 반환&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; t = ('a', 'b', 'c')
&amp;gt;&amp;gt;&amp;gt; t.index('a)
0

# 중복된 아이템이 있을 경우 사용
&amp;gt;&amp;gt;&amp;gt; t = ('a', 'b', 'a', 'c')
&amp;gt;&amp;gt;&amp;gt; t.index('a', 2)  # 두 번째 a의 위치를 반환
2&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.count()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;아이템 갯수를 반환&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; t = (1, 2, 3, 2, 3, 2)
&amp;gt;&amp;gt;&amp;gt; t.count(2)
3&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;code&gt;namedtuple&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Dictionary 비스므리하게 사용하기 위해 사용.&lt;br /&gt;&lt;code&gt;tuple&lt;/code&gt;/&lt;code&gt;class&lt;/code&gt;/&lt;code&gt;dictionary&lt;/code&gt;의 하이브리드 형태.&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; from collections import namedtuple
# 레코드 이름과 필드 설정
&amp;gt;&amp;gt;&amp;gt; rec = namedtuple('rec', ['name', 'age', 'jobs'])
&amp;gt;&amp;gt;&amp;gt; john = rec('John', age=50, jobs=['dev', 'mgr'])
&amp;gt;&amp;gt;&amp;gt; john
rec(name='John', age=50, jobs=['dev', 'mgr'])
&amp;gt;&amp;gt;&amp;gt; john[0]
'John'
&amp;gt;&amp;gt;&amp;gt; john.name
'John'

&amp;gt;&amp;gt;&amp;gt; john._asdict()  # Dictionary로 만들어 줌.
{'name': 'John', 'age': 50, 'jobs': ['dev', 'mgr']}
&amp;gt;&amp;gt;&amp;gt; john._asdict()['name']
'John'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Basic</category>
      <category>Python</category>
      <author>nickas</author>
      <guid isPermaLink="true">https://python-world.tistory.com/46</guid>
      <comments>https://python-world.tistory.com/entry/python-tuple#entry46comment</comments>
      <pubDate>Sun, 19 Apr 2020 22:00:38 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 Dictionary</title>
      <link>https://python-world.tistory.com/entry/python-dictionary</link>
      <description>&lt;p&gt;&lt;code&gt;Dictionary&lt;/code&gt;은 말 그대로 사전처럼 인덱스(Key)를 기준으로 원하는 값을 찾기위해 사용.&lt;br /&gt;다른 프로그램 언어(예: 자바스크립트)에서는 &lt;code&gt;map&lt;/code&gt;이라고도 함.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;{}&lt;/code&gt;를 사용하여 만들며 &lt;code&gt;{키: 값}&lt;/code&gt; 형식으로 데이터를 저장. &lt;code&gt;dict()&lt;/code&gt; Built-in 함수를 사용하여 만들 수도 있음.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;key&lt;/code&gt;에는 mutable(예: &lt;code&gt;list&lt;/code&gt;)한 타입은 사용할 수 없음(예: &lt;code&gt;tuple&lt;/code&gt;은 사용가능)&lt;br /&gt;&lt;code&gt;value(값)&lt;/code&gt;에는 모든 type(예: list, dictionary, tuple) 사용 가능.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;List&lt;/code&gt;와 다르게 데이터의 순서(sequence) 없음(&lt;code&gt;list&lt;/code&gt;는 데이터를 넣은 순서대로 정렬되고 index를 이용하여 값을 찾음. &lt;code&gt;Dictionary&lt;/code&gt;는 키를 이용하여 값을 찾기에 순서가 필요 없음)&lt;/p&gt;
&lt;h2&gt;Dictionary 만들기&lt;/h2&gt;
&lt;pre class=&quot;python-repl ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = {}  # 빈 Dictionary 만들기
&amp;gt;&amp;gt;&amp;gt; a
{}
&amp;gt;&amp;gt;&amp;gt; type(a)
dict

&amp;gt;&amp;gt;&amp;gt; b = dict()  # 빑트인 함수를 사용하영 빈 Dictionary 만들기
&amp;gt;&amp;gt;&amp;gt; b
{}
&amp;gt;&amp;gt;&amp;gt; type(a)
dict&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzLxfW/btqDxK6H35O/ZFDKk0qg4CrwoA0GMF3EC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzLxfW/btqDxK6H35O/ZFDKk0qg4CrwoA0GMF3EC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzLxfW/btqDxK6H35O/ZFDKk0qg4CrwoA0GMF3EC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzLxfW%2FbtqDxK6H35O%2FZFDKk0qg4CrwoA0GMF3EC1%2Fimg.png&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;246&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;Dictionary 생성과 함께 아이템 추가하기&lt;/h3&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; fruits = {'a': 'apple'}  # Dictionary 생성과 함께 아이템 추가하기
&amp;gt;&amp;gt;&amp;gt; fruits
{'a': 'apple'}

&amp;gt;&amp;gt;&amp;gt; animals = dict(d='dogs', m='monkey')  # dict() 사용
&amp;gt;&amp;gt;&amp;gt; animals
{'d': 'dogs', 'm': 'monkey'}

# 다른 방법 들
&amp;gt;&amp;gt;&amp;gt; animals = dict([('d', 'dogs'), ('m', 'monkey')])

&amp;gt;&amp;gt;&amp;gt; keys = ['a', 'b', 'c', 'd']
&amp;gt;&amp;gt;&amp;gt; values = [1, 2, 3, 4]
&amp;gt;&amp;gt;&amp;gt; dict(zip(keys, values))
{'a': 1, 'b': 2, 'c': 3, 'd': 4}

&amp;gt;&amp;gt;&amp;gt; dict.fromkeys(['a', 'b'], 0)
{'a': 0, 'b': 0}
&amp;gt;&amp;gt;&amp;gt; dict.formkyes(['a', 'b'])  # 값을 정의하지 않으면 None
{'a': None, 'b': None}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GiGHr/btqDyNIrG6t/uxQ0mulFnSR90fpKe55vkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GiGHr/btqDyNIrG6t/uxQ0mulFnSR90fpKe55vkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GiGHr/btqDyNIrG6t/uxQ0mulFnSR90fpKe55vkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGiGHr%2FbtqDyNIrG6t%2FuxQ0mulFnSR90fpKe55vkK%2Fimg.png&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;360&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;Dictionary nesting&lt;/h3&gt;
&lt;p&gt;Dictionary 값에는 모든 오브젝트들(예: List, instance 등)이 들어갈 수 있음&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; me = {'name': {'first': 'John', 'last': 'Doe'}, 'jobs': ['dev', 'mgr'], 'age': 50}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;642&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eapnQP/btqDyM3QrIf/lNjkAXy33SJ4Tdg0qcGsXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eapnQP/btqDyM3QrIf/lNjkAXy33SJ4Tdg0qcGsXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eapnQP/btqDyM3QrIf/lNjkAXy33SJ4Tdg0qcGsXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeapnQP%2FbtqDyM3QrIf%2FlNjkAXy33SJ4Tdg0qcGsXK%2Fimg.png&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;642&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;Dictionary에 아이템 추가하기&lt;/h2&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; fruits = {}
&amp;gt;&amp;gt;&amp;gt; fruites['a'] = 'apple'&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Dictionary 값 가져오기&lt;/h2&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; D = {'a': 1, 'b': 2}
&amp;gt;&amp;gt;&amp;gt; D['a']
1&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;값이 없을 경우&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;KeyError&lt;/code&gt;를 발생&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; D = {'a': 1, 'b': 2, 'c': 3}
&amp;gt;&amp;gt;&amp;gt; D['d']
KeyError: 'f'&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Nested Dictionary에서 값 가져 오기&lt;/h3&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; me = {'name': {'first': 'John', 'last': 'Doe'}, 'jobs': ['dev', 'mgr'], 'age': 50}
&amp;gt;&amp;gt;&amp;gt; me['name']
{'first': 'John', 'last': 'Doe'}  # 값이 Dictionary이기 때문에 Dictionary 반환
&amp;gt;&amp;gt;&amp;gt; me['name']['first']           # first name 반환
'John'
&amp;gt;&amp;gt;&amp;gt; me['jobs']                    # 값이 List이기 때문에 list 반환
['dev', 'mgr']
&amp;gt;&amp;gt;&amp;gt; me['jobs'][0]                 # 첫 번째 직업 반환
'dev'&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Dictionary 값 변경&lt;/h2&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; D = {'a': 1, 'b': 1, 'c': 1}
&amp;gt;&amp;gt;&amp;gt; D['a'] = 2
&amp;gt;&amp;gt;&amp;gt; D
{'a': 2, 'b': 1, 'c': 1}&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Dictionary 아이템 제거&lt;/h2&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; D = {'a': 1, 'b': 1, 'c': 1}
&amp;gt;&amp;gt;&amp;gt; del D['a']
&amp;gt;&amp;gt;&amp;gt; D
{'b': 1, 'c': 1}&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Dictionary 값 연산&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# Integer 값 연산
&amp;gt;&amp;gt;&amp;gt; D = {'a': 1}
&amp;gt;&amp;gt;&amp;gt; D['a'] += 1
&amp;gt;&amp;gt;&amp;gt; D
{'a': 2}

# list 값 연산
&amp;gt;&amp;gt;&amp;gt; numeric = {'decimal': [1, 2, 3, 4, 5], 'float': [1.0, 2.0, 3.0, 4.0, 5.0]}
&amp;gt;&amp;gt;&amp;gt; numeric['decimal'].append(6)
&amp;gt;&amp;gt;&amp;gt; numeric
{'decimal': [1, 2, 3, 4, 5, 6], 'float': [1.0, 2.0, 3.0, 4.0, 5.0]}&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Dictionary 키 &lt;code&gt;set&lt;/code&gt; 연산&lt;/h2&gt;
&lt;p&gt;Dictionary 값은 &lt;code&gt;set&lt;/code&gt; 연산을 할 수 없음&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; D = {'a': 1, 'b': 2, 'c': 3}
&amp;gt;&amp;gt;&amp;gt; D.keys() | {'d': 4}         # 합집합
{'a', 'b', 'c', 'd'}
&amp;gt;&amp;gt;&amp;gt; D.keys() &amp;amp; {'b': 1}         # 교집합
{'b'}
&amp;gt;&amp;gt;&amp;gt; D.keys() | {'b', 'c', 'd'}
{'b', 'c', 'a', 'd'}

&amp;gt;&amp;gt;&amp;gt; D.items() | {('c', 3), ('d', 4)}
{('a', 1), ('b', 2), ('c', 3), ('d', 4)}
&amp;gt;&amp;gt;&amp;gt; dict(D.items() | {('c', 3), ('d', 4)})
{'d': 4, 'c': 3, 'b': 2, 'a': 1}&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Dictionary 메소드&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;.keys()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;키를 반환.&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; D = {'a': 1, 'b': 1, 'c': 1}
&amp;gt;&amp;gt;&amp;gt; D.keys()
dict_keys(['a', 'b', 'c'])  # 인스턴스를 반환
&amp;gt;&amp;gt;&amp;gt; list(D.keys())          # list()를 이용하여 list로 생성
['a', 'b', 'c']&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.values()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;값을 반환&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; D = {'a': 1, 'b': 1, 'c': 1}
&amp;gt;&amp;gt;&amp;gt; D.values()
dict_values([1, 1, 1])  # 인스턴스를 반환
&amp;gt;&amp;gt;&amp;gt; list(D.values())    # list()를 이용하여 list로 생성
[1, 1, 1]
&amp;gt;&amp;gt;&amp;gt; tuple(D.values())   # tuple()을 이용하여 tuple로 생성&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.items()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;키와 값을 반환&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; D = {'a': 1, 'b': 1, 'c': 1}
&amp;gt;&amp;gt;&amp;gt; D.items()
dict_items([('a', 1), ('b', 1), ('c', 1)])  # 인스턴스를 반환
&amp;gt;&amp;gt;&amp;gt; list(D.items())                         # list()을 이용하여 list로 생성
[('a', 1), ('b', 1), ('c', 1)]&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.get()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;키에 해당하는 값을 반환하고, 키가 없을 경우 &lt;code&gt;None&lt;/code&gt;을 반환하거나 정의한 값을 반환&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; D = {'a': 1, 'b': 1, 'c': 1}
&amp;gt;&amp;gt;&amp;gt; D.get('a')
1
&amp;gt;&amp;gt;&amp;gt; print(D.get('d'))
None
&amp;gt;&amp;gt;&amp;gt; D.get('d', 0)
0&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.update()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;A Dictionary에 B Dictionary를 update 할 때 사용.&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; D = {'a': 1, 'b': 1, 'c': 1}
&amp;gt;&amp;gt;&amp;gt; D2 = {'d': 1, 'e': 1}
&amp;gt;&amp;gt;&amp;gt; D.update(D2)
&amp;gt;&amp;gt;&amp;gt; D
{'a': 1, 'b': 1, 'c': 1, 'd': 1, 'e': 1} &lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;(주의) B Dictionary에 A Dictionary와 같은 키가 있을 경우 B Dictionary에 있는 값으로 변경 됨.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; D = {'a': 1, 'b': 1, 'c': 1}
&amp;gt;&amp;gt;&amp;gt; D2 = {'a': 2, 'b': 2}
&amp;gt;&amp;gt;&amp;gt; D.update(D2)
&amp;gt;&amp;gt;&amp;gt; D
{'a': 2, 'b': 2, 'c': 1}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.pop()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;키에 해당하는 값을 반환하고 아이템을 제거. list의 &lt;code&gt;pop()&lt;/code&gt; 메서드와 같음&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; D = {'a': 1, 'b': 1, 'c': 1}
&amp;gt;&amp;gt;&amp;gt; D.pop('a')
1
&amp;gt;&amp;gt;&amp;gt; D
{'b': 1, 'c': 1}&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Key 정렬하기(Sort)&lt;/h2&gt;
&lt;p&gt;어떤 경우 Dictionary의 키를 정렬할 필요가 있음(예를들어 사전 같은 경우 &lt;code&gt;a~z&lt;/code&gt; 순으로 정렬).&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; D = {'a': 1, 'c': 1, 'b': 1}
&amp;gt;&amp;gt;&amp;gt; keys = list(D.keys())
['a', 'c', 'b']
&amp;gt;&amp;gt;&amp;gt; keys.sort()            # list의 sort() 메서드 이용
['a', 'b', 'c']

&amp;gt;&amp;gt;&amp;gt; sorted(D):  # sorted() 빌트인 함수 이용
['a', 'b', 'c']&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;code&gt;OrderedDict&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;list와 같이 아이템(키)을 넣은 순서대로 사용하고 싶을 때 사용.&lt;br /&gt;사용법은 기본 dictionary와 같음&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(주의) &lt;code&gt;a~z&lt;/code&gt;와 같이 오름차순이나 내림차순으로 정렬하는 것이 아니라 Dictionary에 아이템을 넣은 순서를 기억하는 것임. 왜냐하면 dict()은 아이템을 넣은 순서를 기억하지 못하기 때문에 아이템이 들어간 순서를 기억하였다가 사용하고 싶을 때 사용.&lt;br /&gt;오버헤드(성능저하) 있음.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; from collections import OrderedDict  # 빌트인이 아니기 때문에 import
&amp;gt;&amp;gt;&amp;gt; D = OrderedDict()  # OrderedDict 인스턴스 생성
&amp;gt;&amp;gt;&amp;gt; D 
OrderedDict()

또는
&amp;gt;&amp;gt;&amp;gt; D = OrderedDict(a=1)
&amp;gt;&amp;gt;&amp;gt; D
OrderedDict([('a', 1)])

# 아이템 추가
&amp;gt;&amp;gt;&amp;gt; D['b'] = 1
&amp;gt;&amp;gt;&amp;gt; D['a'] = 1
&amp;gt;&amp;gt;&amp;gt; D['c'] = 1
&amp;gt;&amp;gt;&amp;gt; D
OrderedDict([('b', 1), ('a', 1), ('c', 1)])

# 값 구하기
&amp;gt;&amp;gt;&amp;gt; D['b']
1

# 값 변경
&amp;gt;&amp;gt;&amp;gt; D['b'] = 2
&amp;gt;&amp;gt;&amp;gt; D
OrderedDict([('b', 2), ('a', 1), ('c', 1)])

# 아이템 제거
&amp;gt;&amp;gt;&amp;gt; del D['b']
&amp;gt;&amp;gt;&amp;gt; D
OrderedDict([('a', 1), ('c', 1)])&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/svEVy/btqDw5DqWtS/DTmexDGPCufH6kkYuwTYKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/svEVy/btqDw5DqWtS/DTmexDGPCufH6kkYuwTYKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/svEVy/btqDw5DqWtS/DTmexDGPCufH6kkYuwTYKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsvEVy%2FbtqDw5DqWtS%2FDTmexDGPCufH6kkYuwTYKK%2Fimg.png&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;236&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;아이템을 정렬하여 넣고 싶을 때는 &lt;code&gt;sorted()&lt;/code&gt;를 사용하면 됨.&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; from collections import OrderedDict
&amp;gt;&amp;gt;&amp;gt; D = {'A': 2, 'C': 3, 'B': 1, 'E': 1, 'F': 2}
&amp;gt;&amp;gt;&amp;gt; OrderedDict(sorted(D.items())
OrderedDict([('A', 2), ('B', 1), ('C', 3), ('E', 1), ('F', 2)])  # key가 알파벳 순으로 정렬됨&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Dictionary comprehensions&lt;/h2&gt;
&lt;p&gt;사용법은 &lt;code&gt;list&lt;/code&gt;나 &lt;code&gt;set&lt;/code&gt; comprehension과 같고 &lt;code&gt;{}&lt;/code&gt;를 사용&lt;/p&gt;
&lt;pre class=&quot;gml&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; D = {k: v for (k, v) in zip(['a', 'b', 'c'], [1, 2, 3])}

&amp;gt;&amp;gt;&amp;gt; D = {x: x ** 2 for x in range(5)}

&amp;gt;&amp;gt;&amp;gt; D = {x: x * 4 for x in 'PIZZA'}

&amp;gt;&amp;gt;&amp;gt; D = {x.lower(): x + '!' for x in ['PIZZA', 'HAMBURGER', 'TOAST]}&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;값에 해당하는 키 찾는 방법&lt;/h2&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; D = {1: 'a', 2: 'b', 3: 'c'}
&amp;gt;&amp;gt;&amp;gt; [key for (key, value) in D.items() if value == 'a']&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;code&gt;KeyError&lt;/code&gt; 대비하기&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;if&lt;/code&gt;문 사용&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;if 'd' in D&lt;/code&gt; 구문을 사용하여 해당 키(d) 유무 확인.&lt;br /&gt;키가 있으면 True, 없으면 False를 반환&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;if 'd' in D:
    print(D['d'])
else:
    print(0)&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;try&lt;/code&gt;문 사용&lt;/h3&gt;
&lt;p&gt;예외처리 하면 된다.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;try:
    print(D['d'])
except KeyError:
    print(0)&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.get()&lt;/code&gt; 메소드 사용&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;KeyError&lt;/code&gt;를 발생시키지 않음&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; value = D.get('d')  # 키가 없으면 None을 리턴
&amp;gt;&amp;gt;&amp;gt; value
None

&amp;gt;&amp;gt;&amp;gt; D.get('d', 0)  # 키가 없으면 대체 값을 리턴
0&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;code&gt;for&lt;/code&gt;문과 사용&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;for&lt;/code&gt;문을 사용하면 키나 값을 가져올 때 &lt;code&gt;list&lt;/code&gt;로 변환 할 필요 없음.&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; D = {'a': 1, 'b': 2, 'c': 3}
&amp;gt;&amp;gt;&amp;gt; for key in D:  # 키가 사용됨. D.keys()와 같음.
        print(key)

&amp;gt;&amp;gt;&amp;gt; for value in D.values():
        print(value)

&amp;gt;&amp;gt;&amp;gt; for item in D.items():  # item은 Tuple 형태
        print(item)

&amp;gt;&amp;gt;&amp;gt; for key, value in D.items():
        print(key, value)

&amp;gt;&amp;gt;&amp;gt; for key in D:
        print(key, D[key])&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Basic</category>
      <category>Python</category>
      <author>nickas</author>
      <guid isPermaLink="true">https://python-world.tistory.com/45</guid>
      <comments>https://python-world.tistory.com/entry/python-dictionary#entry45comment</comments>
      <pubDate>Sun, 19 Apr 2020 00:42:55 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 List</title>
      <link>https://python-world.tistory.com/entry/python-list</link>
      <description>&lt;p&gt;파이썬 자료구조 형태의 하나로 시퀀스 데이터를 가지고 있음.&lt;br /&gt;시퀀스는 데이터의 순서를 정하는 것을 의미 하므로 순서를 가지고 있고 &lt;code&gt;index&lt;/code&gt;를 사용하여 값을 가져 올 수 있음.&lt;/p&gt;
&lt;p&gt;보통 &lt;code&gt;list&lt;/code&gt;는 원하는 데이터를 하나의 변수로 정의하여 사용하기 위해 사용.&lt;/p&gt;
&lt;p&gt;예를 들어&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; animal = ['dog', 'cat', 'monkey']
&amp;gt;&amp;gt;&amp;gt; numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;와 같이 의미가 같은 값들을 하나의 변수로 묶어 사용할 수 있다.&lt;/p&gt;
&lt;h2&gt;List 만들기&lt;/h2&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = []      # 빈 list 생성 
&amp;gt;&amp;gt;&amp;gt; b = list()  # built-in 함수를 사용
&amp;gt;&amp;gt;&amp;gt; c = [1, 2, 3, 4]
&amp;gt;&amp;gt;&amp;gt; c
[1, 2, 3, 4]
&amp;gt;&amp;gt;&amp;gt; d = ['a', 'b', 'c', 'd']
&amp;gt;&amp;gt;&amp;gt; d
['a', 'b', 'c', 'd']
&amp;gt;&amp;gt;&amp;gt; type(d)
list

&amp;gt;&amp;gt;&amp;gt; e = [1, 'a', 2, 'b']  # 다른 타입을 혼합할 수 있음.
&amp;gt;&amp;gt;&amp;gt; e
[1, 'a', 2, 'b']&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8rbZ0/btqDkyGJZv4/mxzKR8h7ZfBYQJXdkh73j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8rbZ0/btqDkyGJZv4/mxzKR8h7ZfBYQJXdkh73j1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8rbZ0/btqDkyGJZv4/mxzKR8h7ZfBYQJXdkh73j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8rbZ0%2FbtqDkyGJZv4%2FmxzKR8h7ZfBYQJXdkh73j1%2Fimg.png&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;686&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;List 안의 값 사용하기&lt;/h2&gt;
&lt;h3&gt;indexing&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;indexing&lt;/code&gt; 값을 이용하여 값을 추출 할 수 있음.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 3, 4]
&amp;gt;&amp;gt;&amp;gt; a[0]
1
&amp;gt;&amp;gt;&amp;gt; a[-1]  # 마직막 값을 반환
4&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;slicing&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;[start:end:step]&lt;/code&gt; 형식을 사용&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 3, 4]
&amp;gt;&amp;gt;&amp;gt; a[1:-1]
[2,3]
&amp;gt;&amp;gt;&amp;gt; a[2:]
[3, 4]
&amp;gt;&amp;gt;&amp;gt; a[:-1]
[1, 2, 3]
&amp;gt;&amp;gt;&amp;gt; a[::2]
[1, 3]&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;List 연산&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 3]
&amp;gt;&amp;gt;&amp;gt; b = [4, 5, 6]
&amp;gt;&amp;gt;&amp;gt; a + b
[1, 2, 3, 4, 5, 6]

&amp;gt;&amp;gt;&amp;gt; a * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;중첩 리스트 만들기&lt;/h2&gt;
&lt;p&gt;리스트 내에 리스트를 만들 수 있음.&lt;br /&gt;중첩 갯수는 거의 제한이 없음.(많은 수의 중첩은 거의 사용하지 않음, 계산하기 어려우니까)&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [[]]
&amp;gt;&amp;gt;&amp;gt; b = [1, [2, 3]]
&amp;gt;&amp;gt;&amp;gt; c = [{}]
&amp;gt;&amp;gt;&amp;gt; d = [1, {1: 'a', 2: 'b'}]  # List 안에 Dictionary를 삽입할 수 있음.
&amp;gt;&amp;gt;&amp;gt; e = [1, [2, [3, 4]]]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;984&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEdp8b/btqDmWfoJgB/AeXHbRn8WwIcMRyPaJVOU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEdp8b/btqDmWfoJgB/AeXHbRn8WwIcMRyPaJVOU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEdp8b/btqDmWfoJgB/AeXHbRn8WwIcMRyPaJVOU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEdp8b%2FbtqDmWfoJgB%2FAeXHbRn8WwIcMRyPaJVOU1%2Fimg.png&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;984&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;중첩 리스트 안의 값 사용하기&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, [2, 3]]
&amp;gt;&amp;gt;&amp;gt; a  
[1, [2, 3]]  # 첫 번째 리스트의 index 0, 1에 값이 들어 있는 형태
&amp;gt;&amp;gt;&amp;gt; a[1]
[2, 3]       # 첫 번째 리스트의 index 1에 있는 값 추출
&amp;gt;&amp;gt;&amp;gt; a[1][0]  # 첫 번째 리스트의 index 1에 있는 값 추출 후 두 번째 리스트의 index 0에 있는 값 추출.
2

&amp;gt;&amp;gt;&amp;gt; a = [1, [2, [3]]]
&amp;gt;&amp;gt;&amp;gt; a[1][1][0]
3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EcayJ/btqDk7oBYbn/wfJLYEZyMMaNfMzo2kqPW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EcayJ/btqDk7oBYbn/wfJLYEZyMMaNfMzo2kqPW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EcayJ/btqDk7oBYbn/wfJLYEZyMMaNfMzo2kqPW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEcayJ%2FbtqDk7oBYbn%2FwfJLYEZyMMaNfMzo2kqPW1%2Fimg.png&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;202&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mG6QM/btqDogYxtOK/ULSVk0bi2gUYsKAYnMRkp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mG6QM/btqDogYxtOK/ULSVk0bi2gUYsKAYnMRkp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mG6QM/btqDogYxtOK/ULSVk0bi2gUYsKAYnMRkp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmG6QM%2FbtqDogYxtOK%2FULSVk0bi2gUYsKAYnMRkp0%2Fimg.png&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;300&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;List에 값 추가하기&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;.append()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;List의 맨 뒤부터 값을 추가&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = []
&amp;gt;&amp;gt;&amp;gt; a.append(1)
&amp;gt;&amp;gt;&amp;gt; a
[1]&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.insert()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;원하는 위치에 값 삽입&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 4]
&amp;gt;&amp;gt;&amp;gt; a.insert(2, 3)  # .insert(index, value)
&amp;gt;&amp;gt;&amp;gt; a
[1, 2, 3, 4]&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;slicing 사용하여 추가&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 5, 6]
&amp;gt;&amp;gt;&amp;gt; a[2:2] = [3, 4]
&amp;gt;&amp;gt;&amp;gt; a
[1, 2, 3, 4, 5, 6]&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.extend()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;list&lt;/code&gt;를 &lt;code&gt;list&lt;/code&gt;에 추가 할 때 중첩된 &lt;code&gt;list&lt;/code&gt; 형태로 추가하지 않기 위해 사용&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 3]
&amp;gt;&amp;gt;&amp;gt; b = [4, 5, 6]
&amp;gt;&amp;gt;&amp;gt; a.append(b)
&amp;gt;&amp;gt;&amp;gt; a
[1, 2, 3, [4, 5, 6]]  # 중첩되어 추가됨

&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 3]
&amp;gt;&amp;gt;&amp;gt; a.extend(b)
&amp;gt;&amp;gt;&amp;gt; a
[1, 2, 3, 4, 5, 6]  # 중첩되지 않음

&amp;gt;&amp;gt;&amp;gt; a + b           # 같은 결과
[1, 2, 3, 4, 5, 6, 4, 5, 6]&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;List 값 교체하기&lt;/h2&gt;
&lt;h3&gt;indexing 사용하여 교체&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 3]
&amp;gt;&amp;gt;&amp;gt; a[0] = 4
&amp;gt;&amp;gt;&amp;gt; a
[4, 2, 3]&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;slicing 사용하여 교체&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 3, 4]
&amp;gt;&amp;gt;&amp;gt; a[1:3] = [5, 6, 7]
&amp;gt;&amp;gt;&amp;gt; a
[1, 5, 6, 7, 4]&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;List의 값 지우기&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;.pop()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;.pop()&lt;/code&gt; 메서드를 사용하면 값이 추출되고 리스트에서 삭제가 됨.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 3, 4]
&amp;gt;&amp;gt;&amp;gt; a.pop()   # 마지막 값이 추출 됨
4
&amp;gt;&amp;gt;&amp;gt; a
[1, 2, 3]
&amp;gt;&amp;gt;&amp;gt; a.pop(0)  # index 사용
1&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;List의 특정 값 지우기&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;.remove()&lt;/code&gt; 메서드 사용&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 3, 4]
&amp;gt;&amp;gt;&amp;gt; a.remove(1)
&amp;gt;&amp;gt;&amp;gt; a
[2, 3, 4]

&amp;gt;&amp;gt;&amp;gt; b = [1, 2, 3, 4, 1]
&amp;gt;&amp;gt;&amp;gt; b.remove(1)  # 값이 하나 이상일 경우, 첫 번째 값이 삭제됨 
&amp;gt;&amp;gt;&amp;gt; b
[2, 3, 4, 1]&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;del&lt;/code&gt; 사용하여 지우기&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 3, 4]
&amp;gt;&amp;gt;&amp;gt; del a[0]
&amp;gt;&amp;gt;&amp;gt; a
[2, 3, 4]

&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 3, 4]
&amp;gt;&amp;gt;&amp;gt; del a[1:3]
&amp;gt;&amp;gt;&amp;gt; a
[1, 4]&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;slicing 사용하여 지우기&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 3, 4]
&amp;gt;&amp;gt;&amp;gt; a[1:3] = []
&amp;gt;&amp;gt;&amp;gt; a
[1, 4]&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;List의 모든 값 지우기&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;.clear()&lt;/code&gt; 메서드 사용&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 3, 4]
&amp;gt;&amp;gt;&amp;gt; a.clear()
&amp;gt;&amp;gt;&amp;gt; a
[]&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;List membership 확인&lt;/h3&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 3, 4]
&amp;gt;&amp;gt;&amp;gt; 1 in a
True
&amp;gt;&amp;gt;&amp;gt; 5 in a
False&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;List Iteration&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 3, 4]
&amp;gt;&amp;gt;&amp;gt; for i in a:
        print(i, end=' ')
1 2 3 4&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;다른 List 메서드&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;.count()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;list&lt;/code&gt; 값의 갯수를 반환&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, 1, 2, 3]
&amp;gt;&amp;gt;&amp;gt; a.count(1)
2&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.index()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;list&lt;/code&gt; 값의 인덱스를 확인하기 위해 사용&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 3]
&amp;gt;&amp;gt;&amp;gt; a.index(1)
0&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.reverse()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;list&lt;/code&gt; 값을 거꾸로 나열&lt;/p&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 3]
&amp;gt;&amp;gt;&amp;gt; a.reverse()
&amp;gt;&amp;gt;&amp;gt; a
[3, 2, 1]              # list 값의 위치가 변함

&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 3]
&amp;gt;&amp;gt;&amp;gt; list(reversed(L))  # reversed() built-in 함수를 이용
[3, 2, 1]
&amp;gt;&amp;gt;&amp;gt; a
[1, 2, 3]              # list 값의 위치가 변하지 않음&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.sort()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;list&lt;/code&gt; 값을 정렬&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = ['b', 'd', 'c']
&amp;gt;&amp;gt;&amp;gt; a.sort()
&amp;gt;&amp;gt;&amp;gt; a
['b', 'c', 'd']

&amp;gt;&amp;gt;&amp;gt; a = [4, 7, 9, 1]
&amp;gt;&amp;gt;&amp;gt; a.sort()
&amp;gt;&amp;gt;&amp;gt; a
[1, 4, 7, 9]

&amp;gt;&amp;gt;&amp;gt; a = ['a', 'A', 'b' 'B']  # 대문자 먼저
&amp;gt;&amp;gt;&amp;gt; a.sort()
&amp;gt;&amp;gt;&amp;gt; a 
['A', 'B', 'a', 'b']&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;.sort()&lt;/code&gt;에 정렬 기준 주기&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = ['a', 'b', 'A', 'B']
&amp;gt;&amp;gt;&amp;gt; a.sort(key=str.lower)  # 문자를 소문자로 변환 후 정렬
&amp;gt;&amp;gt;&amp;gt;a
['a', 'A', 'b', 'B']

&amp;gt;&amp;gt;&amp;gt; a = ['a', 'b', 'A', 'B']
&amp;gt;&amp;gt;&amp;gt; a.sort(key=str.lower, reverse=True)  # 거꾸로 정렬
['b', 'B', 'a', 'A']&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;sorted()&lt;/code&gt; built-in 함수를 사용할 수 있음.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = ['a', 'b', 'A', 'B']
&amp;gt;&amp;gt;&amp;gt; sorted(a, key=str.lower, reverse=True)
['b', 'B', 'a', 'A']

&amp;gt;&amp;gt;&amp;gt; sorted([x.lower() for x in a], reverse=True)  # List Comprehension를 이용하여 새로운 list를 만들어 사용
['b', 'b', 'a', 'a']&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;더 알아보기&lt;/h2&gt;
&lt;h3&gt;List를 만드는 다른 방법&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;range()&lt;/code&gt; built-in 함수를 사용하여 연속된 숫자로 List 생성&lt;/p&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = list(range(5)  
&amp;gt;&amp;gt;&amp;gt; a
[0, 1, 2, 3, 4]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;map()&lt;/code&gt; built-in 함수를 사용하여 기존 &lt;code&gt;list&lt;/code&gt;와 다른 새로운 &lt;code&gt;list&lt;/code&gt;를 생성&lt;/p&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; list(map(abs, [-1, -2, 0, 1, 2]))
[1, 2, 0, 1, 2]&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Stack 만들기&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;LIFO(Last-in-first-out)&lt;/code&gt; stack 구조를 만들 수 있음.&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; L = []
&amp;gt;&amp;gt;&amp;gt; L.append(1)  # stack에 값 넣기
&amp;gt;&amp;gt;&amp;gt; L.append(2)
&amp;gt;&amp;gt;&amp;gt; L
[1, 2]
&amp;gt;&amp;gt;&amp;gt; L.pop().     # 마지막으로 입력된 값 꺼내기
2
&amp;gt;&amp;gt;&amp;gt; L
[1]&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;List Copy&lt;/h2&gt;
&lt;p&gt;용어 그대로 &lt;code&gt;list&lt;/code&gt;를 복사하는 방법&lt;/p&gt;
&lt;h3&gt;잘못된 사용(주의)&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 3]
&amp;gt;&amp;gt;&amp;gt; b = a
&amp;gt;&amp;gt;&amp;gt; b
[1, 2, 3]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTUYQy/btqDoTvgzvW/l3TZdFFVysPpwEFW5ZeOWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTUYQy/btqDoTvgzvW/l3TZdFFVysPpwEFW5ZeOWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTUYQy/btqDoTvgzvW/l3TZdFFVysPpwEFW5ZeOWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTUYQy%2FbtqDoTvgzvW%2Fl3TZdFFVysPpwEFW5ZeOWk%2Fimg.png&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;256&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위와 같이 변수 a를 변수 b에 대입하면 같은 값을 가져오는 것 처럼 보여 복사된거 처럼 보이지만 사실은 위의 그림에서 보는 것과 같이 같은 객체 정보를 참조하는 것으로 &lt;code&gt;list&lt;/code&gt;의 값이 변경될 경우 변수 b의 값도 같이 변경되서 보임.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; id(a)
4501679424
&amp;gt;&amp;gt;&amp;gt; id(b)
4501679424  # 같은 메모리 주소를 가짐
&amp;gt;&amp;gt;&amp;gt; a.append(4)
&amp;gt;&amp;gt;&amp;gt; a
[1, 2, 3, 4]
&amp;gt;&amp;gt;&amp;gt; b
[1, 2, 3, 4]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위의 예시 처럼 변수 a와 b는 같은 객체를 참조하기 때문에 의도적으로 같은 값을 가지는 것이 아닌 각각 별개의 값을 가지길 원할 때 위와 같은 방법을 사용 시 프로그램에 심각한 오류를 초래할 수 있음.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;파이썬에서 대입(&lt;code&gt;=&lt;/code&gt;)이란 변수에 값을 저장하는 것이 아닌 오브젝트의 메모리 주소를 저장하는 것을 의미&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;바른 사용&lt;/h3&gt;
&lt;h4&gt;얕은 복사(Shallow copy)&lt;/h4&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 3, 4]
&amp;gt;&amp;gt;&amp;gt; b = a[:]      # 얕은 복사
&amp;gt;&amp;gt;&amp;gt; c = list(a)   # 다른 방법
&amp;gt;&amp;gt;&amp;gt; d = a.copy()  # 또 다른 방법
&amp;gt;&amp;gt;&amp;gt; id(a)
4497110784
&amp;gt;&amp;gt;&amp;gt; id(b)
4501298944  # 메모리 주소가 다름
&amp;gt;&amp;gt;&amp;gt; id(c)
4498557632
&amp;gt;&amp;gt;&amp;gt; id(d)
4501296640
&amp;gt;&amp;gt;&amp;gt; a.append(5)
&amp;gt;&amp;gt;&amp;gt; a
[1, 2, 3, 4, 5]
&amp;gt;&amp;gt;&amp;gt; b
[1, 2, 3, 4]  # 값 변하지 않음
&amp;gt;&amp;gt;&amp;gt; c
[1, 2, 3, 4]
&amp;gt;&amp;gt;&amp;gt; d
[1, 2, 3, 4]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;1120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blM6EY/btqDlkgYcbS/NLY6koWqPk7jZjpnA7UAK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blM6EY/btqDlkgYcbS/NLY6koWqPk7jZjpnA7UAK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blM6EY/btqDlkgYcbS/NLY6koWqPk7jZjpnA7UAK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblM6EY%2FbtqDlkgYcbS%2FNLY6koWqPk7jZjpnA7UAK0%2Fimg.png&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;1120&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;주의사항&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;위의 방법으로 복사가 되었지만 주의사항이 있음. 리스트 값 중에 mutable(가변) 값이 있고 그 값이 변경되면 복사된 모든 리스트에 적용됨. 예를들어 위의 예시를 보면 복사를 통해서 리스트가 새로 만들어 졌지만 위 그림을 보면 각 리스트의 같은 index 값들은 같은 &lt;code&gt;int&lt;/code&gt; 클래스의 인스턴스 오브젝트 주소 정보를 참조하고 있음. 그러나 &lt;code&gt;integer&lt;/code&gt;나 &lt;code&gt;string&lt;/code&gt;은 immutable(불변)의 값 이기 때문에 아래와 같이 변수 a 리스트에서 값을 변경해도 다른 리스트에는 영향이 없음&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a[0] = 5  # 새로운 int 인스턴스가 만들어지고 index 0이 새로운 인스턴스 주소 값을 가짐.
&amp;gt;&amp;gt;&amp;gt; a
[5, 2, 3, 4]  
&amp;gt;&amp;gt;&amp;gt; b 
[1, 2, 3, 4]  # 변경되지 않음
&amp;gt;&amp;gt;&amp;gt; c
[1, 2, 3, 4]
&amp;gt;&amp;gt;&amp;gt; d 
[1, 2, 3, 4]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;7.png&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;1222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5pmsY/btqDlNiXqZQ/wzUqI7v0k7L3Xu5tLPbVw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5pmsY/btqDlNiXqZQ/wzUqI7v0k7L3Xu5tLPbVw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5pmsY/btqDlNiXqZQ/wzUqI7v0k7L3Xu5tLPbVw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5pmsY%2FbtqDlNiXqZQ%2FwzUqI7v0k7L3Xu5tLPbVw1%2Fimg.png&quot; data-filename=&quot;7.png&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;1222&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;그러나 아래와 같이 리스트안에 리스트(중첩 리스트)가 존재할 경우 리스트는 mutable이기 때문에 값이 변경되면 복사된 모든 리스트에 적용이 됨.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, [2, 3]]
&amp;gt;&amp;gt;&amp;gt; b = a[:]
&amp;gt;&amp;gt;&amp;gt; c = list(a]
&amp;gt;&amp;gt;&amp;gt; d = a.copy()
&amp;gt;&amp;gt;&amp;gt; a
[1, [2, 3]]
&amp;gt;&amp;gt;&amp;gt; b
[1, [2, 3]]
&amp;gt;&amp;gt;&amp;gt; c
[1, [2, 3]]
&amp;gt;&amp;gt;&amp;gt; d
[1, [2, 3]]

&amp;gt;&amp;gt;&amp;gt; a[1].append(4)  # 중첩된 리스트 값 변경
&amp;gt;&amp;gt;&amp;gt; a
[1, [2, 3, 4]]
&amp;gt;&amp;gt;&amp;gt; b 
[1, [2, 3, 4]]  # 다른 리스트에 영향 받음
&amp;gt;&amp;gt;&amp;gt; c
[1, [2, 3, 4]]
&amp;gt;&amp;gt;&amp;gt; d
[1, [2, 3, 4]]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;8.png&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;1132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQpjPQ/btqDk64lTFM/WDa319NKviFBf7KaUbKXjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQpjPQ/btqDk64lTFM/WDa319NKviFBf7KaUbKXjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQpjPQ/btqDk64lTFM/WDa319NKviFBf7KaUbKXjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQpjPQ%2FbtqDk64lTFM%2FWDa319NKviFBf7KaUbKXjk%2Fimg.png&quot; data-filename=&quot;8.png&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;1132&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;즉 얕은 복사라는 단어 답게 표면적인 부분만 복사가 이루어 지고 내부는 복사가 안됨. 이러한 문제를 해결하기 위해 깊은 복사를 사용.&lt;/p&gt;
&lt;h4&gt;깊은 복사(Deep copy)&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;copy 모듈의 deepcopy&lt;/code&gt;를 사용.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import copy
&amp;gt;&amp;gt;&amp;gt; a = [1, [2, 3]]
&amp;gt;&amp;gt;&amp;gt; b = copy.deepcopy(a)
&amp;gt;&amp;gt;&amp;gt; id(a)
4493449024
&amp;gt;&amp;gt;&amp;gt; id(b)
4497513408
&amp;gt;&amp;gt;&amp;gt; a
[1, [2, 3]]
&amp;gt;&amp;gt;&amp;gt; b
[1, [2, 3]]
&amp;gt;&amp;gt;&amp;gt; a[1].append(4)
&amp;gt;&amp;gt;&amp;gt; a
[1, [2, 3, 4]
&amp;gt;&amp;gt;&amp;gt;b
[1, [2, 3]]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;9.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;770&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tJdhR/btqDlOB9FcZ/osK02koKMcHDs9KczXoq60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tJdhR/btqDlOB9FcZ/osK02koKMcHDs9KczXoq60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tJdhR/btqDlOB9FcZ/osK02koKMcHDs9KczXoq60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtJdhR%2FbtqDlOB9FcZ%2FosK02koKMcHDs9KczXoq60%2Fimg.png&quot; data-filename=&quot;9.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;770&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위 그림 처럼 깊은 복사를 사용하면 중첩된 리스트도 새로운 리스트가 만들어 지면서 복사가 되고 복사된 리스트 끼리 영향을 주지 않은다.&lt;/p&gt;
&lt;h2&gt;List comprehensions&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;List comprehension&lt;/code&gt;을 이용하면 코드 한줄로 &lt;code&gt;list&lt;/code&gt;를 생성할 수 있고, 생성 속도도 더 빠르기 때문에 큰 데이터를 사용하여 &lt;code&gt;list&lt;/code&gt;를 생성 시 사용하면 이점을 얻을 수 있음.&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; res = [c for c in 'spam']
&amp;gt;&amp;gt;&amp;gt; res
['s', 'p', 'a', 'm']

# list를 만드는 같은 방법
&amp;gt;&amp;gt;&amp;gt; res = []
&amp;gt;&amp;gt;&amp;gt; for c in 'spam':
        res.append(c)
&amp;gt;&amp;gt;&amp;gt; res
['s', 'p', 'a', 'm']&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Basic</category>
      <category>Python</category>
      <author>nickas</author>
      <guid isPermaLink="true">https://python-world.tistory.com/44</guid>
      <comments>https://python-world.tistory.com/entry/python-list#entry44comment</comments>
      <pubDate>Sun, 12 Apr 2020 15:23:37 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 String</title>
      <link>https://python-world.tistory.com/entry/python-string</link>
      <description>&lt;h2&gt;String 변수 만들기&lt;/h2&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = ''  # 빈 string 만들기
&amp;gt;&amp;gt;&amp;gt; a
''
&amp;gt;&amp;gt;&amp;gt; type(a)
str
&amp;gt;&amp;gt;&amp;gt; b = str()
&amp;gt;&amp;gt;&amp;gt; b
''
&amp;gt;&amp;gt;&amp;gt; type(b)
str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/THtrL/btqDlOIIyFW/1IGzrG2hgKh6viYbWzzw5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/THtrL/btqDlOIIyFW/1IGzrG2hgKh6viYbWzzw5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/THtrL/btqDlOIIyFW/1IGzrG2hgKh6viYbWzzw5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTHtrL%2FbtqDlOIIyFW%2F1IGzrG2hgKh6viYbWzzw5K%2Fimg.png&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;248&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 'String'
&amp;gt;&amp;gt;&amp;gt; a
'String'
&amp;gt;&amp;gt;&amp;gt; type(a)
str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Anwfk/btqDkyGsG83/xXXCKNKzKV52PFkR1vYCgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Anwfk/btqDkyGsG83/xXXCKNKzKV52PFkR1vYCgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Anwfk/btqDkyGsG83/xXXCKNKzKV52PFkR1vYCgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAnwfk%2FbtqDkyGsG83%2FxXXCKNKzKV52PFkR1vYCgk%2Fimg.png&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;204&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;숫자로 만들어진 &lt;code&gt;String&lt;/code&gt;은 &lt;code&gt;Integer&lt;/code&gt;가 아님&lt;/h3&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = '1'
&amp;gt;&amp;gt;&amp;gt; a
'1'
&amp;gt;&amp;gt;&amp;gt; type(a)
str

&amp;gt;&amp;gt;&amp;gt; b = 1
&amp;gt;&amp;gt;&amp;gt; b
1  # (주의) ''(작은 따옴표)가 없으면 integer 임
&amp;gt;&amp;gt;&amp;gt; type(b)
int&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVTj7i/btqDnwHfvCW/ZuzwM9zsP7pi3PaUKLfIu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVTj7i/btqDnwHfvCW/ZuzwM9zsP7pi3PaUKLfIu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVTj7i/btqDnwHfvCW/ZuzwM9zsP7pi3PaUKLfIu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVTj7i%2FbtqDnwHfvCW%2FZuzwM9zsP7pi3PaUKLfIu0%2Fimg.png&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;256&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;Apostrophe 사용하기&lt;/h3&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = &quot;String's&quot;  # Apostrophe를 사용하기 위해서는 큰 따옴표를 사용.
&amp;gt;&amp;gt;&amp;gt; a
&quot;String's&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;String 변수를 만들 때 큰 따옴표(&amp;ldquo;&amp;rdquo;)와 작은 따옴표(&amp;lsquo;&amp;rsquo;) 둘 중 아무거나 사용해도 상관 없으나 &lt;a href=&quot;https://www.python.org/dev/peps/pep-0008/&quot;&gt;PEP8&lt;/a&gt; 권고 사항에서는 큰 따옴표를 사용하라고 함.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;그러나 아래와 같이 문자열 안에 큰 따옴표를 사용해야 할 경우는 작은 따옴표를 사용&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 'I told &quot;I like you&quot;'
&amp;gt;&amp;gt;&amp;gt; a
'I told &quot;I like you&quot;'

&amp;gt;&amp;gt;&amp;gt; a = &quot;I told \&quot;I like you\&quot;&quot;  # \(backslash)를 사용하면 escape 됨
&amp;gt;&amp;gt;&amp;gt; 'I told &quot;I like you&quot;'&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Escape 문자 사용하기&lt;/h3&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 'String\ntab\t'  # Escape 문자 사용하기
&amp;gt;&amp;gt;&amp;gt; a
'String\ntab\ttab'
&amp;gt;&amp;gt;&amp;gt; print(a)  # 내장 IDE에서는 escape 문자를 처리하지 못하기 때문에 print() 사용
String
tab    tab&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;multiline 사용하기&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = &quot;&quot;&quot;multiline
multiline 
multiline&quot;&quot;&quot;
&amp;gt;&amp;gt;&amp;gt; a
'multiline\nmultiline\nmultiline'
&amp;gt;&amp;gt;&amp;gt; print(a)
multiline
multiline
multiline

&amp;gt;&amp;gt;&amp;gt; b = '''multiline
multiline
multiline'''
&amp;gt;&amp;gt;&amp;gt; print(b)
multiline
multiline
multiline&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;mulitline을 사용하는 예시 중 하나는 HTML 태그를 변수에 저장하기 위함.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = &quot;&quot;&quot;&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;
HTML code
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&quot;&quot;&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Raw string 사용하기&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = r'String\ntab\t'
&amp;gt;&amp;gt;&amp;gt; a
'String\ntab\t'&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;String 연산하기&lt;/h2&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 'Ham'
&amp;gt;&amp;gt;&amp;gt; b = 'burger'
&amp;gt;&amp;gt;&amp;gt; a + b  # Concatenate
'Hamburger'

&amp;gt;&amp;gt;&amp;gt; c = 1
&amp;gt;&amp;gt;&amp;gt; a + b + c
TypeError: can only concatenate str (not &quot;int&quot;) to str

&amp;gt;&amp;gt;&amp;gt; a * 3  # Repeat
'HamHamHam'

&amp;gt;&amp;gt;&amp;gt; a = &quot;I&quot; ' like' &quot; hamburger&quot;  # 이렇게 사용할 수 있으나 잘 사용하지 않음(가독성이 떨어지니까 ㅋ)
&amp;gt;&amp;gt;&amp;gt; a
&amp;gt;&amp;gt;&amp;gt; 'I like hamburger&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;String 변수는 다른 타입(예: Integer)의 변수와 연산될 수 없음&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;아래와 같이 형 변환을 하여 연산&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; s = '42'
&amp;gt;&amp;gt;&amp;gt; i = 1
&amp;gt;&amp;gt;&amp;gt; int(s) + i
43
&amp;gt;&amp;gt;&amp;gt; s = str(i)
'421'&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;String indexing and slicing&lt;/h2&gt;
&lt;h3&gt;Indexing&lt;/h3&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 'Hello'
&amp;gt;&amp;gt;&amp;gt; a[0]  # []을 사용하여 Indexing
'H'
&amp;gt;&amp;gt;&amp;gt; a[1]
'e'
&amp;gt;&amp;gt;&amp;gt; a[-1]
'o'
&amp;gt;&amp;gt;&amp;gt; a[-2]
'l'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;첫 글자부터 &lt;code&gt;indexing&lt;/code&gt;하여 가져 올려면 &lt;code&gt;0&lt;/code&gt;부터 시작하고 마지막 글자부터 가져 올려면 &lt;code&gt;-1&lt;/code&gt;부터 시작함 .&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;269&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwO5VZ/btqDk5RFrWJ/Jp1CxrB24e4BKUGJ34ILvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwO5VZ/btqDk5RFrWJ/Jp1CxrB24e4BKUGJ34ILvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwO5VZ/btqDk5RFrWJ/Jp1CxrB24e4BKUGJ34ILvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwO5VZ%2FbtqDk5RFrWJ%2FJp1CxrB24e4BKUGJ34ILvK%2Fimg.png&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;269&quot; data-origin-height=&quot;150&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;Slicing&lt;/h3&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 'Hamburger'
&amp;gt;&amp;gt;&amp;gt; a[:]    # 모든 글자 포함
'Hamburger'
&amp;gt;&amp;gt;&amp;gt; a[:3]   # 앞 3글자만 포함
'Ham'
&amp;gt;&amp;gt;&amp;gt; a[3:]   # 앞 3글자 제외
'burger'
&amp;gt;&amp;gt;&amp;gt; a[1:]   # 첫 글자 제외
'amburger'
&amp;gt;&amp;gt;&amp;gt; a[:-1]  # 마지막 글자 제외
'Hamburge'
&amp;gt;&amp;gt;&amp;gt; a[1:3]
'am'
&amp;gt;&amp;gt;&amp;gt; a[1:-1] # 첫 글자와 마지막 글자를 제외
'amburge'
&amp;gt;&amp;gt;&amp;gt; a[0:-1] # 마지막 글자 제외
'Hamburge]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;[start:end]&lt;/code&gt; 이와 같이 처음 자를 곳과 마지막으로 자를 곳을 지정.&lt;br /&gt;&lt;code&gt;[strat:]&lt;/code&gt; 마지막 자를 곳을 지정하지 않으면 문자열 마지막을 의미.&lt;br /&gt;&lt;code&gt;[:end]&lt;/code&gt; 처음 자를 곳을 지정하지 않으면 문자열 처음(&lt;code&gt;0&lt;/code&gt;)을 의미.&lt;br /&gt;&lt;code&gt;[0:-1]&lt;/code&gt; 0은 문자열 첫 문자 앞을 의미하고, -1은 문자열 마지막 문자 앞을 의미.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;[start:end:step]&lt;/code&gt; 이와 같이 &lt;code&gt;step&lt;/code&gt;을 지정하여 지정한 숫자 만큼 건너뛰고 문자를 가져 올 수 있음.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;1834&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btws0O/btqDnvVTwPk/KG4FxhtufZVqQNswXzkn0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btws0O/btqDnvVTwPk/KG4FxhtufZVqQNswXzkn0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btws0O/btqDnvVTwPk/KG4FxhtufZVqQNswXzkn0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbtws0O%2FbtqDnvVTwPk%2FKG4FxhtufZVqQNswXzkn0K%2Fimg.png&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;1834&quot; data-origin-height=&quot;494&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 'sliceofspam'
&amp;gt;&amp;gt;&amp;gt; a[1:-1:2]
'lcosa'
&amp;gt;&amp;gt;&amp;gt; a[::2]
'siefpm'
&amp;gt;&amp;gt;&amp;gt; a[::1]
'sliceofspam'
&amp;gt;&amp;gt;&amp;gt; a[::-1]  # reversing
'mapsfoecils'
&amp;gt;&amp;gt;&amp;gt; a[5:1:-1]
'oeci'&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;a[5:1:-1]&lt;/code&gt;의 경우 &lt;code&gt;-1&lt;/code&gt;로 인해서 slicing을 거꾸로 함. 즉 5번 부터 거꾸로 4글자를 가져옴.(예를들어 &lt;code&gt;a[1:5]&lt;/code&gt; 같은 경우 1번 부터 시작하여 4글자를 가져옴.). 헷갈림 ㅋ&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;&lt;code&gt;slice()&lt;/code&gt; 사용&lt;/h4&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; 'spam'[slice(1, 3)]
'pa'
&amp;gt;&amp;gt;&amp;gt; 'sapm'[slice(None, None, -1)]
'maps'&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;String formatting&lt;/h2&gt;
&lt;h3&gt;String formatting expressions&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;'...%s...' % (값)&lt;/code&gt; 형식을 사용.&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 'hamburger'
&amp;gt;&amp;gt;&amp;gt; 'I like a %s' % a  # %s는 string을 의미
'I like a hamburger'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;%d&lt;/code&gt;는 Decimal을 의미하고 숫자 관련 출력 형식을 조절할 수 있음.&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; x = 1234
&amp;gt;&amp;gt;&amp;gt; 'integers: %d, %06d' % (x, x)
'integers: 1234, 001234'&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Dictionary-Based formatting expressions&lt;/h3&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; '%(qty)d more %(food)s' % {'qty': 1, 'food': 'spam'}
'1 more spam'&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;String formatting method call&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;'...{}...'.format(값)&lt;/code&gt; 형식을 사용.&lt;/p&gt;
&lt;pre class=&quot;vbnet&quot;&gt;&lt;code&gt;# 위치에 따른 치환
&amp;gt;&amp;gt;&amp;gt; a = 'hamburger'
&amp;gt;&amp;gt;&amp;gt; b = 'sandwich'
&amp;gt;&amp;gt;&amp;gt; 'I like a {} and {}'.format(a, b)
'I like a hamburger and sandwich'
&amp;gt;&amp;gt;&amp;gt; 'I like a {0} and {1}'.format(a, b)
'I like a hamburger and sandwich'
&amp;gt;&amp;gt;&amp;gt; 'I like a {1} and {0}'.format(a, b)
'I like a sandwich and hamburger'

# 키워드 치환
&amp;gt;&amp;gt;&amp;gt; template = 'I like a {hamburger} and {sandwich}'
&amp;gt;&amp;gt;&amp;gt; template.format(hamburger='Cheese burger', sandwich='Ham sandwich'
'I like a Cheese burger and Ham sandwich'

# 위 두개 동시 사용
&amp;gt;&amp;gt;&amp;gt; template = 'I like a {0} and {sandwich}'
&amp;gt;&amp;gt;&amp;gt; template.format('Cheese burger', sandwich='Ham sandwich')
'I like a Cheese burger and Ham sandwich'&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;f-string&lt;/code&gt; formatting&lt;/h3&gt;
&lt;p&gt;파이썬3.6 부터 지원.&lt;br /&gt;위의 formatting 방식들과 비교 했을 때 가독성이 뛰어남.&lt;/p&gt;
&lt;h4&gt;string formatting&lt;/h4&gt;
&lt;pre class=&quot;vbnet&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 'hamburger'
&amp;gt;&amp;gt;&amp;gt; b = 'sandwich'
&amp;gt;&amp;gt;&amp;gt; f'I like a {a} and {b}'
'I like a hamburger and sandwich'
&amp;gt;&amp;gt;&amp;gt; f'I like a {b} and {a}'
'I like a sandwich and hamburger'&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Dictionary 방식&lt;/h4&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; food = {'hamburger': 'Cheese burger', 'sandwich': 'Ham sandwich'}
&amp;gt;&amp;gt;&amp;gt; f'I like a {food['hamburger']} and {food['sandwich'])'
'I like a Cheese burger and Ham sandwich'&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;multiline&lt;/h4&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; name = 'John Doe'
&amp;gt;&amp;gt;&amp;gt; age = 32
&amp;gt;&amp;gt;&amp;gt; occupation = 'software engineer'
&amp;gt;&amp;gt;&amp;gt; msg = (
f'Name: {name}\n'
f'Age: {age}\n'
f'Occupation: {occupation}'
)
&amp;gt;&amp;gt;&amp;gt; print(msg)
Name: John Doe
Age: 32
Occupation: software engineer&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;calling function&lt;/h4&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; def add(x, y):
        return x + y
&amp;gt;&amp;gt;&amp;gt; a = 3
&amp;gt;&amp;gt;&amp;gt; b = 4
&amp;gt;&amp;gt;&amp;gt; f'{a} + {b} = {add(a, b)}'
'3 + 4 = 7'&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;숫자 길이&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 123
&amp;gt;&amp;gt;&amp;gt; f'{a}, {a:04}, {a:05}'
'123, 0123, 00123'&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;들여쓰기&lt;/h4&gt;
&lt;p&gt;기본으로 왼쪽 열에 맞춤이고 설정을 할 수 있음.&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 123
&amp;gt;&amp;gt;&amp;gt; f'{a:&amp;gt;10}'
'       123'&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;String 메서드&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;a = 'string'&lt;/code&gt;를 선언 시 변수 &lt;code&gt;a&lt;/code&gt;는 &lt;code&gt;str()&lt;/code&gt; 클래스의 인스턴스가 되기 때문에 &lt;code&gt;str()&lt;/code&gt; 클래스의 메서드를 사용할 수 있음.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://python-world.tistory.com/42&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2020/04/05 - [Basic] - 변수&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1586620554220&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;변수&quot; data-og-description=&quot;변수 선언 파이썬은 아래와 같이 변수 선언 &amp;gt;&amp;gt;&amp;gt; a = 1 # int 형 선언 &amp;gt;&amp;gt;&amp;gt; type(a) # type() 빌트인 함수를 사용하여 형 확인 int &amp;gt;&amp;gt;&amp;gt; a 1 &amp;gt;&amp;gt;&amp;gt; a = '1' # ''를 사용하면 str 형이 선언 &amp;gt;&amp;gt;&amp;gt; type(a) str &amp;gt;&amp;gt;&amp;gt; a '1'..&quot; data-og-host=&quot;python-world.tistory.com&quot; data-og-source-url=&quot;https://python-world.tistory.com/42&quot; data-og-url=&quot;https://python-world.tistory.com/42&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c9YYXk/hyFCotKUsE/VJOdRWejK6A8QNOnhzY0sk/img.png?width=458&amp;amp;height=184&amp;amp;face=0_0_458_184,https://scrap.kakaocdn.net/dn/bLPR0H/hyFCuOif3F/mkDku6moMBFKwmqDebtU31/img.png?width=458&amp;amp;height=184&amp;amp;face=0_0_458_184,https://scrap.kakaocdn.net/dn/O9x11/hyFDrCpLMk/RuvaqRcKxFEEIdBz4gKKw1/img.png?width=1468&amp;amp;height=570&amp;amp;face=0_0_1468_570&quot;&gt;&lt;a href=&quot;https://python-world.tistory.com/42&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://python-world.tistory.com/42&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c9YYXk/hyFCotKUsE/VJOdRWejK6A8QNOnhzY0sk/img.png?width=458&amp;amp;height=184&amp;amp;face=0_0_458_184,https://scrap.kakaocdn.net/dn/bLPR0H/hyFCuOif3F/mkDku6moMBFKwmqDebtU31/img.png?width=458&amp;amp;height=184&amp;amp;face=0_0_458_184,https://scrap.kakaocdn.net/dn/O9x11/hyFDrCpLMk/RuvaqRcKxFEEIdBz4gKKw1/img.png?width=1468&amp;amp;height=570&amp;amp;face=0_0_1468_570');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;변수&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;변수 선언 파이썬은 아래와 같이 변수 선언 &amp;gt;&amp;gt;&amp;gt; a = 1 # int 형 선언 &amp;gt;&amp;gt;&amp;gt; type(a) # type() 빌트인 함수를 사용하여 형 확인 int &amp;gt;&amp;gt;&amp;gt; a 1 &amp;gt;&amp;gt;&amp;gt; a = '1' # ''를 사용하면 str 형이 선언 &amp;gt;&amp;gt;&amp;gt; type(a) str &amp;gt;&amp;gt;&amp;gt; a '1'..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;python-world.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3&gt;&lt;code&gt;.find()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;문자열에서 주어진 값의 인덱스를 반환. (예: hello 같이 &lt;code&gt;l&lt;/code&gt;이 두개 인 경우 처음 인덱스를 반환). 없으면 &lt;code&gt;-1&lt;/code&gt;을 반환.&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 'hello'
&amp;gt;&amp;gt;&amp;gt; a.find('he')
1
&amp;gt;&amp;gt;&amp;gt; a.find('o')
4&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 'String'
&amp;gt;&amp;gt;&amp;gt; a.find('St')

&amp;gt;&amp;gt;&amp;gt; a = '  String  '
&amp;gt;&amp;gt;&amp;gt; a.rstrip()
'  String'
&amp;gt;&amp;gt;&amp;gt; a.lstrip()
'String  '
&amp;gt;&amp;gt;&amp;gt; a.strip()
'String'
&amp;gt;&amp;gt;&amp;gt; a
'  String  '&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.strip()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;공백을 제거하여 반환.&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = '  String  '
&amp;gt;&amp;gt;&amp;gt; a.rstrip()
'  String'
&amp;gt;&amp;gt;&amp;gt; a.lstrip()
'String  '
&amp;gt;&amp;gt;&amp;gt; a.strip()
'String'
&amp;gt;&amp;gt;&amp;gt; a
'  String  '&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;.rstrip()&lt;/code&gt;는 오르쪽 공백만 제거.&lt;br /&gt;&lt;code&gt;.lstrip()&lt;/code&gt;는 왼쪽 공백만 제거.&lt;br /&gt;&lt;code&gt;.strip()&lt;/code&gt;는 양쪽 공백을 제거.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;.replace()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;문자열을 주어진 값으로 변환하여 반환.&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 'String....String....String'
&amp;gt;&amp;gt;&amp;gt; a.replace('St', 'b')  # 전체를 변환
'bring....bring....bring'
&amp;gt;&amp;gt;&amp;gt; a.replace('St', 'b', 1)  # 처음 하나만 변환
'bring....String....String'
&amp;gt;&amp;gt;&amp;gt; a
'String....String....String'&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.join()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;주어진 값을 구분자로 사용하여 &lt;code&gt;list&lt;/code&gt;안의 값들을 하나의 문자열로 합친 후 반환&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; ','.join(['eggs', 'sausage', 'ham', 'toast'])
'eggs,sausage,ham,toast'&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.split()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;주어진 값을 구분자로 사용하여 하나의 문자열을 &lt;code&gt;list&lt;/code&gt;로 분리 후 반환&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 'eggs,sausage,ham,toast'
&amp;gt;&amp;gt;&amp;gt; a.split(',')
['eggs', 'sausage', 'ham', 'toast']&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.isdigit()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;String 변수가 &lt;code&gt;1&lt;/code&gt; 같은 숫자 이면 &lt;code&gt;True&lt;/code&gt; 반환, 아니면 &lt;code&gt;False&lt;/code&gt; 반환&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = '1'
&amp;gt;&amp;gt;&amp;gt; a.isdigit()
True

&amp;gt;&amp;gt;&amp;gt; a = 'String'
&amp;gt;&amp;gt;&amp;gt; a.isdigit()
False&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.isalpha()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;String 변수가 &lt;code&gt;abc&lt;/code&gt; 같은 문자 이면 &lt;code&gt;True&lt;/code&gt; 반환. 아니면 &lt;code&gt;False&lt;/code&gt; 반환&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 'String'
&amp;gt;&amp;gt;&amp;gt; a.isalpha()
True

&amp;gt;&amp;gt;&amp;gt; a = '1'
&amp;gt;&amp;gt;&amp;gt; a.isalpha()
False&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.upper()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;문자열을 대문자로 반환&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 'string'
&amp;gt;&amp;gt;&amp;gt; a.upper()
'STRING'&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.lower()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;문자열을 소문자로 반환&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 'STRING'
&amp;gt;&amp;gt;&amp;gt; a.lower()
'string'&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.startswith()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;문자열이 주어진 값으로 시작하면 &lt;code&gt;True&lt;/code&gt; 반환. 아니면 &lt;code&gt;False&lt;/code&gt; 반환.&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 'String'
&amp;gt;&amp;gt;&amp;gt; a.startswith('S')
True
&amp;gt;&amp;gt;&amp;gt; a.startswith('s')
False&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;.endswith()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;문자열이 주어진 값으로 끝나면 &lt;code&gt;True&lt;/code&gt; 반환. 아니면 &lt;code&gt;False&lt;/code&gt; 반환&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 'String'
&amp;gt;&amp;gt;&amp;gt; a.endswith('ng')
True&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;더 알아보기&lt;/h2&gt;
&lt;p&gt;파이썬3부터 string은 Unicode임.&lt;br /&gt;&lt;code&gt;String&lt;/code&gt;은 불변(변경할 수 없음) 타입임. 예를들어 &lt;code&gt;.replace()&lt;/code&gt; 메서드로 원하는 값을 변경 시 원래의 문자열은 변경되지 않고 변경된 형태의 문자열이 반환됨. 즉 변경된 문자열을 사용하고 싶으면 별도의 변수에 저장.&lt;/p&gt;</description>
      <category>Basic</category>
      <category>Python</category>
      <author>nickas</author>
      <guid isPermaLink="true">https://python-world.tistory.com/43</guid>
      <comments>https://python-world.tistory.com/entry/python-string#entry43comment</comments>
      <pubDate>Sat, 11 Apr 2020 20:31:30 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 변수</title>
      <link>https://python-world.tistory.com/entry/python-variable</link>
      <description>&lt;h1&gt;변수 선언&lt;/h1&gt;
&lt;p&gt;파이썬은 아래와 같이 변수 선언&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 1         # int 형 선언
&amp;gt;&amp;gt;&amp;gt; type(a)       # type() 빌트인 함수를 사용하여 형 확인
int
&amp;gt;&amp;gt;&amp;gt; a
1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xalpP/btqDc3ywEYZ/d5QGPTeEtXF8G6UfWe2i2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xalpP/btqDc3ywEYZ/d5QGPTeEtXF8G6UfWe2i2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xalpP/btqDc3ywEYZ/d5QGPTeEtXF8G6UfWe2i2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxalpP%2FbtqDc3ywEYZ%2Fd5QGPTeEtXF8G6UfWe2i2k%2Fimg.png&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;184&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = '1'       # ''를 사용하면 str 형이 선언
&amp;gt;&amp;gt;&amp;gt; type(a)
str
&amp;gt;&amp;gt;&amp;gt; a
'1'
&amp;gt;&amp;gt;&amp;gt; a.isdigit()   # isdigit()를 사용하여 str형이 정수형 str인지 확인 가능
True&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TXqMY/btqDdH24CJ8/hKE482jd1fUdm8ZUj9SMPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TXqMY/btqDdH24CJ8/hKE482jd1fUdm8ZUj9SMPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TXqMY/btqDdH24CJ8/hKE482jd1fUdm8ZUj9SMPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTXqMY%2FbtqDdH24CJ8%2FhKE482jd1fUdm8ZUj9SMPk%2Fimg.png&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;192&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 'string'  # str 형 선언
&amp;gt;&amp;gt;&amp;gt; type(a)
str
&amp;gt;&amp;gt;&amp;gt; a
'string'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/elMGu4/btqDecogDni/hsU8OALqechdIiVIT366N0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/elMGu4/btqDecogDni/hsU8OALqechdIiVIT366N0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/elMGu4/btqDecogDni/hsU8OALqechdIiVIT366N0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FelMGu4%2FbtqDecogDni%2FhsU8OALqechdIiVIT366N0%2Fimg.png&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;200&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 1.23      # floating 형 선언
&amp;gt;&amp;gt;&amp;gt; type(a)
float
&amp;gt;&amp;gt;&amp;gt; a
1.23&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lO3CB/btqDblfOZ6v/bfbcOcmMeBaE9LQ8Efix9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lO3CB/btqDblfOZ6v/bfbcOcmMeBaE9LQ8Efix9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lO3CB/btqDblfOZ6v/bfbcOcmMeBaE9LQ8Efix9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlO3CB%2FbtqDblfOZ6v%2FbfbcOcmMeBaE9LQ8Efix9K%2Fimg.png&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;190&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = [1, 2, 3] # list 형 선언
&amp;gt;&amp;gt;&amp;gt; type(a)
list
&amp;gt;&amp;gt;&amp;gt; a
[1, 2, 3]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o6M7O/btqDaUW4Lws/R6ws9JHfLc3xGcI7ArNE1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o6M7O/btqDaUW4Lws/R6ws9JHfLc3xGcI7ArNE1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o6M7O/btqDaUW4Lws/R6ws9JHfLc3xGcI7ArNE1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo6M7O%2FbtqDaUW4Lws%2FR6ws9JHfLc3xGcI7ArNE1k%2Fimg.png&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;540&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = {'a': 1, 'b': 1, 'c': 1}  # dictionary 형 선언
&amp;gt;&amp;gt;&amp;gt; type(a)
dict
&amp;gt;&amp;gt;&amp;gt; a
{'a': 1, 'b': 1, 'c': 1}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8Rli0/btqDcxGE1CI/IgJVzTooTz12NXP0JtLqCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8Rli0/btqDcxGE1CI/IgJVzTooTz12NXP0JtLqCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8Rli0/btqDcxGE1CI/IgJVzTooTz12NXP0JtLqCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8Rli0%2FbtqDcxGE1CI%2FIgJVzTooTz12NXP0JtLqCK%2Fimg.png&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;716&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;def func():
    pass

&amp;gt;&amp;gt;&amp;gt; a = func  # func()를 할당하면 함수가 실행되어 값이 할당 됨.
&amp;gt;&amp;gt;&amp;gt; type(a)
function
&amp;gt;&amp;gt;&amp;gt; a
&amp;lt;function __main__.func()&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;7.png&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZow5O/btqDah5574Q/jasuZDlQt1uMJkKtmrT7b0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZow5O/btqDah5574Q/jasuZDlQt1uMJkKtmrT7b0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZow5O/btqDah5574Q/jasuZDlQt1uMJkKtmrT7b0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZow5O%2FbtqDah5574Q%2FjasuZDlQt1uMJkKtmrT7b0%2Fimg.png&quot; data-filename=&quot;7.png&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;256&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;파이썬은 다른 프로그래밍 언어와 다르게 변수 선언 시 형(type)을 지정하지 않음.&lt;br /&gt;변수에 어떤 형이 할당되는지에 따라 변수형이 결정됨.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;프로그래밍 언어에서 &lt;code&gt;=&lt;/code&gt; 기호는 수학기호에서 말하는 똑같다는 의미가 아니고 왼쪽의 값을 오른쪽에 할당하라는 의미. &lt;code&gt;==&lt;/code&gt;이 기호가 똑같다는 의미. 모든 프로그래밍 언어에서 이와 같이 사용.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;사실 파이썬은 변수에 어떤 값을 할당할 때 그 값이 할당되는 것이 아니라 값이 실제 저장되어 있는 메모리 주소 정보를 가지고 있음. 즉, &lt;code&gt;a = 1&lt;/code&gt;이라고 선언하면 숫자 1은 &lt;code&gt;int()&lt;/code&gt;클래스의 인스턴스(인스턴스 오브젝트(객체))가 되고 아래 그림과 같이 변수 &lt;code&gt;a&lt;/code&gt;는 &lt;code&gt;int()&lt;/code&gt; 인스턴스의 메모리 주소 정보를 가지게 됨.(&lt;code&gt;C&lt;/code&gt;에서는 이것을 &lt;code&gt;pointer&lt;/code&gt;라고 부름)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;8.png&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdxgD1/btqDbE7mnSa/gET6lOO0qMNsL043FJMvI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdxgD1/btqDbE7mnSa/gET6lOO0qMNsL043FJMvI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdxgD1/btqDbE7mnSa/gET6lOO0qMNsL043FJMvI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdxgD1%2FbtqDbE7mnSa%2FgET6lOO0qMNsL043FJMvI0%2Fimg.png&quot; data-filename=&quot;8.png&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;570&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;파이썬은 변수 선언 시 형 정의를 하지 않기 때문에 사용 시 주의 필요. 즉, 다른 프로그래밍 언어에서는 int형으로 선언된 변수에 str형을 할당하면 에러를 발생하지만 파이썬은 에러를 발생하지 않을뿐만 아니라 int형 변수가 str형 변수가 됨. 이것을 &lt;code&gt;Dynamic Type&lt;/code&gt;이라고 함.&lt;br /&gt;형 검증을 위해 &lt;code&gt;isinstance()&lt;/code&gt;라는 빌트인 함수를 사용할 수 있음. &lt;code&gt;isinstance(a, str)&lt;/code&gt; 변수 a가 str형일 경우 &lt;code&gt;True&lt;/code&gt;를 반환하고, 아닐경우 &lt;code&gt;False&lt;/code&gt;를 반환.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;그래서 파이썬은 모든 것이 객체라고 하는 것임.&lt;/p&gt;
&lt;h2&gt;&lt;code&gt;is&lt;/code&gt; vs &lt;code&gt;==&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;==&lt;/code&gt;는 두 변수가 같은 값을 가지고 있는지 확인할 때 사용&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 1
&amp;gt;&amp;gt;&amp;gt; b = 1
&amp;gt;&amp;gt;&amp;gt; a == b
True

&amp;gt;&amp;gt;&amp;gt; a = 1
&amp;gt;&amp;gt;&amp;gt; b = 2
&amp;gt;&amp;gt;&amp;gt; a == b
False&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;is&lt;/code&gt;는 두 변수가 같은 객체인지 확인할 때 사용&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 1
&amp;gt;&amp;gt;&amp;gt; b = a  # 변수 b에 1의 값이 할당되는 것이 아니라 1의 메모리 주소(위치)가 할당 됨.
&amp;gt;&amp;gt;&amp;gt; a is b
True

&amp;gt;&amp;gt;&amp;gt; a = 1
&amp;gt;&amp;gt;&amp;gt; b = 2
&amp;gt;&amp;gt;&amp;gt; a is b
False&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;특이한 경우&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; a = 1
&amp;gt;&amp;gt;&amp;gt; b = 1
&amp;gt;&amp;gt;&amp;gt; a == b
True
&amp;gt;&amp;gt;&amp;gt; a is b
True&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;a = 1&lt;/code&gt;과 &lt;code&gt;b = 1&lt;/code&gt;은 각각 선언되었기 때문에 각각 별도의 &lt;code&gt;int()&lt;/code&gt; 클래스의 인스턴스가 생성됨.&lt;br /&gt;그러나 &lt;code&gt;a is b&lt;/code&gt; 리턴 값이 True인 이유는 파이썬 인터프리터가 한번 생성된 인스턴스 오브젝트를 캐싱하고 있다가 다른 변수가 사용 시 재 사용함. 즉, &lt;code&gt;a = 1&lt;/code&gt;이 선언될 때 &lt;code&gt;1&lt;/code&gt;의 값을 가지고 있는 &lt;code&gt;int()&lt;/code&gt; 클래스의 인스턴스가 생성 및 캐싱되고, &lt;code&gt;b = 1&lt;/code&gt; 이 선언될 때 이미 만들어진 &lt;code&gt;1&lt;/code&gt;의 값을 가지고 있는 &lt;code&gt;int()&lt;/code&gt;의 인스턴스를 재 사용함. 그러나 Garbage collection으로 사라진 인스턴스는 재사용할 수 없음.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Garbage collection은 heap 메모리에 생성되어 사용되지 않는 오브젝트를 감지하여 메모리 상에서 지워버리는 &lt;code&gt;CPython&lt;/code&gt;의 기능?이고, JAVA의 Garbage collection와 비슷한 기능?이다. 자세한 사항은 어려운 내용이기에 관심 있으면 Google 검색.&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>Basic</category>
      <category>Python</category>
      <author>nickas</author>
      <guid isPermaLink="true">https://python-world.tistory.com/42</guid>
      <comments>https://python-world.tistory.com/entry/python-variable#entry42comment</comments>
      <pubDate>Sun, 5 Apr 2020 00:28:58 +0900</pubDate>
    </item>
  </channel>
</rss>