<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>파이썬코딩</title>
    <link>https://about-design.tistory.com/</link>
    <description>파이썬코딩,파이썬코드구조</description>
    <language>ko</language>
    <pubDate>Wed, 6 May 2026 23:09:00 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>&amp;amp;$#@</managingEditor>
    <item>
      <title>NoSQL 데이터 저장소</title>
      <link>https://about-design.tistory.com/entry/NoSQL-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%80%EC%9E%A5%EC%86%8C</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;NoSQL 데이터 저장소.jpeg&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HpIDh/btrkIQjsCDv/1ENLkXwE409uNkjJhj5kJK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HpIDh/btrkIQjsCDv/1ENLkXwE409uNkjJhj5kJK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HpIDh/btrkIQjsCDv/1ENLkXwE409uNkjJhj5kJK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHpIDh%2FbtrkIQjsCDv%2F1ENLkXwE409uNkjJhj5kJK%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;450&quot; height=&quot;450&quot; data-filename=&quot;NoSQL 데이터 저장소.jpeg&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;일부 데이터베이스는 관계형 데이터베이스가 아니므로 SQL을 지원하지 않습니다. 이는 매우 큰 데이터 세트를 처리하거나, 보다 유연한 데이터 정의를 허용하거나, 사용자 지정 데이터 작업을 지원하기 위해 작성되었습니다. 이들은 집합적으로 NoSQL(이전에는 SQL이 없었으나 이제는 SQL뿐만 아니라 덜 대립한다는 의미)로 분류되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;dbm 제품군&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;DBM 포맷은 NoSQL이 만들어지기 훨씬 전에 존재했다. 키 밸류 스토어로, 웹 브라우저와 같은 응용 프로그램에 내장되어 다양한 설정을 유지합니다. DBM 데이터베이스는 다음과 같은 면에서 파이썬 사전과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 키에 값을 할당할 수 있으며, 자동으로 디스크에 있는 데이터베이스에 저장됩니다. &amp;bull; 키에서 값을 얻을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음은 간단한 예입니다. 다음 open() 메서드에 대한 두 번째 인수는 읽으려면 'r', 쓰려면 'w', 둘 다의 경우 'c'로 파일이 존재하지 않을 경우 파일을 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import dbm&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; db = dbm.open('definitions', 'c')&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;키-값 쌍을 만들려면 사전과 마찬가지로 키에 값을 할당하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; db['mustard'] = 'yellow'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; db['ketchup'] = 'red'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; db['pesto'] = 'green'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;잠시 멈추고 지금까지 보여드린 내용을 확인해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; len(db)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;3&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; db['pesto']&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;b'green'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;닫았다가 다시 열어 실제로 저장했는지 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; db.close()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; db = dbm.open('definitions', 'r')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; db['mustard']&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;b'yellow'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;키와 값은 바이트로 저장됩니다. 데이터베이스 오브젝트 DB를 반복할 수는 없지만 len()을 사용하여 키 수를 얻을 수 있습니다. 사전에서와 같이 get() 및 setdefault()가 작동합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Memcached&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;memcached는 빠른 메모리 내 키 값 캐시 서버입니다. 종종 데이터베이스 앞에 놓이거나 웹 서버 세션 데이터를 저장하는 데 사용됩니다. Linux 및 OS X용 및 Windows용 버전을 다운로드할 수 있습니다. 이 섹션을 사용하려면 memcached 서버와 Python 드라이버가 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Python 드라이버에는 여러 가지가 있습니다. Python 3에서 작동하는 드라이버는 python3 memcached이며 다음 명령을 사용하여 설치할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;$ pip install python-memcached&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이를 사용하려면 memcached 서버에 연결하고, 그런 다음 다음을 수행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 키 값 설정 및 가져오기&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 값의 증가 또는 감소&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 키 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데이터가 영구적이지 않고 이전에 작성한 데이터가 사라질 수 있습니다. 이것은 memcached에 내재되어 있습니다. 캐시 서버이기 때문입니다. 오래된 데이터를 카드화하여 메모리 부족을 방지합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여러 memcached 서버에 동시에 연결할 수 있습니다. 다음 예에서는 같은 컴퓨터에 있는 사람과 대화하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import memcache&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; db = memcache.Client(['127.0.0.1:11211']) &amp;gt;&amp;gt;&amp;gt; db.set('marco', 'polo')&lt;br /&gt;True&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; db.get('marco')&lt;br /&gt;'polo'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; db.set('ducks', 0)&lt;br /&gt;True&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; db.get('ducks')&lt;br /&gt;0&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; db.incr('ducks', 2)&lt;br /&gt;2&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; db.get('ducks')&lt;br /&gt;2&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;레디스&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Redis는 데이터 구조 서버입니다. memcached와 마찬가지로 Redis 서버의 모든 데이터는 메모리에 맞아야 합니다(데이터를 디스크에 저장할 수 있는 옵션이 있습니다). memc ac aced와 달리 Redis는 다음을 수행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 안정성 및 재시작을 위해 데이터를 디스크에 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 이전 데이터 유지&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 단순한 문자열보다 더 많은 데이터 구조 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Redis 데이터 유형은 Python과 거의 일치하며, Redis 서버는 하나 이상의 Python 애플리케이션이 데이터를 공유하는 데 유용한 매개체가 될 수 있다. 나는 그것이 매우 유용하다는 것을 알았기 때문에 여기에서 약간의 추가 커버리지를 할 가치가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;파이썬 드라이버 redis-py는 온라인 문서뿐만 아니라 GitHub에 소스 코드와 테스트를 가지고 있다. 다음 명령을 사용하여 설치할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$ pip install redis &lt;/li&gt;
&lt;li&gt;Redis 서버 자체의 설명서가 좋습니다. 로컬 컴퓨터에 네트워크 닉네임 localhost를 사용하여 Redis 서버를 설치하고 시작하는 경우 다음 섹션에서 pro ing을 사용할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Strings&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;단일 값을 갖는 키는 Redis 문자열입니다. 간단한 파이썬 데이터 유형이 자동으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;변환됩니다. 일부 호스트(기본값: localhost) 및 포트(de 오류: 6379)에서 Redis&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;서버에 연결합니다.&lt;/li&gt;
&lt;li&gt;&amp;gt;&amp;gt;&amp;gt; import redis&lt;/li&gt;
&lt;li&gt;&amp;gt;&amp;gt;&amp;gt; conn = redis.Redis() &lt;/li&gt;
&lt;li&gt;redis.Redis('localhost') 또는 redis.Redis('localhost', 6379)도 같은 결과를 냈을 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;모든 키 나열(현재 없음):&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.keys('*')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;[]&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;단순 문자열(키 'secret', 정수(키 '캐럿') 및 플로트(키 'fever') 설정:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.set('secret', 'ni!')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;True&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.set('carats', 24)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;True&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.set('fever', '101.5')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;True&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;키로 값을 다시 가져옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.get('secret')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;b'ni!'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.get('carats')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;b'24'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.get('fever')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;b'101.5'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서 setnx() 메서드는 키가 없는 경우에만 값을 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; conn.setnx('secret', 'icky-icky-icky-ptang-zoop-boing!')&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;False&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이미 '비밀'을 정의했기 때문에 실패했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; conn.get('secret')&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;b'ni!'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;getset() 메서드는 이전 값을 반환하고 동시에 새 값으로 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.getset('secret', 'icky-icky-icky-ptang-zoop-boing!')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;b'ni!'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;너무 앞서가지 맙시다. 효과가 있던가요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.get('secret')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;b'icky-icky-icky-ptang-zoop-boing!'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 getrange()를 사용하여 하위 문자열을 가져옵니다(파이썬에서와 같이 오프셋 0=start, -1=end).&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; conn.getrange('secret', -6, -1)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;b'boing!'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;setrange()를 사용하여 하위 문자열을 교체합니다(영점 기반 오프셋 사용).&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.setrange('secret', 0, 'ICKY')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;32&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.get('secret')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;b'ICKY-icky-icky-ptang-zoop-boing!'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그런 다음 mset()을 사용하여 여러 키를 한 번에 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.mset({'pie': 'cherry', 'cordial': 'sherry'})&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;True&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;mget()을 사용하여 두 개 이상의 값을 동시에 가져옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; conn.mget(['fever', 'carats'])&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;[b'101.5', b'24']&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;삭제()를 사용하여 키 삭제:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.delete('fever')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;True&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;incr() 또는 incrbyfloat() 명령을 사용하여 증가시키고 decr()을 사용하여 감소시킵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.incr('carats')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;25&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.incr('carats', 10)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;35&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.decr('carats')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;34&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.decr('carats', 15)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;19&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.set('fever', '101.5')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;True&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.incrbyfloat('fever')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;102.5&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.incrbyfloat('fever', 0.5)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;103.0&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;디크르비플로트가 없습니다. 열을 낮추려면 음의 증분을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; conn.incrbyfloat('fever', -2.0)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;101.0&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;목록&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;재지정 목록에는 문자열만 포함할 수 있습니다. 이 목록은 처음 삽입할 때 작성됩니다. lpush()를 사용하여 처음에 삽입합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.lpush('zoo', 'bear')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;1&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;처음에 두 개 이상의 항목을 삽입합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.lpush('zoo', 'alligator', 'duck')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;3&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;삽입()을 사용하여 값 앞 또는 뒤에 삽입:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.linsert('zoo', 'before', 'bear', 'beaver')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;4&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.linsert('zoo', 'after', 'bear', 'cassowary')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;5&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;lset()을 사용하여 오프셋에 삽입(목록이 이미 존재해야 함):&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; conn.lset('zoo', 2, 'marmoset')&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;True&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;rpush()를 사용하여 끝에 삽입합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; conn.rpush('zoo', 'yak')&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;6&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;lindex()를 사용하여 오프셋의 값을 가져옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; conn.lindex('zoo', 3)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;b'bear'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;lrange()(0 ~ -1)를 사용하여 오프셋 범위의 값을 가져옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.lrange('zoo', 0, 2)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;[b'duck', b'alligator', b'marmoset']&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ltrim()으로 목록을 트리밍하고 오프셋 범위에만 유지합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; conn.ltrim('zoo', 1, 4)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;True&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;lrange()를 사용하여 값의 범위를 가져옵니다(모두에 대해 0 ~ -1 사용).&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; conn.lrange('zoo', 0, -1)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;[b'alligator', b'marmoset', b'bear', b'cassowary']&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 장에서는 Redis 목록과 게시-구독을 사용하여 구현할 수 있는 방법을 보여줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;작업 대기열&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Hashes&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Redis 해시는 Python 사전과 유사하지만 문자열만 포함할 수 있습니다. 그러므로, 여러분은 깊은 내피 구조를 만들 수 없고 오직 한 단계만 깊이 들어갈 수 있습니다. 다음은 노래라는 Redis 해시를 만들고 재생하는 예입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;hmset()을 사용하여 해시 송에서 do 및 re 필드를 한 번에 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; conn.hmset('song', {'do': 'a deer', 're': 'about a deer'})&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;True&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;hset()을 사용하여 해시의 단일 필드 값을 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; conn.hset('song', 'mi', 'a note to follow re')&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;hget()을 사용하여 필드 값 가져오기:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; conn.hget('song', 'mi')&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;b'a note to follow re'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;hmget()을 사용하여 여러 필드 값을 가져옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.hmget('song', 're', 'do')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;[b'about a deer', b'a deer']&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;hkeys()를 사용하여 해시의 모든 필드 키를 가져옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; conn.hkeys('song')&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;[b'do', b're', b'mi']&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;hval()을 사용하여 해시의 모든 필드 값을 가져옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.hvals('song')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;[b'a deer', b'about a deer', b'a note to follow re']&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;hlen()을 사용하여 해시의 필드 수를 가져옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; conn.hlen('song')&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;hgetall()을 사용하여 해시의 모든 필드 키 및 값을 가져옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; conn.hgetall('song')&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;{b'do': b'a deer', b're': b'about a deer', b'mi': b'a note to follow re'}&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;hsetnx()를 사용하여 해당 키가 없는 필드를 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.hsetnx('song', 'fa', 'a note that rhymes with la')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;1&lt;/p&gt;</description>
      <category>nosql</category>
      <category>NoSQL 데이터 저장소</category>
      <author>&amp;amp;$#@</author>
      <guid isPermaLink="true">https://about-design.tistory.com/16</guid>
      <comments>https://about-design.tistory.com/entry/NoSQL-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%80%EC%9E%A5%EC%86%8C#entry16comment</comments>
      <pubDate>Fri, 12 Nov 2021 22:11:35 +0900</pubDate>
    </item>
    <item>
      <title>파이썬코드 SQL 표현식 언어</title>
      <link>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%93%9C-SQL-%ED%91%9C%ED%98%84%EC%8B%9D-%EC%96%B8%EC%96%B4</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코드SQL.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kDte0/btrgWaMVb5c/HuasGzEePVoRT1NqQlrp2k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kDte0/btrgWaMVb5c/HuasGzEePVoRT1NqQlrp2k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kDte0/btrgWaMVb5c/HuasGzEePVoRT1NqQlrp2k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkDte0%2FbtrgWaMVb5c%2FHuasGzEePVoRT1NqQlrp2k%2Fimg.jpg&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코드SQL.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size18&quot;&gt;다음 레벨 업은 SQLlchemy의 SQL 표현 언어입니다. 다양한 작업을 위한 SQL 생성 기능을 소개합니다. 표현식 언어는 하위 엔진 계층보다 더 많은 SQL 방언 차이를 처리합니다. 관계형 데이터베이스 애플리케이션에 편리한 중간 접근 방식이 될 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음은 동물원 테이블을 만들고 채우는 방법입니다. 다시 말하지만, 이것들은 단일 프로그램의 연속된 조각들입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;가져오기 및 연결은 이전과 동일합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import sqlalchemy as sa&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; conn = sa.create_engine('sqlite://')&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;동물원 테이블을 정의하기 위해 SQL 대신 표현식 언어 중 일부를 사용하기 시작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; meta = sa.MetaData()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; zoo = sa.Table('zoo', meta,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;sa.Column('critter', sa.String, primary_key=True),&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;sa.Column('count', sa.Integer),&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;sa.Column('damages', sa.Float)&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;...&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;)&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; meta.create_all(conn)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앞의 예에서 여러 줄 통화의 괄호를 확인하십시오. 표() 메서드의 구조는 표 구조와 일치합니다. 표에 세 개의 열이 있는 것처럼 표() 메서드 호출의 괄호 안에 열()에 대한 세 개의 호출이 있습니다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;한편, zoo는 SQL 데이터베이스 세계와 파이썬 데이터 구조 세계를 연결하는 마법의 객체입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;표현 언어 함수가 더 많은 데이터를 삽입합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;... conn.execute(zoo.insert(('bear', 2, 1000.0)))&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;sqlalchemy.engine.result.ResultProxy object at 0x1017ea910&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.execute(zoo.insert(('weasel', 1, 2000.0)))&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;sqlalchemy.engine.result.ResultProxy object at 0x1017eab10&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.execute(zoo.insert(('duck', 10, 0)))&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;sqlalchemy.engine.result.ResultProxy object at 0x1017eac50&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그런 다음 SELECT 문을 만듭니다(zoo.select()). 예를 들어, SELECT * FROM ZOO가 일반 SQL에서 수행하는 것과 같이 동물원 개체가 나타내는 테이블에서 모든 것을 선택합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; result = conn.execute(zoo.select())&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;마지막으로 다음과 같은 결과를 얻습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; rows = result.fetchall()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; print(rows)&lt;br /&gt;[('bear', 2, 1000.0), ('weasel', 1, 2000.0), ('duck', 10, 0.0)]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;객체-상대 매퍼&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;마지막 섹션에서 zoo 객체는 SQL과 파이썬 간의 중간 수준 연결이었다. SQLlchemy의 최상위 계층에서 ORM(Object-Relational Mapper)은 SQL 표현 언어를 사용하지만 실제 데이터베이스 메커니즘을 보이지 않게 하려고 합니다. 클래스를 정의하면 ORM이 데이터베이스로 데이터를 가져오거나 내보내는 방법을 처리합니다. &quot;객체-관계형 맵퍼&quot;라는 복잡한 구절 뒤에 숨겨진 기본 개념은 여러분이 코드에 있는 객체를 참조할 수 있고, 따라서 관계형 데이터베이스를 사용하면서 파이썬이 동작하는 방식에 근접할 수 있다는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;동물원 클래스를 정의해서 ORM에 연결하겠습니다. 이번에는 SQLite에서 zoo.db 파일을 사용하도록 하여 ORM이 작동했는지 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앞의 두 절에서와 같이, 다음에 나오는 토막글은 실제로 설명으로 구분된 하나의 프로그램입니다. 이해가 안 가더라도 걱정하지 마세요. SQLArchemy 문서에는 모든 세부 사항이 포함되어 있습니다. 이 내용은 복잡해질 수 있습니다. 이 장에서 논의한 접근 방식 중 자신에게 적합한 방법을 결정할 수 있도록 이 작업을 수행하는 데 얼마나 많은 작업이 필요한지 파악해 주시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;초기 가져오기는 동일하지만 이번에는 다른 것도 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import sqlalchemy as sa&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; from sqlalchemy.ext.declarative import declarative_base&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기, 우리는 다음과 같은 연결을 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn = sa.create_engine('sqlite:///zoo.db')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 SQLArchemy의 ORM에 대해 알아보겠습니다. Zoo 클래스를 정의하고 해당 속성을 테이블 열과 연결합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; Base = declarative_base() &amp;gt;&amp;gt;&amp;gt; class Zoo(Base):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;__tablename__ = 'zoo'&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;critter = sa.Column('critter', sa.String, primary_key=True)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;count = sa.Column('count', sa.Integer)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;damages = sa.Column('damages', sa.Float)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;... &amp;nbsp;def __init__(self, critter, count, damages): &lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;self.critter = critter&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;self.count = count&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;self.damages = damages&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;... &amp;nbsp;def __repr__(self): &lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;... &amp;nbsp;return &quot;&amp;lt;Zoo({}, {}, {})&amp;gt;&quot;.format(self.critter, self.count, self.damages)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;다음 행은 데이터베이스와 테이블을 마법처럼 작성합니다.&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; Base.metadata.create_all(conn)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;그런 다음 파이썬 개체를 만들어 데이터를 삽입할 수 있습니다. ORM은 이러한 것들을 관리한다.&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;내부:&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt; &amp;gt;&amp;gt;&amp;gt; first = Zoo('duck', 10, 0.0)&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; second = Zoo('bear', 2, 1000.0)&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; third = Zoo('weasel', 1, 2000.0)&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; first&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;Zoo(duck, 10, 0.0)&amp;gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;다음으로, 우리는 ORM이 우리를 SQL 랜드로 데려가게 합니다. 데이터베이스와 대화하기 위한 세션을 만듭니다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;.&lt;span&gt; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; from sqlalchemy.orm import sessionmaker &amp;gt;&amp;gt;&amp;gt; Session = sessionmaker(bind=conn)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; session = Session() &lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;세션 내에서, 우리는 우리가 만든 세 개의 객체를 데이터베이스에 작성합니다. add() 함수는 하나의 객체를 추가하고 add_all()은 목록을 추가합니다.&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;.&lt;span&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; session.add(first)&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; session.add_all([second, third])&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;마지막으로, 우리는 모든 것을 완료하도록 강요해야 합니다.&lt;/li&gt;
&lt;li&gt;&amp;gt;&amp;gt;&amp;gt; session.commit()&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;효과가 있던가요? 현재 디렉터리에 zoo.db 파일을 만들었습니다. 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;확인할 명령줄 sqlite3 프로그램:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$ sqlite3 zoo.db&lt;br /&gt;SQLite version 3.6.12&lt;br /&gt;Enter &quot;.help&quot; for instructions&lt;br /&gt;Enter SQL statements terminated with a &quot;;&quot; sqlite&amp;gt; .tables&lt;br /&gt;zoo&lt;br /&gt;sqlite&amp;gt; select * from zoo;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;duck|10|0.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;bear|2|1000.0&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;weasel|1|2000.0&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 섹션의 목적은 ORM이 무엇이고 높은 수준에서 어떻게 작동하는지 보여주기 위한 것이다. SQLlchemy의 작성자가 전체 자습서를 작성했습니다. 이 내용을 읽은 후 다음 중 필요에 가장 적합한 수준을 결정하십시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 이전 SQLite 섹션에서와 같이 일반 DB-API&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; SQLArchemy 엔진룸&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; SQLArchemy 표현 언어&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; SQLChemy ORM&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;SQL의 복잡성을 피하기 위해 ORM을 사용하는 것은 자연스러운 선택인 것 같습니다. 하나 쓸까요? 어떤 사람들은 ORM을 피해야 한다고 생각하지만, 다른 사람들은 이 비판이 지나치다고 생각한다. 누가 옳든, ORM은 추상화입니다. 그리고 모든 추상화들은 어느 순간 무너집니다. 그것들은 새어나갑니다. ORM이 원하는 작업을 수행하지 않는 경우 SQL에서 ORM의 작동 방식과 해결 방법을 모두 파악해야 합니다. 인터넷 밈을 빌리려면: 어떤 사람들은 어떤 문제에 직면했을 때, &quot;알아요, ORM을 써야겠어요.&quot;라고 생각합니다. 이제 그들은 두 가지 문제를 안고 있습니다. ORM은 거의 사용하지 않으며 대부분 간단한 애플리케이션에 사용합니다. 응용 프로그램이 그렇게 간단한 경우 스트레이트 SQL(또는 SQL 표현식 언어)을 사용할 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;또는 데이터 집합과 같은 간단한 것을 시도할 수 있습니다. SQL, JSON 및 CSV 스토리지를 위한 간단한 ORM을 제공하는 SQLLchemy는 SQL, JSON 및 CSV 스토리지를 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>파이썬코드</category>
      <category>파이썬코드SQL</category>
      <author>&amp;amp;$#@</author>
      <guid isPermaLink="true">https://about-design.tistory.com/15</guid>
      <comments>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%93%9C-SQL-%ED%91%9C%ED%98%84%EC%8B%9D-%EC%96%B8%EC%96%B4#entry15comment</comments>
      <pubDate>Wed, 6 Oct 2021 07:14:12 +0900</pubDate>
    </item>
    <item>
      <title>파이썬코드 Db-api sqlite mysql</title>
      <link>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%93%9C-Db-api-sqlite-mysql</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코드dbapi.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/628f7/btrgOtMhu83/Atu0ecArg78AQWLITBOZt0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/628f7/btrgOtMhu83/Atu0ecArg78AQWLITBOZt0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/628f7/btrgOtMhu83/Atu0ecArg78AQWLITBOZt0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F628f7%2FbtrgOtMhu83%2FAtu0ecArg78AQWLITBOZt0%2Fimg.jpg&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코드dbapi.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size18&quot;&gt;DB-API&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;API(응용 프로그램 프로그래밍 인터페이스)는 일부 서비스에 액세스하기 위해 호출할 수 있는 함수 집합입니다. DB-API는 관계형 데이터베이스에 액세스하기 위한 Python의 표준 API입니다. 이를 사용하여 각 데이터베이스에 대해 별도의 프로그램을 작성하는 대신 여러 종류의 관계형 데이터베이스에서 작동하는 단일 프로그램을 작성할 수 있습니다. 그것은 자바의 JDBC나 펄의 dbi와 비슷하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;주요 기능은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;연결하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데이터베이스에 연결합니다. 사용자 이름, 암호, 서버 주소 등의 인수를 포함할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;커서가 있는&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;쿼리를 관리할 커서 개체를 만듭니다. 사형 집행 집행 집행 집행 집행 집행 집행 집행 집행 집행 집행 집행 집행 집행 집행 집행 집행 집행.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데이터베이스에 대해 하나 이상의 SQL 명령을 실행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;fetchone() , fetchmany() 및 fetchall() 실행에서 결과를 가져옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음 절의 Python 데이터베이스 모듈은 DB-API를 준수하며, 종종 확장과 세부 사항의 일부 차이점이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;SQLite&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;SQLite는 우수하고 가벼운 오픈 소스 관계형 데이터베이스입니다. 표준 파이썬 라이브러리로 구현되며 데이터베이스를 일반 파일에 저장합니다. 이 파일들은 ma ch chines 및 운영 체제 간에 이동 가능하므로 SQLite는 단순한 관계형 데이터베이스 애플리케이션을 위한 매우 휴대성이 뛰어난 솔루션이 됩니다. MySQL 또는 Postgre만큼 완벽한 기능은 아닙니다.SQL은 지원하지만 여러 명의 동시 사용자를 관리합니다. 웹 브라우저, 스마트폰 및 기타 응용 프로그램은 SQLite를 내장 데이터베이스로 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사용 또는 작성할 로컬 SQLite 데이터베이스 파일에 대한 연결()로 시작합니다. 이 파일은 부모가 다른 서버에 있는 테이블로 사용하는 디렉토리와 같은 데이터베이스와 동일합니다. 특수 문자열 ':memory:'는 메모리에만 데이터베이스를 만듭니다. 이 문자열은 빠르고 테스트에 유용하지만 프로그램이 종료되거나 컴퓨터가 다운되면 데이터가 손실됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음 예로, 번창하는 길가 애완 동물원의 사업을 관리하기 위해 Enterprise.db라는 데이터베이스와 테이블 동물원(table zoo)을 만들어 보겠습니다. 테이블 열은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;생물의 가변 길이 문자열 및 기본 키&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;수를 세다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 동물에 대한 현재 재고의 정수 개수&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;손해&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;현재 동물과 인간의 상호작용으로 인한 손실의 액수입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import sqlite3&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; conn = sqlite3.connect('enterprise.db') &amp;gt;&amp;gt;&amp;gt; curs = conn.cursor()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; curs.execute('''CREATE TABLE zoo&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;(critter VARCHAR(20) PRIMARY KEY,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;count INT,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;damages FLOAT)''')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;lt;sqlite3.Cursor object at 0x1006a22d0&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Python의 삼중따옴표는 SQL 쿼리와 같은 긴 문자열을 만들 때 유용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 동물원에 동물을 추가하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; curs.execute('INSERT INTO zoo VALUES(&quot;duck&quot;, 5, 0.0)')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;sqlite3.Cursor object at 0x1006a22d0&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; curs.execute('INSERT INTO zoo VALUES(&quot;bear&quot;, 2, 1000.0)')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;sqlite3.Cursor object at 0x1006a22d0&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;자리 표시자를 사용하여 데이터를 더 안전하게 삽입할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; ins = 'INSERT INTO zoo (critter, count, damages) VALUES(?, ?, ?)'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; curs.execute(ins, ('weasel', 1, 2000.0))&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;sqlite3.Cursor object at 0x1006a22d0&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이번에는 SQL에 물음표 3개를 사용하여 3개의 값을 삽입한 다음 이 3개의 값을 목록으로 실행() 함수에 전달할 계획임을 나타냅니다. 보험 계약자는 인용과 같은 지루한 세부 사항을 처리합니다. SQL 주입으로부터 사용자를 보호합니다. SQL 주입은 웹에서 일반적으로 시스템에 악의적인 SQL 명령을 삽입하는 외부 공격입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제, 우리가 우리의 모든 동물들을 다시 꺼낼 수 있는지 봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; curs.execute('SELECT * FROM zoo') &amp;lt;sqlite3.Cursor object at 0x1006a22d0&amp;gt; &amp;gt;&amp;gt;&amp;gt; rows = curs.fetchall()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; print(rows)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;[('duck', 5, 0.0), ('bear', 2, 1000.0), ('weasel', 1, 2000.0)]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다시 불러오죠. 하지만 숫자대로 정렬합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; curs.execute('SELECT * from zoo ORDER BY count')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;sqlite3.Cursor object at 0x1006a22d0&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; curs.fetchall()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;[('weasel', 1, 2000.0), ('bear', 2, 1000.0), ('duck', 5, 0.0)]&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이봐, 우린 내림차순으로 원했어.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; curs.execute('SELECT * from zoo ORDER BY count DESC')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;sqlite3.Cursor object at 0x1006a22d0&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; curs.fetchall()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;[('duck', 5, 0.0), ('bear', 2, 1000.0), ('weasel', 1, 2000.0)]&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;어떤 종류의 동물이 가장 비용이 많이 드나요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; curs.execute('''SELECT * FROM zoo WHERE&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;damages = (SELECT MAX(damages) FROM zoo)''')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;sqlite3.Cursor object at 0x1006a22d0&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; curs.fetchall()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;[('weasel', 1, 2000.0)]&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여러분은 곰들이라고 생각했을 것입니다. 항상 실제 데이터를 확인하는 것이 가장 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;SQLite를 떠나기 전에 정리를 해야 합니다. 연결과 커서를 연 경우 작업이 완료되면 커서를 닫아야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; curs.close()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.close()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;MySQL&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;MySQL은 매우 널리 사용되는 오픈 소스 관계형 데이터베이스입니다. SQLite와 달리 실제 서버이므로 클라이언트가 네트워크상의 다른 장치에서 액세스할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;MysqlDB는 가장 인기 있는 MySQL 드라이버였지만 아직 파이썬 3으로 포팅되지는 않았다. 표 8-3에는 파이썬에서 MySQL에 액세스하는 데 사용할 수 있는 드라이버가 나와 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;표 8-3. MySQL 드라이버&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;MySQL Connector PYMySQL&lt;br /&gt;oursql&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Link&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;a href=&quot;http://bit.ly/mysql-cpdg&quot;&gt;http://bit.ly/mysql-cpdg&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;a href=&quot;https://github.com/petehunt/&quot;&gt;https://github.com/petehunt/&lt;/a&gt; PyMySQL/&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;a href=&quot;http://pythonhosted.org/oursql/&quot;&gt;http://pythonhosted.org/oursql/&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Pypi package Import as&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;mysql-connector- mysql.connector python&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Notes&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Requires the MySQL C client libraries.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;PostgreSQl&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;링크&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;http://bit.ly/mysql-cpdg&quot;&gt;http://bit.ly/mysql-cpdg&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://github.com/petehunt/&quot;&gt;https://github.com/petehunt/&lt;/a&gt; PyMySQL/&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;http://pythonhosted.org/oursql/&quot;&gt;http://pythonhosted.org/oursql/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Pypi 패키지 가져오기 위치&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;mysql-sql.mysql.mysql&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;메모들&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;MySQL C 클라이언트 라이브러리가 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Pymysql usql&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;pymysql&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;usql&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;포스트그레SQL은 MySQL보다 여러 면에서 더 많은 이점을 제공하는 완전한 기능의 오픈 소스 관계형 데이터베이스입니다. 표 8-4는 Python 드라이버에 액세스하는 데 사용할 수 있는 드라이버를 보여줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;포스트그레SQL 드라이버&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;가장 인기 있는 드라이버는 psycopg2이지만 Postgre를 설치해야 한다.SQL 클라이언트 라이브러리.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;SQLArchemy&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;SQL은 모든 관계형 데이터베이스에 대해 완전히 동일하지는 않으며 DB-API는 지금까지만 지원합니다. 각 데이터베이스는 그 특징과 철학을 반영하는 특정한 방언을 구현한다. 많은 도서관들이 이런 차이점들을 어떻게든 메우려고 노력한다. 가장 널리 사용되는 데이터베이스 간 파이썬 라이브러리는 SQLArchemy입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그것은 표준 도서관에는 없지만, 많은 사람들에 의해 잘 알려져 있고 사용되고 있습니다. 다음 명령을 사용하여 시스템에 설치할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;$ pip install sqlalchemy&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 가장 낮은 수준은 데이터베이스 연결 풀, SQL 명령 실행 및 결과 반환을 처리합니다. DB-API에 가장 가깝습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 다음은 SQL 표현 언어인 Pythonic SQL Builder입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 가장 높은 계층은 SQL 식을 사용하는 ORM(Object Relational Model) 계층입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;언어 및 관계형 데이터 구조와 응용 프로그램 코드를 바인딩합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;계속 진행하면서 이러한 수준의 용어가 무엇을 의미하는지 이해하게 될 것입니다. SQLArchemy는 이전 절에 설명된 데이터베이스 드라이버와 함께 작동합니다. 드라이버를 가져올 필요가 없습니다. SQLLCemy에 제공한 초기 연결 문자열이 드라이버를 결정합니다. 이 문자열은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i&gt;dialect &lt;/i&gt;+ &lt;i&gt;driver &lt;/i&gt;:// &lt;i&gt;user &lt;/i&gt;: &lt;i&gt;password &lt;/i&gt;@ &lt;i&gt;host &lt;/i&gt;: &lt;i&gt;port &lt;/i&gt;/ &lt;i&gt;dbname &lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 문자열에 입력한 값은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사투리를 쓰다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데이터베이스 유형&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;운전사의&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해당 데이터베이스에 사용할 특정 드라이버&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사용자 및 암호&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데이터베이스 인증 문자열&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;숙주와 항구&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데이터베이스 서버의 위치(: 이 서버의 표준 포트가 아닌 경우에만 필요)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;dbname&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;서버에서 처음 연결할 데이터베이스&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Table 8-5 lists the dialects and drivers.&lt;br /&gt;&lt;i&gt;Table 8-5. SQLAlchemy connection &lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;dialect&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;sqlite&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;mysql&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;mysql&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;mysql&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;postgresql&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;postgresql&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;driver&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;pysqlite (or omit) mysqlconnector pymysql&lt;br /&gt;oursql psycopg2 pypostgresql&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;엔진 층&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;먼저, 기본 DB- API 기능보다 조금 더 낮은 수준의 SQLlchemy를 사용해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;파이썬에 이미 내장된 SQLite를 사용해 보겠습니다. SQLite에 대한 연결 문자열이 호스트, 포트, 사용자 및 암호를 건너뜁니다. dbname은 데이터베이스를 저장하는 데 사용할 파일을 SQLite에 알려줍니다. dbname을 생략하면 SQLite는 메모리에 데이터베이스를 작성합니다. dbname이 슬래시(/)로 시작하는 경우 컴퓨터의 절대 파일 이름입니다(예: Windows의 C:\\). 그렇지 않으면 현재 디렉토리와 관련이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음 세그먼트는 설명을 위해 여기에서 분리된 한 프로그램의 모든 부분입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;먼저 필요한 것을 가져오셔야 합니다. 다음은 문자열 sa를 사용하여 SQLLCemy 메서드를 참조할 수 있는 가져오기 별칭의 예입니다. 주로 sa가 sqlalchemy보다 훨씬 쉽게 입력되기 때문에 이 작업을 수행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import sqlalchemy as sa&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데이터베이스에 연결하고 메모리에 데이터베이스에 대한 저장소 만들기(인수 문자열)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;'sqlite://:memory:'도 작동합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; conn = sa.create_engine('sqlite://')&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음과 같은 세 개의 열로 구성된 zoo라는 데이터베이스 테이블을 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; conn.execute('''CREATE TABLE zoo&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;lt;sqlalchemy.engine.result.ResultProxy object at 0x1017efb10&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;conn.execute()를 실행하면 ResultProxy라는 SQLLCemy 개체를 반환합니다. 너는 곧 그것을 어떻게 해야 할지 알게 될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그나저나, 데이터베이스 표를 만들어 본 적이 없다면 축하드립니다. 버킷 리스트에서 하나를 체크하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 비어 있는 새 테이블에 세 가지 데이터 세트를 삽입합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; ins = 'INSERT INTO zoo (critter, count, damages) VALUES (?, ?, ?)'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.execute(ins, 'duck', 10, 0.0)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;sqlalchemy.engine.result.ResultProxy object at 0x1017efb50&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.execute(ins, 'bear', 2, 1000.0)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;sqlalchemy.engine.result.ResultProxy object at 0x1017ef090&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; conn.execute(ins, 'weasel', 1, 2000.0)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;sqlalchemy.engine.result.ResultProxy object at 0x1017ef450&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그런 다음 데이터베이스에 방금 입력한 모든 내용을 요청하십시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; rows = conn.execute('SELECT * FROM zoo')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;SQLArchemy에서 행은 목록이 아니라 직접 인쇄할 수 없는 특별한 ResultProxy입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; print(rows)&lt;br /&gt;&amp;lt;sqlalchemy.engine.result.ResultProxy object at 0x1017ef9d0&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그러나 목록처럼 반복할 수 있으므로 한 번에 다음 행을 얻을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; for row in rows: ... print(row) ...&lt;br /&gt;('duck', 10, 0.0) ('bear', 2, 1000.0) ('weasel', 1, 2000.0)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앞에서 보신 SQLite DB-API 예제와 거의 동일합니다. 한 가지 장점은 맨 위에 있는 데이터베이스 드라이버를 가져올 필요가 없다는 것입니다. SQLArchemy는 연결 문자열에서 이를 알아냈습니다. 연결 문자열을 변경하면 이 코드가 다른 유형의 데이터베이스로 이동될 수 있습니다. 또 다른 장점은 SQLlchemy의 연결 풀링이며, 이 풀링은 설명서 사이트에서 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Db-api</category>
      <category>MySQL</category>
      <category>SQLite</category>
      <category>파이썬코드</category>
      <author>&amp;amp;$#@</author>
      <guid isPermaLink="true">https://about-design.tistory.com/14</guid>
      <comments>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%93%9C-Db-api-sqlite-mysql#entry14comment</comments>
      <pubDate>Mon, 4 Oct 2021 22:12:04 +0900</pubDate>
    </item>
    <item>
      <title>파이썬코드 피클을 사용하여 직렬화</title>
      <link>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%93%9C-%ED%94%BC%ED%81%B4%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EC%A7%81%EB%A0%AC%ED%99%94</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코드 피클을 사용하여 직렬화.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcze8T/btrgB568cRy/QYSfTleuDmQ4J9SzmPAO50/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcze8T/btrgB568cRy/QYSfTleuDmQ4J9SzmPAO50/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcze8T/btrgB568cRy/QYSfTleuDmQ4J9SzmPAO50/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcze8T%2FbtrgB568cRy%2FQYSfTleuDmQ4J9SzmPAO50%2Fimg.jpg&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코드 피클을 사용하여 직렬화.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&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 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;데이터 구조를 파일에 저장하는 것을 직렬화라고 합니다. JSON과 같은 형식을 사용하려면 파이썬 프로그램의 모든 데이터 유형을 직렬화하기 위해 일부 사용자 지정 변환기가 필요할 수 있습니다. 파이썬은 특별한 바이너리 형식으로 객체를 저장하고 복원할 수 있는 피클 모듈을 제공한다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;날짜/시간 객체를 만났을 때 JSON이 어떻게 정신을 잃었는지 기억하십니까? 피클에 대한 확률 없음:&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import pickle&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; import datetime&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; now1 = datetime.datetime.utcnow()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; pickled = pickle.dumps(now1)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; now2 = pickle.loads(pickled)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; now1&lt;br /&gt;datetime.datetime(2014, 6, 22, 23, 24, 19, 195722) &amp;gt;&amp;gt;&amp;gt; now2&lt;br /&gt;datetime.datetime(2014, 6, 22, 23, 24, 19, 195722)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;피클은 당신의 클래스나 오브젝트에서도 작동한다. 문자열로 처리될 때 문자열 'tiny'를 반환하는 Tiny라는 작은 클래스를 정의합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import pickle&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; class Tiny():&lt;br /&gt;... def __str__(self): ... return 'tiny' ...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; obj1 = Tiny()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt;&amp;gt; obj1&lt;br /&gt;&amp;lt;__main__.Tiny object at 0x10076ed10&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; str(obj1)&lt;br /&gt;'tiny'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; pickled = pickle.dumps(obj1)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; pickled b'\x80\x03c__main__\nTiny\nq\x00)\x81q\x01.' &amp;gt;&amp;gt;&amp;gt; obj2 = pickle.loads(pickled)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; obj2&lt;br /&gt;&amp;lt;__main__.Tiny object at 0x10076e550&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; str(obj2)&lt;br /&gt;'tiny'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;절인 것은 물체 obj1로부터 만들어진 절인 2진법 끈이다. 우리는 그것을 객체 obj2로 다시 변환하여 obj1의 복사본을 만들었습니다. 덤프()를 사용하여 파일에 피클하고 로드()를 사용하여 파일에서 피클을 해제합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;피클은 파이썬 개체를 만들 수 있기 때문에 이전 섹션에서 설명한 것과 동일한 보안 경고 잉그가 적용됩니다. 신뢰하지 않는 것을 풀지 마라.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;구조화된 이진 파일&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;일부 파일 형식은 특정 데이터 구조를 저장하기 위해 설계되었지만, 규격 데이터베이스도 NoSQL 데이터베이스도 아니다. 다음 절에서는 그 중 일부를 제시합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;스프레드시트&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;스프레드시트, 특히 Microsoft Excel은 널리 사용되는 이진 데이터 형식입니다. 스프레드시트를 CSV 파일에 저장할 수 있는 경우 앞서 설명한 표준 CSV 모듈을 사용하여 스프레드시트를 읽을 수 있습니다. 이진 xls 파일이 있는 경우 xlrd는 읽고 쓰기를 위한 타사 패키지입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;HDF5&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;HDF5는 다차원 또는 계층적 숫자 데이터를 위한 이진 데이터 형식입니다. 대용량 데이터셋(기가바이트 ~ 테라바이트)에 대한 빠른 랜덤 액세스가 일반적인 요구 사항인 과학 분야에서 주로 사용됩니다. 어떤 경우에는 HDF5가 데이터베이스의 좋은 대안이 될 수 있지만, 어떤 이유로 HDF5는 비즈니스 세계에서 거의 알려져 있지 않습니다. 충돌하는 쓰기로부터 데이터베이스를 보호할 필요가 없는 WORM(Write Once/Read Many) 애플리케이션에 가장 적합합니다. 다음은 유용한 몇 가지 모듈입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;h5py는 완전 저수준 인터페이스입니다. 설명서 및 코드를 읽습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;PyTables는 데이터베이스와 유사한 기능을 가진 좀 더 높은 레벨입니다. 설명서와 코드를 읽습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;이 두 가지 모두 부록 C에서 파이썬의 과학적 적용 측면에서 논의된다. 여기서 말하는 것은 대량의 데이터를 저장 및 검색해야 하는 경우 일반적인 데이터베이스 솔루션뿐만 아니라 외부 솔루션을 고려할 의사가 있는 경우입니다. 좋은 예는 HDF5 형식의 다운로드 가능한 노래 데이터가 있는 Million Song 데이터 세트입니다&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;관계형 데이터베이스&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;관계형 데이터베이스는 약 40년 밖에 되지 않았지만 컴퓨팅 세계 어디에서나 볼 수 있습니다. 여러분은 거의 틀림없이 한 번 혹은 여러 번 그들을 상대해야 할 것입니다. 그러면 다음과 같은 혜택을 누릴 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;bull; 여러 동시 사용자의 데이터 액세스&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;bull; 해당 사용자에 의한 손상 방지&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;bull; 효율적인 데이터 저장 및 검색 방법&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;bull; 스키마에 의해 정의되고 제약에 의해 제한되는 데이터&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;bull; 다양한 유형의 데이터에 걸친 관계를 찾기 위한 결합&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;bull; 선언적(필수적) 질의 언어: SQL(구조화된 쿼리 언어)&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;이것들은 서로 다른 종류의 데이터들 사이의 관계를 표의 형태로 보여주기 때문에 관계형이라고 불린다. 예를 들어, 앞의 메뉴 예에서는 각 품목과 가격 사이에 관계가 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;테이블은 스프레드시트와 유사한 행과 열의 그리드입니다. 테이블을 만들려면 테이블 이름을 지정하고 열의 순서, 이름 및 유형을 지정하십시오. 결측 데이터(null이라고 함)를 허용하도록 열을 정의할 수 있지만 각 행에는 동일한 열이 있습니다. 메뉴 예제에서는 판매되는 각 품목에 대해 하나의 행으로 테이블을 만들 수 있습니다. 각 품목에는 가격에 대한 열을 포함하여 동일한 열이 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;열 또는 열 그룹은 일반적으로 테이블의 기본 키이며 해당 값은 테이블에서 고유해야 합니다. 이렇게 하면 테이블에 동일한 데이터를 두 번 이상 추가할 수 없습니다. 이 키는 쿼리 중 빠른 검색을 위해 인덱싱됩니다. 색인은 책 색인처럼 작동하기 때문에 특정 행을 빨리 찾을 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;각 테이블은 디렉토리 내의 파일처럼 상위 데이터베이스 내에 있습니다. 두 단계의 위계질서가 상황을 조금 더 잘 정리하도록 도와줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;예, 데이터베이스라는 단어는 서버, 테이블 컨테이너 및 여기에 저장된 데이터로 여러 가지 방법으로 사용됩니다. 모든 항목을 동시에 참조하는 경우 데이터베이스 서버, 데이터베이스 및 데이터라고 부르는 것이 도움이 될 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;키가 아닌 일부 열 값으로 행을 찾으려면 해당 열에 보조 인덱스를 정의합니다. 그렇지 않은 경우, 데이터베이스 서버는 테이블 검색을 수행해야 합니다. 즉, 일치하는 열 값을 찾기 위해 모든 행을 무차별적으로 검색합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;테이블은 외부 키를 사용하여 서로 연관될 수 있으며 열 값은 이러한 키에 변형될 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;SQL&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;SQL은 API나 프로토콜이 아니라 선언적 언어입니다. 어떻게 하느냐 보다는 원하는 것을 말합니다. 이것은 관계형 데이터베이스의 보편적인 언어입니다. SQL 쿼리는 클라이언트가 데이터베이스 서버로 보내는 텍스트 문자열로, 이 문자열로 수행할 작업을 결정합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;다양한 SQL 표준 정의가 존재했지만, 모든 데이터베이스 공급업체는 자체적인 수정과 확장을 추가하여 많은 SQL 방언들을 만들어냈다. 데이터를 관계형 데이터베이스에 저장하면 SQL이 어느 정도 휴대성을 제공합니다. 그러나 방언 및 운영상의 차이로 인해 데이터를 다른 유형의 데이터베이스로 이동하기가 어려울 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;SQL 문에는 두 가지 주요 범주가 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;DDL(데이터 정의 언어)&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;테이블, 데이터베이스 및 사용에 대한 작성, 삭제, 제약 조건 및 사용 권한 처리&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;DML(데이터 조작 언어)&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;데이터 삽입, 선택, 업데이트 및 삭제 처리 표 8-1은 기본 SQL DDL 명령을 나열합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;표 8-1. 기본 SQL DDL 명령&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;Operation&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;Create a database&lt;br /&gt;Select current database&lt;br /&gt;Delete a database and its tables Create a table&lt;br /&gt;Delete a table&lt;br /&gt;Remove all rows from a table&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;SQL pattern&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;CREATE DATABASE &lt;i&gt;dbname&lt;br /&gt;&lt;/i&gt;USE &lt;i&gt;dbname&lt;br /&gt;&lt;/i&gt;DROP DATABASE &lt;i&gt;dbname &lt;/i&gt;CREATE TABLE &lt;i&gt;tbname &lt;/i&gt;( &lt;i&gt;coldefs &lt;/i&gt;) DROP TABLE &lt;i&gt;tbname&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;TRUNCATE TABLE &lt;i&gt;tbname&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;SQL example&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;CREATE DATABASE d&lt;br /&gt;USE d&lt;br /&gt;DROP DATABASE d&lt;br /&gt;CREATE TABLE t (id INT, count INT) DROP TABLE t&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;TRUNCATE TABLE t&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;왜 대문자는 다 쓰죠? SQL은 대소문자를 구분하지 않지만 코드 검사에서 키워드를 SHOUT하는 것이 전통입니다. 열 이름과 구별하기 위해 사용합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;관계형 데이터베이스의 주요 DML 작업은 흔히 CRUD 약어로 알려져 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;bull; SQL INSERT 문을 사용하여 작성&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;bull; SELECT를 사용하여 읽기&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;bull; UPDATE를 사용하여 업데이트&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;bull; DELETE를 사용하여 삭제&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;표 8-2는 SQL DML에 사용할 수 있는 명령을 살펴본다. 표 8-2. 기본 SQL DML 명령&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;Operation&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;Add a row&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;Select all rows and columns Select all rows, some columns&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;Select some rows, some columns&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;Change some rows in a column Delete some rows&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;SQL pattern&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;INSERT INTO &lt;i&gt;tbname &lt;/i&gt;VALUES( ...)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;SELECT * FROM &lt;i&gt;tbname &lt;/i&gt;SELECT &lt;i&gt;cols &lt;/i&gt;FROM &lt;i&gt;tbname&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;SELECT &lt;i&gt;cols &lt;/i&gt;FROM &lt;i&gt;tbname &lt;/i&gt;WHERE &lt;i&gt;condition&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;UPDATE &lt;i&gt;tbname &lt;/i&gt;SET &lt;i&gt;col &lt;/i&gt;= &lt;i&gt;value &lt;/i&gt;WHERE &lt;i&gt;condition&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;DELETE FROM &lt;i&gt;tbname &lt;/i&gt;WHERE &lt;i&gt;condition&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;SQL example&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;INSERT INTO t VALUES(7, 40)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;SELECT * FROM t&lt;br /&gt;SELECT id, count FROM t&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;SELECT id, count from t WHERE count &amp;gt; 5 AND id = 9&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;UPDATE t SET count=3 WHERE id=5&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;DELETE FROM t WHERE count &amp;lt;= 10 OR id = 16&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>파이썬코드</category>
      <category>파이썬코드직렬화</category>
      <author>&amp;amp;$#@</author>
      <guid isPermaLink="true">https://about-design.tistory.com/13</guid>
      <comments>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%93%9C-%ED%94%BC%ED%81%B4%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EC%A7%81%EB%A0%AC%ED%99%94#entry13comment</comments>
      <pubDate>Sun, 3 Oct 2021 23:34:48 +0900</pubDate>
    </item>
    <item>
      <title>파이썬코드 xml</title>
      <link>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%93%9C-xml</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코드XML.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBfcLk/btrgFTxfrSQ/KzA82t2p1mEXYSBKGeslkk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBfcLk/btrgFTxfrSQ/KzA82t2p1mEXYSBKGeslkk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBfcLk/btrgFTxfrSQ/KzA82t2p1mEXYSBKGeslkk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBfcLk%2FbtrgFTxfrSQ%2FKzA82t2p1mEXYSBKGeslkk%2Fimg.jpg&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코드XML.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;XML&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분된 파일은 행(줄)과 열(줄 안의 필드)의 두 차원만 전달합니다. 프로그램 간에 데이터 구조를 교환하려면 계층, 시퀀스, 세트 및 기타 구조를 텍스트로 인코딩하는 방법이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XML은 법안에 가장 적합한 마크업 형식이다. 이 샘플 menu.xml 파일에서와 같이 태그를 사용하여 데이터를 구분합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;menu&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;breakfast hours=&quot;7-11&quot;&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;item price=&quot;$6.00&quot;&amp;gt;breakfast burritos&amp;lt;/item&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;item price=&quot;$4.00&quot;&amp;gt;pancakes&amp;lt;/item&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/breakfast&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;lunch hours=&quot;11-3&quot;&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;item price=&quot;$5.00&quot;&amp;gt;hamburger&amp;lt;/item&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;/lunch&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;dinner hours=&quot;3-10&quot;&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;item price=&quot;8.00&quot;&amp;gt;spaghetti&amp;lt;/item&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;/dinner&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;/menu&amp;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;다음은 XML의 몇 가지 중요한 특성입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; 태그는 &amp;lt; 문자로 시작합니다. 이 샘플의 태그는 메뉴, 아침, 점심, 그리고&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;bull; 공백은 무시됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; 일반적으로 &amp;lt;메뉴&amp;gt;와 같은 시작 태그 다음에 다른 내용이 나온 다음 &amp;lt;/menu&amp;gt;와 같은 최종 일치 끝 태그가 뒤따른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; 태그는 모든 수준으로 다른 태그에 중첩될 수 있습니다. 이 예에서 항목 태그는 아침, 점심 및 저녁 태그의 하위 항목이며, 차례로 메뉴의 하위 항목입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; 시작 태그 내에서 선택적 속성이 발생할 수 있습니다. 이 예에서 가격은 품목의 속성입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; 태그에는 값이 포함될 수 있습니다. 이 예제에서는 두 번째 아침 식사용 팬케이크와 같은 값이 각 품목에 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; 어떤 물건에 값이나 자식 태그가 없는 경우, 그것은 &amp;lt;thing&amp;gt;과 같이 시작 태그와 끝 태그가 아닌 &amp;lt;thing/&amp;gt;와 같은 닫힘 각도 괄호 바로 앞에 슬래시를 포함시켜 단일 태그로 표현할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; 데이터를 저장할 위치(속성, 가치, 하위 태그)를 선택하는 것은 다소 어렵다. 예를 들어, 마지막 항목 태그를 &amp;lt;품목 가격=&quot;$8.00&quot; 식품=&quot;food&quot;/&quot;&amp;gt;으로 작성할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XML은 종종 데이터 피드 및 메시지에 사용되며 RSS 및 Atom과 같은 보조 형식을 가집니다. 일부 산업에는 재무 분야와 같은 많은 전문 XML 형식이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XML의 위버 유연성은 접근 방식과 기능이 다른 여러 파이썬 라이브러리에 영감을 주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬에서 XML을 구문 분석하는 가장 간단한 방법은 ElementTree를 사용하는 것입니다. 다음은 menu.xml 파일을 구문 분석하고 태그와 속성을 인쇄하는 데 사용할 수 있는 작은 프로그램입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;gt;&amp;gt;&amp;gt; import xml.etree.ElementTree as et&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; tree = et.ElementTree(file='menu.xml')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; root = tree.getroot()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; root.tag&lt;br /&gt;'menu'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; for child in root:&lt;br /&gt;... print('tag:', child.tag, 'attributes:', child.attrib) &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;... for grandchild in child:&lt;br /&gt;... print('\ttag:', grandchild.tag, 'attributes:', grandchild.attrib) ...&lt;br /&gt;tag: breakfast attributes: {'hours': '7-11'}&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;tag: item attributes: {'price': '$6.00'}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;tag: item attributes: {'price': '$4.00'}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;tag: lunch attributes: {'hours': '11-3'}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;tag: item attributes: {'price': '$5.00'}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;tag: dinner attributes: {'hours': '3-10'}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tag: item attributes: {'price': '8.00'} &amp;gt;&amp;gt;&amp;gt; len(root) &lt;i&gt;# number of menu sections &lt;/i&gt;3&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; len(root[0]) &lt;i&gt;# number of breakfast items &lt;/i&gt;2&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중첩 목록의 각 요소에 대해 태그는 태그 문자열이고 속성은 해당 특성의 사전입니다. 원소트리는 XML에서 파생된 데이터를 검색하고, 데이터를 mod if ifing하고, XML 파일을 쓰는 다른 많은 방법을 가지고 있습니다. 원소트리 설명서에 자세한 내용이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 표준 파이썬 XML 라이브러리는 다음을 포함한다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;xml.dom&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JavaScript 개발자에게 익숙한 DOM(Document Object Model)은 웹 문서를 계층 구조로 나타냅니다. 이 모듈은 전체 XML 파일을 메모리에 로드하고 모든 항목에 동일하게 액세스할 수 있도록 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;xml.sax&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XML용 단순 API 또는 SAX는 XML을 즉시 구문 분석하므로 모든 것을 한 번에 메모리에 로드할 필요가 없습니다. 따라서 매우 큰 XML 스트림을 처리해야 하는 경우 이 방법을 선택하는 것이 좋습니다.&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;HTML&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엄청난 양의 데이터가 웹의 기본 문서 형식인 HTML(Hypertext Markup Language)로 저장된다. 문제는 HTML 규칙을 따르지 않는 경우가 너무 많아서 구문 분석하기가 어려울 수 있다는 것입니다. 또한 HTML의 대부분은 데이터를 교환하기 보다는 출력을 포맷하기 위한 것이다. 이 장은 꽤 잘 정의된 데이터 형식을 설명하기 위한 것이기 때문에 HTML에 대한 논의를 다음포스팅에서 분리했습니다.&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;JSON&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트 객체 표기법(JSON)은 그것의 자바스크립트 기원을 넘어 매우 대중적인 데이터 교환 형식이 되었다. JSON 형식은 자바스크립트의 하위 집합이며 종종 합법적인 파이썬 구문이기도 하다. Python에 매우 적합하기 때문에 프로그램 간의 데이터 교환에 적합합니다. 웹 개발을 위한 JSON의 예는 다음포스팅에서 많이 볼 수 있습니다.&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;XML 모듈의 다양성과 달리 JSON 모듈은 단 하나이며, gettable 이름은 json입니다. 이 프로그램은 데이터를 JSON 문자열로 인코딩(덤프)하고 JSON 문자열을 데이터로 다시 디코딩(로드)합니다. 다음 예에서는 이전 XML 예제의 데이터를 포함하는 파이썬 데이터 스트럭 튜어를 구축해 보겠습니다.&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;&amp;gt;&amp;gt;&amp;gt;menu=\&lt;br /&gt;... {&lt;br /&gt;... &quot;breakfast&quot;: {&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &quot;lunch&quot; : {&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;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;... &quot;dinner&quot;: {&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;...&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;&quot;hours&quot;: &quot;7-11&quot;,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;items&quot;: {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;},&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;breakfast burritos&quot;: &quot;$6.00&quot;,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;pancakes&quot;: &quot;$4.00&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;hours&quot;: &quot;11-3&quot;,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;items&quot;: {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&quot;hamburger&quot;: &quot;$5.00&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;hours&quot;: &quot;3-10&quot;,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;items&quot;: {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&quot;spaghetti&quot;: &quot;$8.00&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;} }&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 다음 덤프()를 사용하여 데이터 구조(메뉴)를 JSON 문자열(메뉴_json)로 인코딩합니다.&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;&amp;gt;&amp;gt;&amp;gt; import json&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; menu_json = json.dumps(menu)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; menu_json&lt;br /&gt;'{&quot;dinner&quot;: {&quot;items&quot;: {&quot;spaghetti&quot;: &quot;$8.00&quot;}, &quot;hours&quot;: &quot;3-10&quot;}, &quot;lunch&quot;: {&quot;items&quot;: {&quot;hamburger&quot;: &quot;$5.00&quot;}, &quot;hours&quot;: &quot;11-3&quot;}, &quot;breakfast&quot;: {&quot;items&quot;: {&quot;breakfast burritos&quot;: &quot;$6.00&quot;, &quot;pancakes&quot;: &quot;$4.00&quot;}, &quot;hours&quot;: &quot;7-11&quot;}}'&lt;span&gt;&amp;nbsp;&lt;/span&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;이제 로드()를 사용하여 JSON 문자열 메뉴_json을 파이썬 데이터 구조(메뉴2)로 다시 전환해 보겠습니다.&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;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; menu2 = json.loads(menu_json)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; menu2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;{'breakfast': {'items': {'breakfast burritos': '$6.00', 'pancakes':&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'$4.00'}, 'hours': '7-11'}, 'lunch': {'items': {'hamburger': '$5.00'},&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'hours': '11-3'}, 'dinner': {'items': {'spaghetti': '$8.00'}, 'hours': '3-10'}}&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;menu와 menu2는 둘 다 키와 값이 같은 사전입니다. 표준 사전에서 항상 그렇듯이 키를 받는 순서도 다릅니다.&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;여기에 설명된 대로 날짜/시간( 다음포스팅의 &quot;달력 및 시계&quot;에 자세히 나와 있음)과 같은 개체를 포함하여 일부 개체를 인코딩하거나 디코딩하는 동안 예외가 발생할 수 있습니다.&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;&amp;gt;&amp;gt;&amp;gt; import datetime&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; now = datetime.datetime.utcnow()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; now&lt;br /&gt;datetime.datetime(2013, 2, 22, 3, 49, 27, 483336)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; json.dumps(now)&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;&lt;i&gt;# ... (deleted stack trace to save trees)&lt;br /&gt;&lt;/i&gt;TypeError: datetime.datetime(2013, 2, 22, 3, 49, 27, 483336) is not JSON serializable&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제는 JSON 표준에서 날짜 또는 시간 유형을 정의하지 않기 때문에 발생할 수 있습니다. 사용자가 날짜 또는 시간 유형을 처리하는 방법을 정의해야 합니다. 날짜 시간을 문자열 또는 epoch 값과 같이 JSON이 이해하는 것으로 변환할 수 있습니다(다음포스팅에 나와 있습니다).&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;&amp;gt;&amp;gt;&amp;gt; now_str = str(now)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; json.dumps(now_str)&lt;br /&gt;'&quot;2013-02-22 03:49:27.483336&quot;'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; from time import mktime&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; now_epoch = int(mktime(now.timetuple())) &amp;gt;&amp;gt;&amp;gt; json.dumps(now_epoch)&lt;br /&gt;'1361526567'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;날짜/시간 값이 정상적으로 변환된 데이터 유형 중간에 발생할 수 있는 경우 이러한 특수 변환을 수행하는 것이 귀찮을 수 있습니다. 상속을 사용하여 JSON 인코딩 방법을 수정할 수 있습니다. 상속은 다음포스팅의 &quot;상속&quot;에 설명되어 있습니다. 파이썬의 JSON 설명서는 JSON을 데드 플레이하게 만드는 복잡한 숫자에 대한 예를 제공한다. 날짜/시간에 맞게 수정해 보겠습니다.&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;&amp;gt;&amp;gt;&amp;gt; class DTEncoder(json.JSONEncoder):&lt;span&gt;&amp;nbsp;&lt;/span&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;&amp;gt;&amp;gt;&amp;gt; json.dumps(now, cls=DTEncoder)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'1361526567'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;def default(self, obj):&lt;br /&gt;&lt;i&gt;# isinstance() checks the type of obj &lt;/i&gt;if isinstance(obj, datetime.datetime):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;return int(mktime(obj.timetuple()))&lt;br /&gt;&lt;i&gt;# else it's something the normal decoder knows: &lt;/i&gt;return json.JSONEncoder.default(self, obj)&lt;span&gt;&amp;nbsp;&lt;/span&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;gt;&amp;gt;&amp;gt; json.dumps(now, cls=DTEncoder)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'1361526567'&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;새 클래스 DTENCoder는 JSONENCoder의 하위 클래스 또는 하위 클래스입니다. 날짜 시간 처리를 추가하려면 기본() 메서드를 재정의하기만 하면 됩니다. 상속을 수행하면 다른 모든 항목이 상위 클래스에서 처리됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;isinstance() 함수는 개체 obj가 datetime.da time 클래스인지 확인합니다. Python의 모든 것은 개체이므로 isinstance()는 어디에서나 작동합니다.&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;&amp;gt;&amp;gt;&amp;gt; type(now)&lt;br /&gt;&amp;lt;class 'datetime.datetime'&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; isinstance(now, datetime.datetime) True&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; type(234)&lt;br /&gt;&amp;lt;class 'int'&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; isinstance(234, int)&lt;br /&gt;True&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; type('hey')&lt;br /&gt;&amp;lt;class 'str'&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; isinstance('hey', str)&lt;br /&gt;True&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSON 및 기타 구조화된 텍스트 형식의 경우 미리 구조에 대해 아무것도 알지 못한 상태에서 파일에서 데이터 구조로 로드할 수 있습니다. 그런 다음 isinstance() 및 type에 적합한 방법을 사용하여 구조를 살펴볼 수 있습니다. 예를 들어 항목 중 하나가 사전인 경우 키(), 값() 및 항목()을 통해 내용을 추출할 수 있습니다.&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;YAML&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSON과 마찬가지로 YAML에는 키와 값이 있지만 날짜 및 시간과 같은 더 많은 데이터 유형을 처리합니다. 표준 파이썬 라이브러리에는 아직 YAML 처리가 포함되어 있지 않으므로, YAML이라는 이름의 타사 라이브러리를 설치해야 합니다. load()는 YAML 문자열을 파이썬 데이터로 변환하지만 dump()는 반대로 변환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 YAML 파일인 mcintyre.yaml에는 캐나다 시인 제임스 맥킨타이어에 대한 정보가 들어 있습니다.&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;span&gt;&amp;nbsp;&lt;/span&gt;name:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;first: James&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;last: McIntyre&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;dates:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;birth: 1828-05-25&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;death: 1906-03-31&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;details:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;bearded: true&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;themes: [cheese, Canada]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;books:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;url: &lt;a href=&quot;http://www.gutenberg.org/files/36068/36068-h/36068-h.htm&quot;&gt;http://www.gutenberg.org/files/36068/36068-h/36068-h.htm&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;poems:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;- title: 'Motto'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;text: |&lt;br /&gt;Politeness, perseverance and pluck,&lt;br /&gt;To their possessor will bring good luck.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;- title: 'Canadian Charms'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;text: |&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Here industry is not in vain,&lt;br /&gt;For we have bounteous crops of grain,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;And you behold on every field&lt;br /&gt;Of grass and roots abundant yield, But after all the greatest charm&lt;br /&gt;Is the snug home upon the farm,&lt;br /&gt;And stone walls now keep cattle warm.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;true, false, on 및 off와 같은 값은 Python Booans로 변환됩니다. 정수와 문자열은 파이썬 등가물로 변환됩니다. 다른 구문은 목록 및 사전 목록을 만듭니다.&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;&amp;gt;&amp;gt;&amp;gt; import yaml&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; with open('mcintyre.yaml', 'rt') as fin:&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; text = fin.read()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; data = yaml.load(text)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; data['details']&lt;br /&gt;{'themes': ['cheese', 'Canada'], 'bearded': True} &amp;gt;&amp;gt;&amp;gt; len(data['poems'])&lt;br /&gt;2&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 데이터 구조는 YAML 파일의 구조와 일치합니다. 이 경우에는 한 단계 이상의 깊이가 있는 위치입니다. 다음 받아쓰기/목록/독재 참조와 함께 두 번째 시의 제목을 얻을 수 있습니다.&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;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; data['poems'][1]['title']&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'Canadian Charms'&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;PyYAML은 문자열에서 Python 개체를 로드할 수 있으며 이는 위험합니다. 신뢰하지 않는 YAML을 가져오는 경우 load() 대신 safe_load()를 사용합니다. 항상 safe_load()를 사용하는 것이 좋습니다. 읽기 전쟁은 Ruby on Rails 플랫폼을 어떻게 조작했는지에 대한 설명을 위한 평화입니다.&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;예를 들어, 위키피디아의 10억 likes 페이지에서 다음 XML 조각은 10개의 중첩된 엔터티를 정의하며, 각각 하위 수준을 10배 확장하여 총 10억 개의 확장을 수행합니다.&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;&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;!DOCTYPE lolz [&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;!ENTITY lol &quot;lol&quot;&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;!ENTITY lol1 &quot;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&amp;amp;lol;&quot;&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;!ENTITY lol2 &quot;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&amp;amp;lol1;&quot;&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;!ENTITY lol3 &quot;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&amp;amp;lol2;&quot;&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;!ENTITY lol4 &quot;&amp;amp;lol3;&amp;amp;lol3;&amp;amp;lol3;&amp;amp;lol3;&amp;amp;lol3;&amp;amp;lol3;&amp;amp;lol3;&amp;amp;lol3;&amp;amp;lol3;&amp;amp;lol3;&quot;&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;!ENTITY lol5 &quot;&amp;amp;lol4;&amp;amp;lol4;&amp;amp;lol4;&amp;amp;lol4;&amp;amp;lol4;&amp;amp;lol4;&amp;amp;lol4;&amp;amp;lol4;&amp;amp;lol4;&amp;amp;lol4;&quot;&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;!ENTITY lol6 &quot;&amp;amp;lol5;&amp;amp;lol5;&amp;amp;lol5;&amp;amp;lol5;&amp;amp;lol5;&amp;amp;lol5;&amp;amp;lol5;&amp;amp;lol5;&amp;amp;lol5;&amp;amp;lol5;&quot;&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;!ENTITY lol7 &quot;&amp;amp;lol6;&amp;amp;lol6;&amp;amp;lol6;&amp;amp;lol6;&amp;amp;lol6;&amp;amp;lol6;&amp;amp;lol6;&amp;amp;lol6;&amp;amp;lol6;&amp;amp;lol6;&quot;&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;!ENTITY lol8 &quot;&amp;amp;lol7;&amp;amp;lol7;&amp;amp;lol7;&amp;amp;lol7;&amp;amp;lol7;&amp;amp;lol7;&amp;amp;lol7;&amp;amp;lol7;&amp;amp;lol7;&amp;amp;lol7;&quot;&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;!ENTITY lol9 &quot;&amp;amp;lol8;&amp;amp;lol8;&amp;amp;lol8;&amp;amp;lol8;&amp;amp;lol8;&amp;amp;lol8;&amp;amp;lol8;&amp;amp;lol8;&amp;amp;lol8;&amp;amp;lol8;&quot;&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;]&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;lolz&amp;gt;&amp;amp;lol9;&amp;lt;/lolz&amp;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;나쁜 소식은: 10억 번의 웃음이 이전 섹션에서 언급된 모든 XML 라이브러리를 날려버릴 것이라는 것이다. 해제된 XML은 이 공격 및 기타 공격과 파이썬 라이브러리의 취약성을 나열합니다. 링크에는 이러한 문제를 방지하기 위해 여러 라이브러리에 대한 설정을 변경하는 방법이 나와 있습니다. 또한 disusedxml 라이브러리를 다른 라이브러리의 보안 프런트엔드로 사용할 수 있습니다.&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;&amp;gt;&amp;gt;&amp;gt; &lt;i&gt;# insecure:&lt;br /&gt;&lt;/i&gt;&amp;gt;&amp;gt;&amp;gt; from xml.etree.ElementTree import parse &amp;gt;&amp;gt;&amp;gt; et = parse(xmlfile)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; &lt;i&gt;# protected:&lt;br /&gt;&lt;/i&gt;&amp;gt;&amp;gt;&amp;gt; from defusedxml.ElementTree import parse &amp;gt;&amp;gt;&amp;gt; et = parse(xmlfile)&lt;span&gt;&amp;nbsp;&lt;/span&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;여기서는 Windows 스타일의 .ini 파일을 처리하는 표준 구성 파서 모듈을 사용합니다. 이러한 파일에는 키 = 값 정의 섹션이 있습니다. 다음은 최소 설정.cfg 파일입니다.&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;span&gt;&amp;nbsp; &lt;/span&gt;[english]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;greeting = Hello&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;[french]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;greeting = Bonjour&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[files]&lt;br /&gt;home = /usr/local&lt;br /&gt;&lt;i&gt;# simple interpolation: &lt;/i&gt;bin = %(home)s/bin&lt;span&gt;&amp;nbsp;&lt;/span&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;&amp;gt;&amp;gt;&amp;gt; import configparser&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; cfg = configparser.ConfigParser()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; cfg.read('settings.cfg')&lt;br /&gt;['settings.cfg']&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; cfg&lt;br /&gt;&amp;lt;configparser.ConfigParser object at 0x1006be4d0&amp;gt; &amp;gt;&amp;gt;&amp;gt; cfg['french']&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;Section: french&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; cfg['french']['greeting']&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'Bonjour'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; cfg['files']['bin']&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'/usr/local/bin'&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;펑시어 보간법을 포함한 다른 옵션을 사용할 수 있습니다. 구성 도구 문서를 참조하십시오. 두 수준보다 깊은 내포가 필요한 경우 YAML 또는 JSON을 사용해 보십시오.&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;이러한 이진 데이터 교환 형식은 일반적으로 XML이나 JSON보다 더 작고 빠릅니다.&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;&amp;bull; MsgPack&lt;br /&gt;&amp;bull; Protocol Buffers&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; Avro&lt;br /&gt;&amp;bull; Thrift&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이진수이기&lt;span&gt; &lt;/span&gt;때문에&lt;span&gt; &lt;/span&gt;텍스트&lt;span&gt; &lt;/span&gt;편집기를&lt;span&gt; &lt;/span&gt;사용하는&lt;span&gt; &lt;/span&gt;사람이&lt;span&gt; &lt;/span&gt;쉽게&lt;span&gt; &lt;/span&gt;편집할&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있는&lt;span&gt; &lt;/span&gt;것은&lt;span&gt; &lt;/span&gt;없습니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;</description>
      <category>파이썬코드XML</category>
      <author>&amp;amp;$#@</author>
      <guid isPermaLink="true">https://about-design.tistory.com/12</guid>
      <comments>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%93%9C-xml#entry12comment</comments>
      <pubDate>Sat, 2 Oct 2021 20:07:35 +0900</pubDate>
    </item>
    <item>
      <title>파이썬코드쓰기()를 사용하여 이진 파일 쓰기</title>
      <link>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%93%9C%EC%93%B0%EA%B8%B0%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EC%9D%B4%EC%A7%84-%ED%8C%8C%EC%9D%BC-%EC%93%B0%EA%B8%B0</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코드.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXrg5Z/btrgC5LdIBF/UL5qS1JeYqkUyKZMtM0Tk0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXrg5Z/btrgC5LdIBF/UL5qS1JeYqkUyKZMtM0Tk0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXrg5Z/btrgC5LdIBF/UL5qS1JeYqkUyKZMtM0Tk0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXrg5Z%2FbtrgC5LdIBF%2FUL5qS1JeYqkUyKZMtM0Tk0%2Fimg.jpg&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코드.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size18&quot;&gt;모든 문자열에 'b'를 포함하면 파일이 이진 모드로 열립니다. 이 경우 문자열 대신 바이트를 읽고 씁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이진 시가 없기 때문에 0에서 255까지의 256바이트 값만 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; bdata = bytes(range(0, 256))&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; len(bdata)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;256&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이진 모드에서 쓰기 위한 파일을 열고 모든 데이터를 한 번에 씁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; fout = open('bfile', 'wb')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; fout.write(bdata)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;256&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; fout.close()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다시 쓰기()는 기록된 바이트 수를 반환합니다. 텍스트와 마찬가지로 이진 데이터를 청크로 쓸 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; fout = open('bfile', 'wb')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; size = len(bdata)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; offset = 0&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; chunk = 100&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; while True:&lt;br /&gt;... if offset &amp;gt; size:&lt;br /&gt;... break&lt;br /&gt;... fout.write(bdata[offset:offset+chunk]) ... offset += chunk&lt;br /&gt;...&lt;br /&gt;100&lt;br /&gt;100&lt;br /&gt;56&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; fout.close()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;읽기()를 사용하여 이진 파일 읽기&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 방법은 간단합니다. 'rb'로 열기만 하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; fin = open('bfile', 'rb')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; bdata = fin.read()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; len(bdata)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;256&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; fin.close()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Close Files Automatically by Using with&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;열어본 파일을 닫지 않은 경우 더 이상 참조되지 않은 후 파이썬에 의해 닫힙니다. 즉, 함수 내에서 파일을 열고 명시적으로 닫지 않으면 함수가 종료될 때 파일이 자동으로 닫힙니다. 그러나 장기간 실행되는 기능이나 프로그램의 기본 섹션에서 파일을 열었을 수 있습니다. 나머지 쓰기를 강제로 완료하려면 파일을 닫아야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;파이썬에는 열린 파일과 같은 것들을 정리할 수 있는 컨텍스트 관리자가 있습니다. 식을 변수로 사용하여 양식을 사용할 수식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; with open('relativity', 'wt') as fout: ... fout.write(poem)&lt;br /&gt;...&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;바로 그거예요. 컨텍스트 관리자 아래의 코드 블록(이 경우, 한 줄)이 완료된 후(일반적으로 또는 상향된 예외에 의해) 파일은 자동으로 닫힙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;탐색()으로 위치 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;읽고 쓸 때 파이썬은 파일 내의 위치를 추적합니다. tell() 함수는 파일 시작 부분의 현재 오프셋(바이트)을 반환합니다. seek() 기능을 사용하여 파일의 다른 바이트 오프셋으로 이동할 수 있습니다. 즉, 마지막 바이트를 읽기 위해 파일의 모든 바이트를 읽을 필요는 없습니다. 마지막 바이트까지 찾고 1바이트만 읽을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 예에서는 앞에서 작성한 256바이트 이진 파일 'bfile'을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; fin = open('bfile', 'rb')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; fin.tell()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;0&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;파일이 끝나기 전에 seek()를 1바이트까지 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; fin.seek(255)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;255&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;파일 끝까지 읽기:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; bdata = fin.read()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; len(bdata)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;1&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; bdata[0]&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;255&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;seek()는 현재 오프셋도 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;두 번째 인수를 사용하여 seek()를 호출할 수 있습니다. seek(오프셋, 오리진):&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 오리진이 0(기본값)이면 처음부터 오프셋 바이트로 이동합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 발신지가 1인 경우 현재 위치에서 오프셋 바이트로 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 원본이 2인 경우, 끝 부분에 상대적인 오프셋 바이트로 이동합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음 값은 표준 OS 모듈에도 정의되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;gt;&amp;gt;&amp;gt; import os &amp;gt;&amp;gt;&amp;gt; os.SEEK_SET 0&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; os.SEEK_CUR 1 &lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; os.SEEK_END&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;2&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;마지막 바이트는 다른 방식으로 읽을 수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; fin = open('bfile', 'rb')&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;파일 종료 전 1바이트:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; fin.seek(-1, 2)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;255&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; fin.tell()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;255&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;파일 끝까지 읽기:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; bdata = fin.read()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; len(bdata)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;1&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; bdata[0]&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;255&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;구직 활동을 위해 tell을 부를 필요는 없다. 나는 단지 그들이 둘 다 같은 오프셋을 보고한다는 것을 보여주고 싶었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음은 파일의 현재 위치에서 찾는 예제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; fin = open('bfile', 'rb')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 다음 예는 파일이 끝나기 전에 2바이트가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; fin.seek(254, 0)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;254&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; fin.tell()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;254&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 1바이트 앞으로 이동합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; fin.seek(1, 1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;255&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; fin.tell()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;255&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;마지막으로 파일 끝까지 읽습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; bdata = fin.read()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; len(bdata)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;1&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; bdata[0]&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;255&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이러한 함수는 이진 파일에 가장 유용합니다. 텍스트 파일과 함께 사용할 수 있지만, 파일이 ASCII(문자당 1바이트)가 아니면 오프셋을 계산하는 데 어려움이 있을 수 있습니다. 이는 텍스트 인코딩에 따라 달라지며 가장 널리 사용되는 인코딩(UTF-8)은 문자당 바이트 수를 다르게 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;구조화된 텍스트 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;단순 텍스트 파일의 경우 구성 수준은 줄뿐입니다. 때때로, 여러분은 그것보다 더 많은 구조를 원합니다. 프로그램에서 나중에 사용할 수 있도록 데이터를 저장하거나 다른 프로그램으로 데이터를 보낼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;형식은 여러 가지가 있으며, 다음과 같이 구분할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 탭('\t', 쉼표(',), 세로 막대 등의 구분 기호 또는 구분 기호&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;('|') CSV(쉼표로 구분된 값) 형식의 예입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 태그 주위에 '' 및 '''가 있습니다. 예를 들어 XML 및 HTML을 들 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 구두점. 예를 들어 자바스크립트 객체 표기법(JSON)이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 들여쓰기. 예를 들어 YAML이 있습니다. 사용하는 출처에 따라 &quot;YAML은 마크업 언어가 아닙니다. 직접 연구해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 프로그램 구성 파일과 같은 기타.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이러한 각각의 구조화된 파일 형식은 하나 이상의 파이썬 모듈로 읽고 쓸 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;CSV&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;구분된 파일은 종종 스프레드시트 및 데이터베이스의 교환 형식으로 사용됩니다. CSV 파일을 한 번에 한 줄씩 수동으로 읽고 각 줄을 쉼표 구분 기호로 필드로 분할한 다음 목록 및 사전 양자와 같은 데이터 구조에 결과를 추가할 수 있습니다. 그러나 표준 csv 모듈을 사용하는 것이 좋습니다. 이러한 파일을 구문 분석하는 작업은 생각보다 복잡해질 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 쉼표 외에 다른 구분 기호를 사용하는 경우도 있습니다. '|' 및 '\t'(탭)가 일반적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 일부는 이스케이프 시퀀스가 있습니다. 구분 기호 문자가 필드 내에서 발생할 수 있는 경우 전체 필드에는 따옴표 문자가 있거나 일부 이스케이프 문자가 앞에 있을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 파일의 줄 끝 문자가 다릅니다. Unix는 '\n', Microsoft는 '\r \n', Apple은 '\r'을 사용했지만 지금은 '\n'을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 첫 줄에 열 이름이 있을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;먼저, 각 행에 열 목록이 포함된 행 목록을 읽고 쓰는 방법에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;gt;&amp;gt;&amp;gt; import csv &amp;gt;&amp;gt;&amp;gt; villains = [&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;... ['Ernst', 'Blofeld'],&lt;br /&gt;... ]&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; with open('villains', 'wt') as fout: &lt;i&gt;# a context manager &lt;/i&gt;... csvout = csv.writer(fout)&lt;br /&gt;... csvout.writerows(villains)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그러면 다음과 같은 행으로 파일 악당이 생성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Doctor,No&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Rosa,Klebb&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Mister,Big&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Auric,Goldfinger&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Ernst,Blofeld&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 다시 읽어보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import csv&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; with open('villains', 'rt') as fin: &lt;i&gt;# context manager&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;cin = csv.reader(fin)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;... &amp;nbsp;villains = [row for row in cin] &lt;i&gt;# This uses a list comprehension &lt;/i&gt;...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; print(villains)&lt;br /&gt;[['Doctor', 'No'], ['Rosa', 'Klebb'], ['Mister', 'Big'],&lt;br /&gt;['Auric', 'Goldfinger'], ['Ernst', 'Blofeld']] &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;잠시 목록 이해에 대해 생각해 보십시오. 우리는 리더() 함수에 의해 만들어진 구조를 이용했다. cin 객체에 행을 생성해 루프를 위해 a에서 추출할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기본 선택사항과 함께 독서자() 및 작성기()를 사용하여 열은 쉼표로 구분되고 행은 행 피드로 구분됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데이터는 목록 목록이 아닌 사전 목록일 수 있습니다. 이번에는 새 DictReader() 함수를 사용하여 다음과 같은 열 이름을 지정하여 악당 파일을 다시 읽어보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;gt;&amp;gt;&amp;gt; import csv&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; with open('villains', 'rt') as fin:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;새로운 DictWriter() 함수를 사용하여 CSV 파일을 다시 쓰겠습니다. 또한 CSV 파일에 열 이름의 초기 줄을 쓰기 위해 쓰기 헤더()를 호출합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;import csv villains = [&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;{'first': 'Doctor', 'last': 'No'},&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;{'first': 'Rosa', 'last': 'Klebb'},&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;{'first': 'Mister', 'last': 'Big'},&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;{'first': 'Auric', 'last': 'Goldfinger'},&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;{'first': 'Ernst', 'last': 'Blofeld'},&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;]&lt;br /&gt;with open('villains', 'wt') as fout:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;cout = csv.DictWriter(fout, ['first', 'last'])&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;cout.writeheader()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;cout.writerows(villains)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그러면 머리글 줄이 있는 악당 파일이 생성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;first,last&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Doctor,No&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Rosa,Klebb&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Mister,Big&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Auric,Goldfinger&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Ernst,Blofeld&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 다시 읽어보겠습니다. DictReader() 호출에서 필드 이름 인수를 생략하여 파일의 첫 줄(첫 번째, 마지막)에 있는 값을 열 레이블 및 일치하는 사전 키로 사용하도록 지시합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import csv&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; with open('villains', 'rt') as fin:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;cin = csv.DictReader(fin)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;... &amp;nbsp;villains = [row for row in cin] ...&amp;gt;&amp;gt;&amp;gt; print(villains)[{'last': 'No', 'first': 'Doctor'}, {'last': 'Klebb', 'first': 'Rosa'}, {'last': 'Big', 'first': 'Mister'}, {'last': 'Goldfinger', 'first': 'Auric'}, {'last': 'Blofeld', 'first': 'Ernst'}] &lt;/li&gt;
&lt;/ul&gt;</description>
      <category>파이썬코드들여쓰기</category>
      <author>&amp;amp;$#@</author>
      <guid isPermaLink="true">https://about-design.tistory.com/11</guid>
      <comments>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%93%9C%EC%93%B0%EA%B8%B0%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EC%9D%B4%EC%A7%84-%ED%8C%8C%EC%9D%BC-%EC%93%B0%EA%B8%B0#entry11comment</comments>
      <pubDate>Fri, 1 Oct 2021 22:06:55 +0900</pubDate>
    </item>
    <item>
      <title>파이썬코딩 데이터 저장위치</title>
      <link>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%94%A9-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%80%EC%9E%A5%EC%9C%84%EC%B9%98</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코딩데이터저장위치.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6yZjW/btrgvkIYKcc/5DL1bK5JejMP2MizxVC9pK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6yZjW/btrgvkIYKcc/5DL1bK5JejMP2MizxVC9pK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6yZjW/btrgvkIYKcc/5DL1bK5JejMP2MizxVC9pK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6yZjW%2FbtrgvkIYKcc%2F5DL1bK5JejMP2MizxVC9pK%2Fimg.jpg&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코딩데이터저장위치.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size18&quot;&gt;활성 프로그램은 RAM에 저장된 데이터에 액세스합니다. RAM은 매우 빠르지만 비용이 많이 들고 일정한 전원 공급이 필요합니다. 전원이 꺼지면 메모리의 모든 데이터가 손실됩니다. 디스크 드라이브는 RAM보다 느리지만 용량, 비용 및 전원 코드를 통해 작동한 후에도 데이터를 보존합니다. 따라서, 컴퓨터 시스템에서 엄청난 양의 노력이 디스크와 RAM에 데이터를 저장하는 것 사이에서 최상의 절충을 이루는데 투입되었습니다. 프로그래머로서 디스크와 같은 비휘발성 미디어를 사용하여 데이터를 저장하고 검색하는 지속성이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 장에서는 플랫 파일, 구조화된 파일 및 데이터베이스 등 각각 다른 용도에 맞게 최적화된 다양한 유형의 데이터 스토리지에 대해 설명합니다. 입력 및 출력 이외의 파일 작업은 다음내용의 &quot;파일&quot;에서 다룹니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;또한 이 장에서는 표준 라이브러리와는 별도로 비표준 파이썬 모듈의 예를 보여 주는 첫 번째 장이기도 하다. pip 명령을 사용하여 설치할 수 있습니다. 이 명령은 통증이 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;File Input/Output&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;가장 간단한 종류의 지속성은 플랫 파일이라고도 하는 일반 오래된 파일입니다. 이것은 파일 이름 아래에 저장된 일련의 바이트입니다. 파일에서 메모리로 읽고 메모리에서 파일로 씁니다. 파이썬은 이러한 작업을 쉽게 합니다. 그것의 파일 운영은 친숙하고 대중적인 유닉스 계열들을 모델로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;파일을 읽거나 쓰기 전에 파일을 열어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;fileobj &lt;/i&gt;= open( &lt;i&gt;filename&lt;/i&gt;, &lt;i&gt;mode &lt;/i&gt;)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음은 상담 내용에 대한 간단한 설명입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; fileobj는 open()에 의해 반환되는 파일 개체입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 파일 이름은 파일의 문자열 이름입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 모드는 파일 형식과 파일로 수행할 작업을 나타내는 문자열입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;모드의 첫 번째 문자는 작동을 나타냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; r은 읽음을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 쓰는 것을 의미합니다. 파일이 없으면 파일이 만들어집니다. 파일이 있으면 덮어씁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; x는 쓰기(write)를 의미하지만, 파일이 아직 존재하지 않는 경우에만 해당됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 파일이 있는 경우 추가(종료 후 쓰기)를 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;모드의 두 번째 문자는 파일 형식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; t(또는 없음)는 텍스트를 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; b는 이진수를 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;파일을 연 후, 당신은 데이터를 읽거나 쓰기 위해 함수를 호출합니다; 이것들은 다음과 같이 표시됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음의 예들&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;마지막으로 파일을 닫아야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;한 프로그램에서 파이썬 문자열로 파일을 만든 다음 다음 다시 읽어 봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Write a Text File with write()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;어떤 이유에선지, 특수 상대성 이론에 대한 리머릭은 많지 않다. 이것은 우리의 데이터 소스에 대한 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; poem = '''There was a young lady named Bright,&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... Whose speed was far faster than light;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... She started one day&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... In a relative way,&lt;/li&gt;
&lt;li&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... And returned on the previous night.'''&lt;/li&gt;
&lt;li&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; len(poem)&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;150&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음 코드는 한 번의 통화로 전체 시를 '상대성' 파일에 기록합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;gt;&amp;gt;&amp;gt; fout = open('relativity', 'wt')&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; fout.write(poem)&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;150&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; fout.close()&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;쓰기() 함수는 기록된 바이트 수를 반환합니다. 인쇄()와 같이 공백이나 새 줄을 추가하지 않습니다. 텍스트 파일로()를 인쇄할 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; fout = open('relativity', 'wt')&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; print(poem, file=fout)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; fout.close()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 경우 write()를 사용해야 합니까, print()를 사용해야 합니까?라는 질문이 나타납니다. 기본적으로 인쇄()는 각 인수 뒤에 공백을 추가하고 끝에 새 줄을 추가합니다. 앞의 예에서는 상대성 파일에 새로운 선을 추가했다. write()와 같이 인쇄하려면 다음 두 인수를 전달합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; sep(기본값 공백 ' ')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 끝(기본적으로 새 줄 '\n')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;print()는 다른 항목을 통과하지 않는 한 기본값을 사용합니다. 일반적으로 인쇄물에 의해 추가되는 모든 까다로움을 억제하기 위해 빈 줄을 전달합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; fout = open('relativity', 'wt')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; print(poem, file=fout, sep='', end='') &amp;gt;&amp;gt;&amp;gt; fout.close()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;소스 문자열이 큰 경우 소스가 완료될 때까지 청크를 쓸 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; fout = open('relativity', 'wt')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; size = len(poem)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; offset = 0&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; chunk = 100&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; while True:&lt;br /&gt;... if offset &amp;gt; size:&lt;br /&gt;... break&lt;br /&gt;... fout.write(poem[offset:offset+chunk]) ... offset += chunk&lt;br /&gt;...&lt;br /&gt;100&lt;br /&gt;50&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; fout.close()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이것은 첫 번째 시도에서 100자를 썼고 마지막 50자를 다음 시도에서 썼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;상대성 파일이 중요한 경우 모드 x를 사용하면 덮어쓰기를 방지할 수 있는지 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; fout = open('relativity', 'xt')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Traceback (most recent call last):&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt; FileExistsError: [Errno 17] File exists: 'relativity'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;예외 핸들러와 함께 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; try:&lt;br /&gt;... fout = open('relativity', 'xt')]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;... fout.write('stomp stomp stomp')&lt;br /&gt;... except FileExistsError:&lt;br /&gt;... print('relativity already exists!. That was a close one.') ...&lt;br /&gt;relativity already exists!. That was a close one.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Read a Text File with read(), readline(), or readlines()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음 예제와 같이 전체 파일을 한 번에 후루룩 마실 인수 없이 read()를 호출할 수 있습니다. 대용량 파일을 사용할 때 주의하십시오. 기가바이트 파일은 1기가바이트의 메모리를 소모합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; fin = open('relativity', 'rt' )&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; poem = fin.read()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; fin.close()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; len(poem)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;150&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;한 번에 반환되는 읽기() 양을 제한하기 위해 최대 문자 수를 제공할 수 있습니다. 한 번에 100자를 읽고 각 조각을 시 문자열에 추가하여 원본을 재구성해 봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; poem = ''&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; fin = open('relativity', 'rt' ) &amp;gt;&amp;gt;&amp;gt; chunk = 100&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; while True:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;fragment = fin.read(chunk)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;... &amp;nbsp;if not fragment: &lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;... &amp;nbsp;break &lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;poem += fragment&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;...&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; fin.close()&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; len(poem)&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;150&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;After you&amp;rsquo;ve read all the way to the end, further calls to read() will return an empty string (''), which is treated as False in if not fragment. This breaks out of the while True loop.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;You can also read the file a line at a time by using readline(). In this next example, we&amp;rsquo;ll append each line to the poem string to rebuild the original:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;gt;&amp;gt;&amp;gt; poem = ''&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; fin = open('relativity', 'rt' ) &amp;gt;&amp;gt;&amp;gt; chunk = 100&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; while True:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;fragment = fin.read(chunk)&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;... &amp;nbsp;if not fragment: &lt;/li&gt;
&lt;li&gt;... &amp;nbsp;break &lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;poem += fragment&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;...&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; fin.close()&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; len(poem)&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;150&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;끝까지 읽은 후에는 읽기()에 대한 추가 호출이 빈 문자열('')을 반환하며, 이 문자열은 조각이 아닌 경우 False로 처리됩니다. 이 경우 True 루프가 중단됩니다.&lt;/li&gt;
&lt;li&gt;리드라인()을 사용하여 파일을 한 번에 한 줄씩 읽을 수도 있습니다. 다음 예에서는 각 줄을 시 문자열에 추가하여 원본을 재구성합니다.&lt;/li&gt;
&lt;li&gt;&amp;gt;&amp;gt;&amp;gt; poem = ''&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; fin = open('relativity', 'rt' ) &amp;gt;&amp;gt;&amp;gt; while True: &lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; len(poem)&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;150&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;텍스트 파일의 경우 빈 줄이라도 길이가 1(새 줄 문자)이며 참으로 평가됩니다. 파일을 읽으면 read()와 같은 readline()도 빈 문자열을 반환하며, 이 문자열도 False로 평가됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;텍스트 파일을 읽는 가장 쉬운 방법은 반복기를 사용하는 것입니다. 그러면 한 번에 한 줄씩 반환됩니다. 앞의 예와 비슷하지만 코드가 더 적습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; poem = ''&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; fin = open('relativity', 'rt' ) &amp;gt;&amp;gt;&amp;gt; for line in fin:&lt;br /&gt;... poem += line&lt;br /&gt;...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; fin.close()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; len(poem)&lt;br /&gt;150&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위의 모든 예들은 결국 하나의 현악시를 만들었다. 읽기 행() 호출은 한 번에 한 줄을 읽고 한 줄 문자열 목록을 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; fin = open('relativity', 'rt' ) &amp;gt;&amp;gt;&amp;gt; lines = fin.readlines()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; fin.close()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; print(len(lines), 'lines read') 5 lines read&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; for line in lines:&lt;br /&gt;... print(line, end='')&lt;br /&gt;...&lt;br /&gt;There was a young lady named Bright, Whose speed was far faster than light; She started one day&lt;br /&gt;In a relative way,&lt;br /&gt;And returned on the previous night.&amp;gt;&amp;gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;처음&lt;span&gt; &lt;/span&gt;네&lt;span&gt; &lt;/span&gt;줄에는&lt;span&gt; &lt;/span&gt;이미&lt;span&gt; &lt;/span&gt;새&lt;span&gt; &lt;/span&gt;줄이&lt;span&gt; &lt;/span&gt;있었기&lt;span&gt; &lt;/span&gt;때문에&lt;span&gt; &lt;/span&gt;우리는&lt;span&gt; &lt;/span&gt;인쇄물에게&lt;span&gt; &lt;/span&gt;자동&lt;span&gt; &lt;/span&gt;새&lt;span&gt; &lt;/span&gt;줄이&lt;span&gt; &lt;/span&gt;생기지&lt;span&gt; &lt;/span&gt;않도록&lt;span&gt; &lt;/span&gt;했다&lt;span&gt;. &lt;/span&gt;마지막&lt;span&gt; &lt;/span&gt;줄은&lt;span&gt; &lt;/span&gt;그렇지&lt;span&gt; &lt;/span&gt;않아&lt;span&gt; &lt;/span&gt;마지막&lt;span&gt; &lt;/span&gt;줄&lt;span&gt; &lt;/span&gt;바로&lt;span&gt; &lt;/span&gt;뒤에&lt;span&gt; &lt;/span&gt;대화형&lt;span&gt; &lt;/span&gt;프롬프트&lt;span&gt; &amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;가&lt;span&gt; &lt;/span&gt;발생하였습니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;</description>
      <category>파이썬코드저장위치</category>
      <category>파이썬코딩</category>
      <author>&amp;amp;$#@</author>
      <guid isPermaLink="true">https://about-design.tistory.com/10</guid>
      <comments>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%94%A9-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%80%EC%9E%A5%EC%9C%84%EC%B9%98#entry10comment</comments>
      <pubDate>Fri, 1 Oct 2021 00:41:17 +0900</pubDate>
    </item>
    <item>
      <title>파이썬코딩 format binary data etc</title>
      <link>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%94%A9-format-binary-data-etc</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코딩format.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqHZGD/btreAJ5Svlh/iI9Mm6CKnNqx1DDXXgFVDK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqHZGD/btreAJ5Svlh/iI9Mm6CKnNqx1DDXXgFVDK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqHZGD/btreAJ5Svlh/iI9Mm6CKnNqx1DDXXgFVDK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqHZGD%2FbtreAJ5Svlh%2FiI9Mm6CKnNqx1DDXXgFVDK%2Fimg.jpg&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코딩format.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;Format&lt;span&gt;&amp;nbsp;&lt;/span&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;우리는 지금까지 텍스트 서식을 거의 무시해 왔다. 2장에는 몇 가지 문자열 정렬 기능이 나와 있으며 코드 예제는 간단한 인쇄() 문을 사용하거나 대화형 인터프리터가 값을 표시하도록 합니다. 하지만 이제는 다양한 형식을 사용하여 데이터 값을 문자열로 변환하는 방법, 즉 문자열 내부에 값을 넣는 방법에 대해 알아보아야 합니다. 이를 통해 보고서 및 기타 출력물을 생성할 수 있으며, 이를 위해 분배가 필요할 수 있습니다.&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;Python은 문자열을 포맷하는 두 가지 방법, 즉 느슨하게 옛날 스타일과 새로운 스타일이라고 불린다. 두 스타일 모두 Python 2 및 3에서 지원됩니다(Python 2.6 이상의 새로운 스타일). 구식이 더 간단하니까 거기서부터 시작하죠.&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;%s string&lt;br /&gt;%d decimal integer&lt;br /&gt;%x hex integer&lt;br /&gt;%o octal integer&lt;br /&gt;%f decimal float&lt;br /&gt;%e exponential float&lt;br /&gt;%g decimal or exponential float %% a literal%&lt;span&gt;&amp;nbsp;&lt;/span&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;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt;&amp;gt; '%s' % 42&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'42'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; '%d' % 42&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'42'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; '%x' % 42&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'2a'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; '%o' % 42&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'52'&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;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; '%s' % 7.03&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'7.03'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; '%f' % 7.03&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'7.030000'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; '%e' % 7.03&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'7.030000e+00'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; '%g' % 7.03&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'7.03'&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;&amp;gt;&amp;gt;&amp;gt; '%d%%' % 100&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'100%'&lt;span&gt;&amp;nbsp;&lt;/span&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;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; actor = 'Richard Gere'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; cat = 'Chester'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; weight = 28&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; &quot;My wife's favorite actor is %s&quot; % actor&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&quot;My wife's favorite actor is Richard Gere&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; &quot;Our cat %s weighs %s pounds&quot; % (cat, weight)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'Our cat Chester weighs 28 pounds'&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;문자열 내부의 %s은 문자열을 보간한다는 의미입니다. 문자열에 나타나는 % 개수는 % 이후의 데이터 항목 개수와 일치합니다. 행위자와 같은 단일 데이터 항목은 % 바로 뒤에 있습니다. (cat, weight)와 같은 튜플(괄호로 묶고 쉼표로 구분)로 여러 데이터를 그룹화해야 합니다.&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;가중치가 정수임에도 불구하고 문자열 안에 있는 %s이(가) 문자열로 변환했습니다.&lt;br /&gt;%와 형식 지정자 사이에 다른 값을 추가하여 최소값을 지정할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최대 너비, 정렬 및 문자 채우기:&lt;br /&gt;변수의 경우 정수 n, 플로트 f 및 문자열 s를 정의하겠습니다.&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;&amp;gt;&amp;gt;&amp;gt;n=42 &amp;gt;&amp;gt;&amp;gt;f=7.03&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; s = 'string cheese'&lt;span&gt;&amp;nbsp;&lt;/span&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;&amp;gt;&amp;gt;&amp;gt;'%d%f%s'%(n,f,s) '42 7.030000 string cheese'&lt;span&gt;&amp;nbsp;&lt;/span&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;각 변수에 대해 최소 필드 너비를 10자로 설정하고 오른쪽에 정렬하여 왼쪽의 사용되지 않는 부분을 공백으로 채웁니다.&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;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; '%10d %10f %10s' % (n, f, s)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;42 &lt;span&gt;&amp;nbsp; &lt;/span&gt;7.030000 string cheese'&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;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; '%-10d %-10f %-10s' % (n, f, s)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'42 &lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;7.030000 &lt;span&gt;&amp;nbsp; &lt;/span&gt;string cheese'&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;이번에는 필드 너비는 같지만 최대 문자 너비는 4이고 오른쪽에 정렬됩니다. 이 설정을 사용하면 문자열이 잘리고 소수점 뒤의 부동자리가 4자리로 제한됩니다.&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;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; '%10.4d %10.4f %10.4s' % (n, f, s)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;0042 &lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;7.0300 &lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;stri'&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;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; '%.4d %.4f %.4s' % (n, f, s)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'0042 7.0300 stri'&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;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; '%*.*d %*.*f %*.*s' % (10, 4, n, 10, 4, f, 10, 4, s)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;0042 &lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;7.0300 &lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;stri'&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;New style formatting with {} and format&lt;span&gt;&amp;nbsp;&lt;/span&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;이전 스타일 형식은 여전히 지원됩니다. 버전 2.7에서 동결되는 파이썬 2에서는 영원히 지원될 것이다. 그러나 파이썬 3을 사용하는 경우에는 새로운 스타일 포맷이 권장됩니다.&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;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; '{} {} {}'.format(n, f, s)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'42 7.03 string cheese'&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;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt;&amp;gt; '{2} {0} {1}'.format(f, s, n)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'42 7.03 string cheese'&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;값 0은 첫 번째 인수인 f를 가리킨 반면, 1은 문자열 s를 가리켰고 2는 마지막 인수인 정수 n을 가리켰습니다.&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;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt;&amp;gt; '{n} {f} {s}'.format(n=42, f=7.03, s='string cheese')&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'42 7.03 string cheese'&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;&amp;gt;&amp;gt;&amp;gt; d = {'n': 42, 'f': 7.03, 's': 'string cheese'}&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;다음 예제에서 {0}은(는) 전체 사전이고 {1}은(는) 문자열 '기타'입니다.&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;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt;&amp;gt; '{0[n]} {0[f]} {0[s]} {1}'.format(d, 'other')&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'42 7.03 string cheese other'&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;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; '{0:d} {1:f} {2:s}'.format(n, f, s)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'42 7.030000 string cheese'&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;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt;&amp;gt; '{n:d} {f:f} {s:s}'.format(n=42, f=7.03, s='string cheese')&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'42 7.030000 string cheese'&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;최소 필드 너비 10, 오른쪽 정렬(기본값):&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;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; '{0:10d} {1:10f} {2:10s}'.format(n, f, s)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;42 &lt;span&gt;&amp;nbsp; &lt;/span&gt;7.030000 string cheese'&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;앞의 예제와 동일하지만 &amp;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;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; '{0:&amp;gt;10d} {1:&amp;gt;10f} {2:&amp;gt;10s}'.format(n, f, s)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;42 &lt;span&gt;&amp;nbsp; &lt;/span&gt;7.030000 string cheese'&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;최소 필드 폭 10, 왼쪽 정렬:&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;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; '{0:&amp;lt;10d} {1:&amp;lt;10f} {2:&amp;lt;10s}'.format(n, f, s)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'42 &lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;7.030000 &lt;span&gt;&amp;nbsp; &lt;/span&gt;string cheese'&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;최소 필드 폭 10, 가운데:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt;&amp;gt; '{0:^10d} {1:^10f} {2:^10s}'.format(n, f, s)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;42&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;7.030000&lt;span&gt;&amp;nbsp; &lt;/span&gt;string cheese'&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;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; '{0:&amp;gt;10.4d} {1:&amp;gt;10.4f} {2:10.4s}'.format(n, f, s)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Traceback (most recent call last):&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;ValueError: Precision not allowed in integer format specifier &amp;gt;&amp;gt;&amp;gt; '{0:&amp;gt;10d} {1:&amp;gt;10.4f} {2:&amp;gt;10.4s}'.format(n, f, s)&lt;br /&gt;' 42 7.0300 stri'&lt;span&gt;&amp;nbsp;&lt;/span&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;마지막 옵션은 채우기 문자입니다. 공백이 아닌 다른 출력 필드를 채우려면 :, 정렬(&amp;lt;, &amp;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;&amp;gt;&amp;gt;&amp;gt; '{0:!^20s}'.format('BIG SALE')&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'!!!!!!BIG SALE!!!!!!'&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;Match with Regular Expressions&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전포스팅에서는 간단한 문자열 연산에 대해 다루었다. 입문 정보로 무장한 여러분은 명령행에서 .py로 끝나는 모든 파일 이름을 나열하는 것을 의미하는 ls *.py와 같은 단순한 &quot;와일드카드&quot; 패턴을 사용해 본 적이 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 정규식을 사용하여 더 복잡한 패턴 일치를 살펴볼 차례입니다. 이것들은 우리가 수입할 표준 모듈 re에 제공된다. 일치시킬 문자열 패턴과 일치시킬 소스 문자열을 정의합니다. 단순 일치의 경우 용도는 다음과 같습니다.&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;result = re.match('You', 'Young Frankenstein')&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 'You'가 패턴이고 'Young Frankenstein'이 그 근원이다. 즉, 당신이 만든 끈이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;want to check. match()는 소스가 패턴으로 시작하는지 여부를 확인합니다.&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;youpattern = re.compile('You')&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;span&gt;&amp;nbsp;&lt;/span&gt;result = youpattern.match('Young Frankenstein')&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;match()만이 패턴과 소스를 비교하는 유일한 방법은 아니다. 다음은 사용할 수 있는 몇 가지 다른 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; 검색 결과 첫 번째 일치 항목이 있는 경우 반환됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; findall은 모든 비반복 일치 항목(있는 경우) 목록을 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; 분할은 패턴과 일치할 때 소스를 분할하고 문자열 조각 목록을 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; 하위 항목에서는 다른 교체 인수를 사용하여 패턴별로 일치하는 소스의 모든 부분을 교체로 변경합니다.&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;Exact match with match()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'Young Frankenstein'이라는 문자열은 'You'라는 단어로 시작되나요? 설명과 함께 몇 가지 코드가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import re&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; source = 'Young Frankenstein'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; m = re.match('You', source) &lt;i&gt;# match starts at the beginning of source &lt;/i&gt;&amp;gt;&amp;gt;&amp;gt; if m: &lt;i&gt;# match returns an object; do this to see what matched&lt;br /&gt;&lt;/i&gt;... print(m.group())&lt;br /&gt;...&lt;br /&gt;You&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; m = re.match('^You', source) &lt;i&gt;# start anchor does the same&lt;br /&gt;&lt;/i&gt;&amp;gt;&amp;gt;&amp;gt; if m:&lt;br /&gt;... print(m.group())&lt;br /&gt;...&lt;br /&gt;You&lt;span&gt;&amp;nbsp;&lt;/span&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;gt;&amp;gt;&amp;gt; m = re.match('Frank', source) &amp;gt;&amp;gt;&amp;gt; if m:&lt;br /&gt;... print(m.group())&lt;br /&gt;...&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 일치하는()이 반환되지 않았고 if가 인쇄 문을 실행하지 않았습니다. 앞에서 말했듯이 패턴이 원본의 시작 부분에 있을 경우에만 일치()가 작동합니다. 그러나 패턴이 있는 경우 검색()이 작동합니다.&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;&amp;gt;&amp;gt;&amp;gt; m = re.search('Frank', source) &amp;gt;&amp;gt;&amp;gt; if m:&lt;br /&gt;... print(m.group())&lt;br /&gt;...&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Frank&lt;span&gt;&amp;nbsp;&lt;/span&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;gt;&amp;gt;&amp;gt; m = re.match('.*Frank', source) &amp;gt;&amp;gt;&amp;gt; if m: &lt;i&gt;# match returns an object &lt;/i&gt;... print(m.group())&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;...&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Young Frank&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패턴을 변경합니다.&amp;bull; .는 단일 문자를 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; *는 앞의 모든 것을 의미합니다. 합쳐서 .*는 임의의 수의 문자 행위자(심지어 0)를 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; Frank는 우리가 일치시키고자 했던 문구입니다. match()는 일치하는 문자열을 반환했습니다.프랭크: '젊은 프랭크'.&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;First match with search()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색()을 사용하여 .* 와일드카드를 사용하지 않고도 소스 문자열 'Young Frankenstein'의 아무 곳에서나 'Frank' 패턴을 찾을 수 있습니다.&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;&amp;gt;&amp;gt;&amp;gt; m = re.search('Frank', source) &amp;gt;&amp;gt;&amp;gt; if m: &lt;i&gt;# search returns an object &lt;/i&gt;... print(m.group())&lt;br /&gt;...&lt;br /&gt;Frank&lt;span&gt;&amp;nbsp;&lt;/span&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;All matches with findall()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 예들은 한 가지 일치만 찾았다. 하지만 단일 문자 문자열 'n'의 인스턴스 수를 알고 싶다면 어떻게 해야 할까요?&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;&amp;gt;&amp;gt;&amp;gt; m = re.findall('n', source)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; m &lt;i&gt;# findall returns a list &lt;/i&gt;['n', 'n', 'n', 'n']&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; print('Found', len(m), 'matches') Found 4 matches&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'n' 뒤에 오는 글자는 어떤가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; m = re.findall('n.', source)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; m&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;['ng', 'nk', 'ns']&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;그것이 최종 'n'과 일치하지 않는다는 것을 주목하라. 우리는 'n' 뒤에 오는 문자는 ?:의 옵션이라고 말할 필요가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; m = re.findall('n.?', source)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; m&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;['ng', 'nk', 'ns', 'n']&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Split at matches with split()&lt;span&gt;&amp;nbsp;&lt;/span&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;gt;&amp;gt;&amp;gt; m = re.split('n', source)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; m &lt;i&gt;# split returns a list &lt;/i&gt;['You', 'g Fra', 'ke', 'stei', '']&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Patterns: special characters&lt;span&gt;&amp;nbsp;&lt;/span&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;벨트 아래에 있는 식(일치), 검색() 및 findall() 및 sub()을 사용하여 작성에 대한 세부 정보를 살펴보겠습니다. 사용자가 만든 패턴은 다음 함수에 적용됩니다.&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;bull; 특수하지 않은 문자와 문자 그대로 일치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; 가 있는 \n을 제외한 모든 단일 문자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; *가 포함된 임의의 숫자(0 포함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; 선택 사항(0 또는 1)은?&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;\d a single digit&lt;br /&gt;\D a single non-digit&lt;br /&gt;\w an alphanumeric character&lt;br /&gt;\W a non-alphanumeric character&lt;br /&gt;\s a whitespace character&lt;br /&gt;\S a non-whitespace character&lt;br /&gt;\b a word boundary (between a\wand a\W, in either order) \B a non-word boundary&lt;span&gt;&amp;nbsp;&lt;/span&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;파이썬 문자열 모듈에는 테스트에 사용할 수 있는 미리 정의된 문자열 상수가 있습니다. 인쇄 가능한 ASCII 문자(경우, 숫자, 공백 문자, 구두점 등): 100개의 인쇄 가능한 ASCII 문자를 사용합니다.&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;&amp;gt;&amp;gt;&amp;gt; import string&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; printable = string.printable&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; len(printable)&lt;br /&gt;100&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; printable[0:50] '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; printable[50:] 'OPQRSTUVWXYZ!&quot;#$%&amp;amp;\'()*+,-./:;&amp;lt;=&amp;gt;?@[\\]^_`{|}~ \t\n\r\x0b\x0c'&lt;span&gt;&amp;nbsp;&lt;/span&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;&amp;gt;&amp;gt;&amp;gt; re.findall('\d', printable)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']&lt;span&gt;&amp;nbsp;&lt;/span&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;&lt;span&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; re.findall('\w', printable)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b',&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'Y', 'Z', '_']&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;&amp;gt;&amp;gt;&amp;gt; re.findall('\s', printable)&lt;br /&gt;[' ', '\t', '\n', '\r', '\x0b', '\x0c']&lt;span&gt;&amp;nbsp;&lt;/span&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;정규식은 ASCII에만 국한되지 않습니다. \d는 단지 ASCII 문자 '0'에서 '9'까지가 아니라 유니코드가 숫자를 호출하는 것과 일치합니다. FileFormat.info에서 ASCII가 아닌 두 개의 소문자를 추가해 보겠습니다.&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;bull; 세 개의 ASCII 문자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; \w와 일치하지 않아야 하는 세 개의 구두점 기호&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; 서클플렉스를 포함한 유니코드 라틴 소형 문자 E(\u00ea)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; BREVE가 포함된 유니코드 라틴 소형 문자 E(\u0115)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;gt;&amp;gt;&amp;gt; x = 'abc' + '-/*' + '\u00ea' + '\u0115' &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예상대로 이 패턴에는 다음과 같은 문자만 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; re.findall('\w', x)&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;['a', 'b', 'c', '&amp;ecirc;', 'ĕ']&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Patterns: using specifiers&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 아래에 나와 있는 일반적인 ex press pressions의 주요 패턴 지정자를 사용하여 &quot;punctionation pizza&quot;를 만들어 봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표에서 expr 및 다른 기울임꼴 단어는 유효한 정규식을 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;abc&lt;br /&gt;(&lt;i&gt;expr&lt;/i&gt;) &lt;i&gt;expr1&lt;/i&gt;|&lt;i&gt;expr2&lt;br /&gt;&lt;/i&gt;.&lt;br /&gt;^&lt;br /&gt;$&lt;br /&gt;&lt;i&gt;prev&lt;/i&gt;?&lt;br /&gt;&lt;i&gt;prev&lt;/i&gt;*&lt;br /&gt;&lt;i&gt;prev &lt;/i&gt;*?&lt;br /&gt;&lt;i&gt;prev&lt;/i&gt;+&lt;br /&gt;&lt;i&gt;prev &lt;/i&gt;+? &lt;i&gt;prev&lt;/i&gt;{&lt;i&gt;m&lt;/i&gt;} &lt;i&gt;prev&lt;/i&gt;{&lt;i&gt;m&lt;/i&gt;, &lt;i&gt;n&lt;/i&gt;} &lt;i&gt;prev&lt;/i&gt;{&lt;i&gt;m&lt;/i&gt;, &lt;i&gt;n&lt;/i&gt;}? [&lt;i&gt;abc&lt;/i&gt;] [^&lt;i&gt;abc&lt;/i&gt;]&lt;br /&gt;&lt;i&gt;prev &lt;/i&gt;(?= &lt;i&gt;next &lt;/i&gt;) &lt;i&gt;prev &lt;/i&gt;(?! &lt;i&gt;next &lt;/i&gt;) (?&amp;lt;=&lt;i&gt;prev&lt;/i&gt;)&lt;i&gt;next &lt;/i&gt;(?&amp;lt;!&lt;i&gt;prev&lt;/i&gt;)&lt;i&gt;next&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;literal abc&lt;br /&gt;&lt;i&gt;expr&lt;br /&gt;expr1 &lt;/i&gt;or &lt;i&gt;expr2&lt;br /&gt;&lt;/i&gt;any character except \n start of source string end of source string zero or one &lt;i&gt;prev&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;zero or more &lt;i&gt;prev&lt;/i&gt;, as many as possible zero or more &lt;i&gt;prev&lt;/i&gt;, as few as possible one or more &lt;i&gt;prev&lt;/i&gt;, as many as possible one or more &lt;i&gt;prev&lt;/i&gt;, as few as possible &lt;i&gt;m &lt;/i&gt;consecutive &lt;i&gt;prev&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;m &lt;/i&gt;to &lt;i&gt;n &lt;/i&gt;consecutive &lt;i&gt;prev&lt;/i&gt;, as many as possible &lt;i&gt;m &lt;/i&gt;to &lt;i&gt;n &lt;/i&gt;consecutive &lt;i&gt;prev&lt;/i&gt;, as few as possible aorborc(same asa|b|c)&lt;br /&gt;&lt;i&gt;not &lt;/i&gt;(aorborc)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;prev &lt;/i&gt;if followed by &lt;i&gt;next prev &lt;/i&gt;if &lt;i&gt;not &lt;/i&gt;followed by &lt;i&gt;next next &lt;/i&gt;if preceded by &lt;i&gt;prev next &lt;/i&gt;if &lt;i&gt;not &lt;/i&gt;preceded by &lt;i&gt;prev&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&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;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; source = '''I wish I may, I wish I might&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... Have a dish of fish tonight.'''&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;gt;&amp;gt;&amp;gt; re.findall('wish', source)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;['wish', 'wish']&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;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; re.findall('wish|fish', source)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;['wish', 'wish', 'fish']&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;gt;&amp;gt;&amp;gt; re.findall('^wish', source)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[]&lt;span&gt;&amp;nbsp;&lt;/span&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;gt;&amp;gt;&amp;gt; re.findall('^I wish', source)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;['I wish']&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;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; re.findall('fish$', source)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&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;gt;&amp;gt;&amp;gt; re.findall('fish tonight.$', source)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;['fish tonight.']&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;^ 및 $ 문자를 앵커(anchor)라고 합니다. ^ 검색의 시작 부분에 앵커(anchor)를 지정하고, $는 마침표를 포함하여 줄 끝에 있는 모든 문자와 일치하므로 효과가 있었습니다. 좀 더 정확히 말하자면, 우리는 문자 그대로 일치시키기 위해 점을 탈출해야 한다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; re.findall('fish tonight\.$', source)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;['fish tonight.']&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;w 또는 f를 찾은 다음 ish를 찾습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt;&amp;gt; re.findall('[wf]ish', source)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;['wish', 'wish', 'fish']&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나 이상의 w, s 또는 h 런을 찾습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; re.findall('[wsh]+', source)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;['w', 'sh', 'w', 'sh', 'h', 'sh', 'sh', 'h']&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영숫자가 아닌 ght 다음에 오는 영숫자를 찾습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt;&amp;gt; re.findall('ght\W', source)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;['ght\n', 'ght.']&lt;span&gt;&amp;nbsp;&lt;/span&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;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; re.findall('I (?=wish)', source)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;['I ', 'I ']&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 마지막으로, I 앞에 소원이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt;&amp;gt; re.findall('(?&amp;lt;=I) wish', source)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;[' wish', ' wish']&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;gt;&amp;gt;&amp;gt; re.findall('\bfish', source) []&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 안되죠? 이전포스팅에서 논의한 바와 같이, 파이썬은 문자열에 몇 가지 특수 이스케이프 문자 액터를 사용한다. 예를 들어, \b는 문자열의 백스페이스를 의미하지만 정규식의 미니 언어에서는 단어의 시작을 의미합니다. 정규식 문자열을 정의할 때 파이썬의 원시 문자열을 사용하여 이스케이프 문자를 실수로 사용하지 않도록 합니다. 정규식 패턴 문자열 앞에 항상 r 문자를 넣으십시오. 여기서 설명한 것처럼 파이썬 이스케이프 문자를 사용할 수 없습니다.&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;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; re.findall(r'\bfish', source)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;['fish']&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Patterns: specifying match output&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일치() 또는 검색()을 사용하면 결과 개체 m에서 모든 일치 항목이 m.group()으로 반환됩니다. 패턴을 괄호로 묶으면 일치 항목이 해당 그룹에 저장되며, 이 중 튜플은 다음과 같이 m.group()으로 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; m = re.search(r'(. dish\b).*(\bfish)', source)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; m.group()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'a dish of fish'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; m.groups()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;('a dish', 'fish')&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 패턴을 사용하면(?)P&amp;lt;name&amp;gt;expr), 일치 항목을 그룹에 저장합니다.&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;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; m = re.search(r'(?P&amp;lt;DISH&amp;gt;. dish\b).*(?P&amp;lt;FISH&amp;gt;\bfish)', source)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; m.group()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'a dish of fish'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; m.groups()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;('a dish', 'fish')&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; m.group('DISH')&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'a dish'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; m.group('FISH')&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'fish'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bytes and bytearray&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 3은 다음과 같은 8비트 정수 시퀀스를 도입했으며, 0부터 255까지의 값을 두 가지 유형으로 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; 바이트는 불변입니다. 바이트 튜플처럼 &amp;bull; 바이트 목록처럼 bytray는 변경할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블리스트라는 목록으로 시작하여 다음 예제는 바이트 변수인 바이트 변수와 바이트_array라는 바이어레이 변수를 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt; blist = [1, 2, 3, 255]&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; the_bytes = bytes(blist)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; the_bytes&lt;br /&gt;b'\x01\x02\x03\xff'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; the_byte_array = bytearray(blist) &amp;gt;&amp;gt;&amp;gt; the_byte_array bytearray(b'\x01\x02\x03\xff')&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바이트 값의 표현은 b와 따옴표 문자 다음에 \x02 또는 ASCII charac sequences ters와 같은 16진수 시퀀스로 시작하고 일치하는 따옴표 문자로 끝납니다. 파이썬은 16진수 시퀀스 또는 ASCII 문자를 작은 정수로 변환하지만 유효한 ASCII 인코딩인 바이트 값을 ASCII 문자로 표시합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt;&amp;gt; b'\x61' b'a'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt;&amp;gt; b'\x01abc\xff' b'\x01abc\xff'&lt;span&gt;&amp;nbsp;&lt;/span&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;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; the_bytes[1] = 127&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Traceback (most recent call last):&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;TypeError: 'bytes' object does not support item assignment&lt;span&gt;&amp;nbsp;&lt;/span&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;gt;&amp;gt;&amp;gt; the_byte_array = bytearray(blist) &amp;gt;&amp;gt;&amp;gt; the_byte_array bytearray(b'\x01\x02\x03\xff')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; the_byte_array[1] = 127&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt;&amp;gt; the_byte_array bytearray(b'\x01\x7f\x03\xff')&lt;span&gt;&amp;nbsp;&lt;/span&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;각 값은 0에서 255 사이의 값을 갖는 256 요소 결과를 생성합니다.&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;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; the_bytes = bytes(range(0, 256))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; the_byte_array = bytearray(range(0, 256))&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;바이트 또는 byterray 데이터를 인쇄할 때 Python은 인쇄할 수 없는 바이트에 \x x를 사용하고 인쇄 가능한 바이트에 ASCII 등가(및 \x0a 대신 \n과 같은 일반적인 이스케이프 문자)를 사용합니다. 다음은_bytes의 인쇄된 표현입니다(한 줄당 16바이트를 표시하도록 수동 참조).&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;&amp;gt;&amp;gt;&amp;gt; the_bytes b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f \x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !&quot;#$%&amp;amp;\'()*+,-./&lt;br /&gt;0123456789:;&amp;lt;=&amp;gt;?&lt;br /&gt;@ABCDEFGHIJKLMNO&lt;br /&gt;PQRSTUVWXYZ[\\]^_&lt;br /&gt;`abcdefghijklmno&lt;br /&gt;pqrstuvwxyz{|}~\x7f \x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f \x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f \xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf \xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf \xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf \xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf \xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef \xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자가 아닌 바이트(10개의 정수)이기 때문에 헷갈릴 수 있습니다.&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;7.1. mystery라는 유니코드 문자열을 만들고 값을 '\U0001f4a9'로 지정합니다. 미스테리를 인쇄하다. 유니코드 이름을 찾아보십시오.&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;7.2. 이번에는 UTF-8을 사용하여 미스터리를 바이트 변수 pop_bytes로 인코딩합니다. pop_bytes를 인쇄합니다.&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;7.3. UTF-8을 사용하여 pop_bytes를 문자열 변수 pop_string으로 디코딩한다. pop_string을 인쇄합니다. 팝 스트링이 미스터리와 같은가?&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;7.4. 다음 시를 구식으로 쓰세요. 'roast beef', 'ham', 'head' 및 'clam' 문자열을 다음 문자열로 대체하십시오.&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;My kitty cat likes %s,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;My kitty cat likes %s,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;My kitty cat fell on his %s&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;And now thinks he's a %s.&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;7.5. 새로운 서식을 사용해서 양식 편지를 쓰세요. 다음 문자열을 문자로 저장합니다(다음 연습에서 사용합니다).&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;Dear {salutation} {name},&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Thank you for your letter. We are sorry that our {product} {verbed} in your&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{room}. Please note that it should never be used in a {room}, especially&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;near any {animals}.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Send us your receipt and {amount} for shipping and handling. We will send&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;you another {product} that, in our tests, is {percent}% less likely to&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;have {verbed}.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Thank you for your support.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sincerely,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{spokesman}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;{job_title}&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;7.6. 문자열 키 'salutation', 'name', 'product', 'verbed'(과거 시제 동사), 'room', 'animals', '양', 'per cent', 'spokesman', 'job_title'의 값을 가진 response라는 사전을 만드십시오. 반응 값이 포함된 문자를 인쇄합니다.&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;7.7. 텍스트 작업을 할 때 정규 표현식이 매우 유용합니다. 여러 가지 방법으로 특집 텍스트 샘플에 적용할 것입니다. 이 시는 1866년 제임스 맥킨타이어가 온타리오에서 만들어 국제 순회공연을 위해 보낸 7천 파운드짜리 치즈에 경의를 표하기 위해 쓴 &quot;매머드 치즈 송가&quot;라는 제목의 시입니다. 모든 것을 입력하지 않으려면, 좋아하는 검색 엔진을 사용하여 단어를 잘라내어 파이썬 프로그램에 붙여 넣으십시오. 아니면, 프로젝트 구텐베르크에서 가져와요. 텍스트 문자열을 매머드라고 합니다.&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;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;We have seen thee, queen of cheese,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Lying quietly at your ease,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Gently fanned by evening breeze,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Thy fair form no flies dare seize.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;All gaily dressed soon you'll go&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;To the great Provincial show,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;To be admired by many a beau&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;In the city of Toronto.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Cows numerous as a swarm of bees,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Or as the leaves upon the trees,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;It did require to make thee please,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;And stand unrivalled, queen of cheese.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;May you not receive a scar as&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;We have heard that Mr. Harris&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Intends to send you off as far as&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;The great world's show at Paris.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Of the youth beware of these,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;For some of them might rudely squeeze&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;And bite your cheek, then songs or glees&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;We could not sing, oh! queen of cheese.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;We'rt thou suspended from balloon,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;You'd cast a shade even at noon,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Folks would think it was the moon&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;About to fall and crush them soon.&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;7.8. 파이썬의 정규식 함수를 사용하려면 re 모듈을 가져옵니다. re.findall()을 사용하여 c로 시작하는 모든 단어를 인쇄합니다.&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;7.9. c로 시작하는 4글자를 모두 찾아라.&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;7.10. r로 끝나는 모든 단어를 찾아라.&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;7.11. 정확히 세 개의 모음을 연속으로 포함하는 모든 단어들을 찾아라.&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;7.12. unexlify를 사용하여 이 16진수 문자열(페이지에 맞도록 두 개의 문자열에서 조합됨)을 gif라는 바이트 변수로 변환합니다.&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;span&gt;&amp;nbsp; &lt;/span&gt;'47494638396101000100800000000000ffffff21f9' +&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'0401000000002c000000000100010000020144003b'&lt;/p&gt;</description>
      <category>파이썬코드 binaryd ata</category>
      <category>파이썬코드 format</category>
      <category>파이썬코딩</category>
      <author>&amp;amp;$#@</author>
      <guid isPermaLink="true">https://about-design.tistory.com/9</guid>
      <comments>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%94%A9-format-binary-data-etc#entry9comment</comments>
      <pubDate>Fri, 10 Sep 2021 08:01:56 +0900</pubDate>
    </item>
    <item>
      <title>파이썬코드 Mangle Data Like a Pro</title>
      <link>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%93%9C-Mangle-Data-Like-a-Pro</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;망글데이터_che1.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rcRDR/btreu9XBZ9N/RX9kKbXrVwT3UwWmKqBOck/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rcRDR/btreu9XBZ9N/RX9kKbXrVwT3UwWmKqBOck/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rcRDR/btreu9XBZ9N/RX9kKbXrVwT3UwWmKqBOck/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrcRDR%2Fbtreu9XBZ9N%2FRX9kKbXrVwT3UwWmKqBOck%2Fimg.jpg&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;망글데이터_che1.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size18&quot;&gt;이번 포스팅에서는 데이터 길들이기 위한 여러 가지 기술에 대해 알아봅니다. 이들 대부분은 다음과 같은 내장 파이썬 데이터 유형에 관한 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;줄들&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;텍스트 데이터에 사용되는 유니코드 문자 시퀀스.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;바이트와 바이패스&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이진 데이터에 사용되는 8비트 정수 시퀀스입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;텍스트 문자열&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;텍스트는 대부분의 독자들에게 가장 익숙한 데이터 유형입니다. 따라서 파이썬에서 텍스트 문자열의 강력한 기능 중 몇 가지를 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;유니코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;지금까지 이 책의 모든 텍스트 예제는 평범한 옛 아스키이다. ASCII는 1960년대에 정의되었는데, 그 당시 컴퓨터는 냉장고 크기였고 계산을 조금 더 잘했다. 컴퓨터 저장의 기본 단위는 바이트이며, 바이트는 8비트에 256개의 고유값을 저장할 수 있다. 여러 가지 이유로 ASCII는 대문자 26개, 소문자 26개, 숫자 10개, 일부 펑크음 기호, 일부 띄어쓰기 문자 및 일부 비인쇄 제어 코드 등 7비트(128개의 고유 값)만 사용했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;불행하게도, 세계는 ASCII가 제공하는 것보다 더 많은 글자를 가지고 있다. 당신은 식당에서 핫도그를 먹을 수 있지만, 카페에서는 절대로 게뷔르츠트라미네르1을 먹지 않는다. 더 많은 문자와 기호를 추가하기 위한 많은 시도가 있었고, 여러분은 때때로 그것들을 볼 수 있을 것입니다. 그 중 몇 가지 예를 들 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. 이 와인은 독일에 음라우트가 있는데 프랑스에서는 잃어버려요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; &lt;i&gt;Latin-1&lt;/i&gt;, or &lt;i&gt;ISO 8859-1&lt;br /&gt;&lt;/i&gt;&amp;bull; Windows code page &lt;i&gt;1252&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이들 각각은 8비트를 모두 사용합니다. 하지만 그것조차도 충분하지 않습니다. 특히 비유럽 언어가 필요할 때는요. 유니코드는 수학과 다른 분야의 기호와 더불어 세계 모든 언어의 문자를 정의하는 지속적인 국제 표준이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;유니코드는 플랫폼, 프로그램, 언어와 상관없이 모든 문자에 대해 고유한 번호를 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;유니코드 코드 차트 페이지에는 이미지가 있는 현재 정의된 모든 문자 집합에 대한 링크가 있습니다. 최신 버전(6.2)에서는 각각 고유한 이름과 식별 번호를 가진 110,000자 이상의 문자를 정의합니다. 문자는 평면이라고 하는 8비트 집합으로 나뉩니다. 처음 256면은 기본 다국어 평면이다. 자세한 내용은 유니코드 평면에 대한 위키피디아 페이지를 참조하십시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;파이썬 3 유니코드 문자열&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Python 3 문자열은 바이트 배열이 아닌 유니코드 문자열입니다. 이는 일반 바이트 문자열과 유니코드 문자 문자열을 구분하는 파이썬 2와 비교할 때 가장 큰 변화입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;유니코드 ID 또는 문자 이름을 알고 있는 경우 파이썬 문자열에서 사용할 수 있습니다. 다음은 몇 가지 예입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; \u 다음에 4개의 16진수2는 유니코드의 256개의 기본 다국어 평면 중 하나에 있는 문자를 지정합니다. 처음 두 개는 평면 번호(00에서 FF)이고 다음 두 개는 평면 내 문자 색인입니다. 평면 00은 오래된 ASCII이며, 평면 내의 문자 위치는 ASCII와 동일합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 고차원 문자의 경우 비트가 더 필요합니다. Python 이스케이프 시퀀스는 \U 다음에 8개의 16진수 문자가 나옵니다. 가장 왼쪽 문자는 0이어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 모든 문자에 대해 \N{ 이름 }을(를) 사용하여 표준 이름으로 지정할 수 있습니다. 유니코드 문자 이름 색인 페이지에는 이러한 항목이 나열됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;파이썬 유니코드다 모듈에는 양방향으로 변환하는 기능이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 검색&amp;mdash;대소문자를 구분하지 않는 이름을 사용하고 유니코드 문자를 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 이름 표시&amp;mdash;유니코드 문자를 사용하고 대문자 이름을 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음 예에서는 Python Unicode char act acter를 사용하여 이름을 조회한 다음 이름(원래 문자와 일치해야 함)에서 문자를 다시 검색하는 테스트 함수를 작성하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def unicode_test(value):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;... &amp;nbsp;import unicodedata &lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;name = unicodedata.name(value)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;value2 = unicodedata.lookup(name)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;... &amp;nbsp;print('value=&quot;%s&quot;, name=&quot;%s&quot;, value2=&quot;%s&quot;' % (value, name, value2)) ... &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;일반 ASCII 문자로 시작하는 몇 가지 문자를 사용해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;gt;&amp;gt;&amp;gt; unicode_test('A')&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;value=&quot;A&quot;, name=&quot;LATIN CAPITAL LETTER A&quot;, value2=&quot;A&quot;&lt;/li&gt;
&lt;li&gt;&lt;br /&gt;ASCII punctuation: &lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; unicode_test('$')&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;value=&quot;$&quot;, name=&quot;DOLLAR SIGN&quot;, value2=&quot;$&quot;&lt;/li&gt;
&lt;li&gt;&lt;br /&gt;A Unicode currency character: &lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; unicode_test('\u00a2')&lt;br /&gt;value=&quot;&amp;cent;&quot;, name=&quot;CENT SIGN&quot;, value2=&quot;&amp;cent;&quot; &lt;br /&gt;Another Unicode currency character: &lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; unicode_test('\u20ac')&lt;br /&gt;value=&quot;&amp;euro;&quot;, name=&quot;EURO SIGN&quot;, value2=&quot;&amp;euro;&quot; &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;잠재적으로 발생할 수 있는 유일한 문제는 텍스트를 표시하는 데 사용하는 글꼴의 제한입니다. 모든 글꼴에 모든 유니코드 문자에 대한 이미지가 없는 경우 일부 자리 표시자 문자가 표시될 수 있습니다. 예를 들어, 딩뱃 글꼴의 기호와 같은 스노우맨의 유니코드 기호는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;gt;&amp;gt;&amp;gt; unicode_test('\u2603')&lt;br /&gt;value=&quot;☃&quot;, name=&quot;SNOWMAN&quot;, value2=&quot;☃&quot; &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;카페라는 단어를 파이썬 문자열에 저장하려고 합니다. 한 가지 방법은 파일이나 웹 사이트에서 복사하여 붙여넣기하여 다음 작업을 수행하는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; place = 'caf&amp;eacute;'&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; place&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'caf&amp;eacute;'&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;UTF-8 인코딩을 사용한 원본에서 텍스트에 복사하여 붙여넣었기 때문에 가능했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;최종문자를 어떻게 지정할 수 있습니까? E의 문자 색인을 보면, 급성 라틴 소문자 이름 E의 값이 00E9임을 알 수 있습니다. 방금 사용하던 이름() 및 조회() 함수로 확인해 보겠습니다. 먼저 코드를 입력하여 이름을 가져옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; unicodedata.name('\u00e9') 'LATIN SMALL LETTER E WITH ACUTE'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그런 다음 코드를 조회할 이름을 지정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; unicodedata.lookup('E WITH ACUTE, LATIN SMALL LETTER')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Traceback (most recent call last):&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;KeyError: &quot;undefined character name 'E WITH ACUTE, LATIN SMALL LETTER'&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;유니코드 문자 이름 색인 페이지에 나열된 이름은 표시에 적합하게 정렬되도록 다시 포맷되었습니다. 이러한 이름을 실제 유니코드 이름(파이썬에서 사용하는 이름)으로 변환하려면 쉼표를 제거하고 쉼표 뒤에 있던 이름의 일부를 처음으로 이동합니다. 따라서 급성 라틴 소문자 E를 급성 라틴 소문자 E로 변경합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; unicodedata.lookup('LATIN SMALL LETTER E WITH ACUTE') '&amp;eacute;'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 코드 또는 이름으로 문자열 카페를 지정할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; place = 'caf\u00e9'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; place&lt;br /&gt;'caf&amp;eacute;'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; place = 'caf\N{LATIN SMALL LETTER E WITH ACUTE}' &amp;gt;&amp;gt;&amp;gt; place&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;'caf&amp;eacute;'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앞의 코드 조각에서 문자열에 직접 &amp;eacute;를 삽입했지만 다음을 추가하여 문자열을 만들 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; u_umlaut = '\N{LATIN SMALL LETTER U WITH DIAERESIS}' &amp;gt;&amp;gt;&amp;gt; u_umlaut&lt;br /&gt;'&amp;uuml;'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; drink = 'Gew' + u_umlaut + 'rztraminer'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; print('Now I can finally have my', drink, 'in a', place) Now I can finally have my Gew&amp;uuml;rztraminer in a caf&amp;eacute;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;문자열 렌 함수는 바이트가 아닌 유니코드 문자를 카운트합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; len('$')&lt;br /&gt;1&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; len('\U0001f47b') 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Encode and decode with UTF-8&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;일반적인 문자열을 처리할 때 파이썬에서 각 유니코드 문자를 저장하는 방법에 대해 걱정할 필요가 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그러나 외부와 데이터를 교환할 때는 두 가지 사항이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;문자 문자열을 바이트로 인코딩하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;문자 문자열로 바이트를 디코딩하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;유니코드에 64,000자 미만의 문자가 있으면 각 유니코드 문자 ID를 2바이트로 저장할 수 있습니다. 불행하게도, 더 있습니다. 각 ID를 3, 4바이트 단위로 인코딩할 수 있지만, 그렇게 하면 공통 텍스트 문자열에 대한 메모리 및 디스크 저장 공간이 3, 4배 증가합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Unix 개발자들에게 친숙한 이름을 가진 Ken Thompson과 Rob Pike는 어느 날 밤 뉴저지의 한 식당에서 UTF-8 동적 인코딩 방식에 서명했다. 유니코드 문자당 1~4바이트를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; ASC용 1바이트Ⅱ&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 대부분의 라틴어에서 파생된 언어(키릴어는 아님)의 경우 2바이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 나머지 다국어 평면의 경우 3바이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 일부 아시아 언어와 기호를 포함한 나머지 4바이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;UTF-8은 Python, Linux 및 HTML의 표준 텍스트 인코딩입니다. 빠르고 완전하며 잘 작동합니다. 만약 당신이 코드 전체에 UTF-8 인코딩을 사용한다면, 삶은 다양한 인코딩에 들어가고 나오는 것보다 훨씬 쉬울 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;웹 페이지와 같은 다른 원본에서 복사하여 붙여넣기하여 파이썬 문자열을 만드는 경우, 소스가 UTF-8 형식으로 인코딩되어 있는지 확인하십시오. Latin-1 또는 Windows 1252로 인코딩된 텍스트가 파이썬 문자열로 복사되어 나중에 잘못된 바이트 시퀀스로 돌출되는 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Encoding&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;문자열을 바이트로 인코딩합니다. 문자열 인코딩() 함수의 첫 번째 인수는 en coding 부호화 이름입니다. 선택사항은 표 7-1에 제시된 것을 포함한다.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Table 7-1. Encodings&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;'ascii' Good old seven-bit ASCII&lt;br /&gt;'utf-8' Eight-bit variable-length encoding, and what you almost always want to use&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;'latin-1' Also known as ISO 8859-1&lt;br /&gt;'cp-1252' A common Windows encoding&lt;/li&gt;
&lt;li&gt;'unicode-escape' Python Unicode literal format,\u&lt;i&gt;xxxx &lt;/i&gt;or\U&lt;i&gt;xxxxxxxx&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;UTF-8로 인코딩할 수 있습니다. 유니코드 문자열 '\u2603'을 스노우맨 이름에 할당해 보겠습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; snowman = '\u2603'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;스노우맨은 내부적으로 저장하는 데 필요한 바이트 수에 관계없이 단일 문자를 가진 파이썬 유니코드 문자열입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; len(snowman)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;1&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음으로 이 유니코드 문자를 바이트 순서로 인코딩해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; ds = snowman.encode('utf-8')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앞서 언급했듯이 UTF-8은 가변 길이 인코딩입니다. 이 경우, 3개를 사용했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;단일 눈사람 유니코드 문자를 인코딩하는 바이트:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; len(ds)&lt;br /&gt;3&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; ds b'\xe2\x98\x83'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 len()은 ds가 바이트 변수이기 때문에 바이트 수를 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;UTF-8 이외의 인코딩을 사용할 수 있지만 인코딩으로 유니코드 문자열을 처리할 수 없는 경우 오류가 발생합니다. 예를 들어, ASCII 인코딩을 사용하는 경우 유니코드 문자도 유효한 ASCII 문자가 아니면 실패합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; ds = snowman.encode('ascii')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Traceback (most recent call last):&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;UnicodeEncodeError: 'ascii' codec can't encode character '\u2603' in position 0: ordinal not in range(128)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;인코딩() 함수는 인코딩 예외를 방지하는 데 도움이 되는 두 번째 인수를 사용합니다. 이전 예에서 볼 수 있는 기본값은 '엄격'입니다. ASC가 아닌 경우 유니코드EncodeError가 발생합니다.II 캐릭터. 다른 인코딩도 있습니다. 인코딩되지 않는 것을 버리려면 '무시'를 사용하십시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; snowman.encode('ascii', 'ignore')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;b''&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;알 수 없는 문자를 대체하려면 '바꾸기'를 사용하십시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; snowman.encode('ascii', 'replace')&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;b'?'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;유니코드와 같은 파이썬 유니코드 문자 문자열을 만들려면 '백슬래시 바꾸기'를 사용하십시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;escape:&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; snowman.encode('ascii', 'backslashreplace')&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;b'\\u2603'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;유니코드 이스케이프 시퀀스의 인쇄 가능한 버전이 필요한 경우 이 옵션을 사용합니다. 다음은 웹 페이지에서 사용할 수 있는 문자 엔터티 문자열을 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; snowman.encode('ascii', 'xmlcharrefreplace')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;b'&amp;amp;#9731;'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;디코딩&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;바이트 문자열을 유니코드 문자열로 디코딩합니다. 일부 외부 소스(파일, 데이터베이스, 웹 사이트, 네트워크 API 등)에서 텍스트를 가져올 때마다 바이트 문자열로 인코딩됩니다. 까다로운 부분은 어떤 인코딩이 실제로 사용되었는지 알기 때문에 이를 역방향으로 실행하고 유니코드 문자열을 가져올 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;문제는 바이트 문자열 자체에 사용된 인코딩을 나타내는 것은 없다는 것이다. 나는 앞서 웹사이트에서 복사와 붙여넣기의 위험에 대해 언급했다. 여러분은 아마도 보통 오래된 ASCII 문자가 있어야 하는 홀수 문자로 웹사이트를 방문한 적이 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;'카페' 값을 사용하여 플레이스라는 유니코드 문자열을 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; place = 'caf\u00e9' &amp;gt;&amp;gt;&amp;gt; place&lt;br /&gt;'caf&amp;eacute;'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; type(place)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;lt;class 'str'&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;place_bytes라는 바이트 변수로 UTF-8 형식으로 인코딩합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; place_bytes = place.encode('utf-8') &amp;gt;&amp;gt;&amp;gt; place_bytes&lt;br /&gt;b'caf\xc3\xa9'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; type(place_bytes)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;lt;class 'bytes'&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;place_bytes는 5바이트입니다. 처음 3개는 ASCII (UTF-8의 강도)와 동일하며, 마지막 2개는 '&amp;eacute;'를 인코딩한다. 이제 바이트 문자열을 유니코드 문자열로 다시 디코딩해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; place2 = place_bytes.decode('utf-8')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; place2&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'caf&amp;eacute;'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;UTF-8로 인코딩하고 UTF-8로 디코딩했기 때문에 가능했습니다. 다른 인코딩에서 디코딩하라고 하면 어떨까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; place3 = place_bytes.decode('ascii')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Traceback (most recent call last):&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 3: ordinal not in range(128)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;바이트 값 0xc3이 ASCII에서 잘못되었기 때문에 ASCII 디코더가 예외를 발생시켰습니다. 128 (헥스 80)과 255 (헥스 FF) 사이의 값이 UTF-8과 동일하지는 않지만 합법적인 일부 8비트 문자 집합 인코딩이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; place4 = place_bytes.decode('latin-1')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; place4&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'caf&amp;Atilde;&amp;copy;'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; place5 = place_bytes.decode('windows-1252')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; place5&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'caf&amp;Atilde;&amp;copy;'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Urk.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 이야기의 교훈은 가능할 때마다 UTF-8 인코딩을 사용하라는 것이다. 모든 곳에서 작동하고 지원되며 모든 유니코드 문자를 표현할 수 있으며 빠르게 디코딩되고 인코딩됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 이야기의 교훈은 가능할 때마다 UTF-8 인코딩을 사용하라는 것이다. 모든 곳에서 작동하고 지원되며 모든 유니코드 문자를 표현할 수 있으며 빠르게 디코딩되고 인코딩됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;자세한 정보는&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;자세한 내용은 다음 링크를 참조하십시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 유니코드 HOWTO&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 실용 유니코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;bull; &lt;/span&gt;모든&lt;span&gt; &lt;/span&gt;소프트웨어&lt;span&gt; &lt;/span&gt;개발자가&lt;span&gt; &lt;/span&gt;유니코드&lt;span&gt; &lt;/span&gt;및&lt;span&gt; &lt;/span&gt;문자&lt;span&gt; &lt;/span&gt;집합에&lt;span&gt; &lt;/span&gt;대해&lt;span&gt; &lt;/span&gt;절대적으로&lt;span&gt; &lt;/span&gt;알아야&lt;span&gt; &lt;/span&gt;하는&lt;span&gt; &lt;/span&gt;절대&lt;span&gt; &lt;/span&gt;최소값&lt;span&gt;(&lt;/span&gt;변명&lt;span&gt; &lt;/span&gt;없음&lt;/p&gt;</description>
      <category>파이썬코드</category>
      <category>파이썬코딩</category>
      <author>&amp;amp;$#@</author>
      <guid isPermaLink="true">https://about-design.tistory.com/8</guid>
      <comments>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%93%9C-Mangle-Data-Like-a-Pro#entry8comment</comments>
      <pubDate>Thu, 9 Sep 2021 06:59:14 +0900</pubDate>
    </item>
    <item>
      <title>파이상자 Handle Missing Keys with setdefault() and defaultdict()</title>
      <link>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%83%81%EC%9E%90-Handle-Missing-Keys-with-setdefault-and-defaultdict</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이박스.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v10gq/btrepu7Z3sa/clIoxXdOkc7mWNUQRYmMhk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v10gq/btrepu7Z3sa/clIoxXdOkc7mWNUQRYmMhk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v10gq/btrepu7Z3sa/clIoxXdOkc7mWNUQRYmMhk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv10gq%2Fbtrepu7Z3sa%2FclIoxXdOkc7mWNUQRYmMhk%2Fimg.jpg&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이박스.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size18&quot;&gt;Handle Missing Keys with setdefault() and defaultdict()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;존재하지 않는 키로 사전에 액세스하려고 하면 탁월한 효과를 얻을 수 있습니다. 사전 get() 함수를 사용하여 기본값을 반환하면 예외가 발생하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;setdefault() 함수는 get()와 같지만 키가 없는 경우 사전에 항목을 할당합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; periodic_table = {'Hydrogen': 1, 'Helium': 2} &amp;gt;&amp;gt;&amp;gt; print(periodic_table)&lt;br /&gt;{'Helium': 2, 'Hydrogen': 1}&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;키가 사전에 없는 경우 새 값이 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; carbon = periodic_table.setdefault('Carbon', 12)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; carbon&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;12&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; periodic_table&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;{'Helium': 2, 'Carbon': 12, 'Hydrogen': 1}&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기존 키에 다른 기본값을 할당하려고 하면 원래 값이 반환됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아무것도 변경되지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; helium = periodic_table.setdefault('Helium', 947)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; helium&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;2&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; periodic_table&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;{'Helium': 2, 'Carbon': 12, 'Hydrogen': 1}&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;defaultdict()도 비슷하지만 사전을 만들 때 앞에 있는 모든 새 키의 기본값을 지정합니다. 인수는 함수입니다. 이 예에서는 int()라고 하는 함수 int를 전달하고 정수 0을 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; from collections import defaultdict &amp;gt;&amp;gt;&amp;gt; periodic_table = defaultdict(int)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 결측값은 정수(int)이며 값은 0입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; periodic_table['Hydrogen'] = 1&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; periodic_table['Lead']&lt;br /&gt;0&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; periodic_table&lt;br /&gt;defaultdict(&amp;lt;class 'int'&amp;gt;, {'Lead': 0, 'Hydrogen': 1})&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;defaultdict() 인수는 누락된 키에 할당할 값을 반환하는 함수입니다. 다음 예에서 no_idea()는 필요할 때 값을 반환하기 위해 실행됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; from collections import defaultdict &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; def no_idea():&lt;br /&gt;... return 'Huh?'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; bestiary = defaultdict(no_idea)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; bestiary['A'] = 'Abominable Snowman'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; bestiary['B'] = 'Basilisk'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; bestiary['A']&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'Abominable Snowman'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; bestiary['B']&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;'Basilisk'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; bestiary['C']&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'Huh?'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;int() 함수, list() 함수 또는 dict() 함수를 사용하여 해당 유형의 기본 빈 값을 반환할 수 있습니다. int()는 0을 반환하고 list()는 빈 목록([])을 반환하며 dict()는 빈 사전({})을 반환합니다. 인수를 생략하면 새 키의 초기 값이 없음으로 설정됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그런데 통화 내에서 람다를 사용하여 기본 설정 함수를 정의할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; bestiary = defaultdict(lambda: 'Huh?') &amp;gt;&amp;gt;&amp;gt; bestiary['E']&lt;br /&gt;'Huh?'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;int를 사용하는 것도 자신만의 카운터를 만드는 한 가지 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; from collections import defaultdict&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; food_counter = defaultdict(int)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; for food in ['spam', 'spam', 'eggs', 'spam']: ... food_counter[food] += 1&lt;br /&gt;...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; for food, count in food_counter.items():&lt;br /&gt;... print(food, count)&lt;br /&gt;...&lt;br /&gt;eggs 1&lt;br /&gt;spam 3&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앞의 예에서, food_counter가 디폴트딕트 대신 일반 사전이었다면, 파이썬은 초기화되지 않았기 때문에 food_counter[food] 사전 요소를 증가시키려고 할 때마다 예외를 제기했을 것이다. 여기에 표시된 것처럼 추가 작업이 필요했을 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; dict_counter = {}&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; for food in ['spam', 'spam', 'eggs', 'spam']:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; for food, count in dict_counter.items(): ... print(food, count)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;...&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;spam 3 eggs 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Count Items with Counter()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;카운터 얘기가 나와서 말인데, 표준 라이브러리에는 이전 예제와 같은 작업을 수행하는 라이브러리가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; from collections import Counter&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; breakfast = ['spam', 'spam', 'eggs', 'spam'] &amp;gt;&amp;gt;&amp;gt; breakfast_counter = Counter(breakfast)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; breakfast_counter&lt;br /&gt;Counter({'spam': 3, 'eggs': 1})&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;most_common() 함수는 모든 요소를 내림차순으로 반환하거나 카운트가 주어진 경우 최상위 카운트 요소만 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; breakfast_counter.most_common()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;[('spam', 3), ('eggs', 1)]&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; breakfast_counter.most_common(1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;[('spam', 3)]&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;카운터를 결합할 수 있습니다. 먼저, breakfast_counter에 무엇이 있는지 다시 한 번 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; breakfast_counter&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; Counter({'spam': 3, 'eggs': 1})&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이번에는 점심이라고 불리는 새로운 목록과 점심 카운터라고 불리는 카운터를 만들겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; lunch = ['eggs', 'eggs', 'bacon']&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; lunch_counter = Counter(lunch)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; lunch_counter&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Counter({'eggs': 2, 'bacon': 1})&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;두 카운터를 결합하는 첫 번째 방법은 +를 사용하는 덧셈입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; breakfast_counter + lunch_counter&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Counter({'spam': 3, 'eggs': 3, 'bacon': 1})&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;예상하신 대로 -를 사용하여 카운터 하나를 다른 카운터에서 뺍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아침은 안먹고 점심은 안먹어?&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; breakfast_counter - lunch_counter&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Counter({'spam': 3})&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;좋아요, 그럼 아침으로 먹을 수 없는 점심으로 뭘 먹을 수 있을까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; lunch_counter - breakfast_counter&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Counter({'bacon': 1, 'eggs': 1})&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이전의 세트와 마찬가지로 교차로 op‐ erator &amp;amp;:를 사용하여 공통 항목을 얻을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; breakfast_counter &amp;amp; lunch_counter&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Counter({'eggs': 1})&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;교차로는 공통 요소(계란)를 더 낮은 수로 선택했습니다. 이것은 말이 된다: 아침식사는 계란 한 개만 제공했기 때문에, 그것이 일반적인 계산이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;마지막으로, 유니언 연산자를 사용하여 모든 항목을 가져올 수 있습니다. |:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; breakfast_counter | lunch_counter&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Counter({'spam': 3, 'eggs': 2, 'bacon': 1})&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;'계란'이라는 항목은 다시 두 가지 모두에 공통적이었다. 조합은 덧셈과 달리 인원수를 늘리지 않고 더 큰 숫자를 골랐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Order by Key with OrderedDict()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 책의 초기 장에 있는 많은 코드 예제는 사전의 키 순서를 예측할 수 없다는 것을 보여준다. 키 a, b 및 c는 해당 순서로 추가할 수 있지만 키()는 c, a, b를 반환할 수 있다. 여기 이전포스팅에서 용도를 변경한 예가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; quotes = {&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'Moe': 'A wise guy, huh?',&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'Larry': 'Ow!',&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;... &amp;nbsp;'Curly': 'Nyuk nyuk!', ... }&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; for stooge in quotes:&lt;br /&gt;... print(stooge)&lt;br /&gt;...&lt;br /&gt;Larry&lt;br /&gt;Curly&lt;br /&gt;Moe &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;OrderedDict()는 키 추가 순서를 기억하고 반복자로부터 동일한 순서로 반환합니다. (키, 값) 튜플 순서에서 OrderedDict를 만들어 보십시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;gt;&amp;gt;&amp;gt; from collections import OrderedDict &amp;gt;&amp;gt;&amp;gt; quotes = OrderedDict([ &lt;/li&gt;
&lt;li&gt;Stack + Queue == deque &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데크(데크 발음)는 스택과 큐의 기능을 모두 갖춘 이중 종단 큐입니다. 시퀀스의 양쪽 끝에서 항목을 추가 및 삭제할 때 유용합니다. 여기, 우리는 단어 양쪽 끝에서 중간까지 페일린 드롬인지 알아봅니다. popleft() 함수는 데크에서 맨 왼쪽 항목을 제거했다가 반환합니다. pop()은 맨 오른쪽 항목을 제거했다가 반환합니다. 함께, 그들은 끝에서 중간까지 일을 합니다. 끝 문자가 일치하는 한 중간에 도달할 때까지 계속 터집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def palindrome(word):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; palindrome('a')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;True&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;from collections import deque dq = deque(word)&lt;br /&gt;while len(dq) &amp;gt; 1:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;if dq.popleft() != dq.pop(): return False&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;return True&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; palindrome('racecar')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;True&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; palindrome('')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;True&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; palindrome('radar')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;True&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; palindrome('halibut')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;False&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;저는 이것을 단순한 데크의 삽화로 사용했습니다. 만약 당신이 빠른 회문 체커를 원한다면, 단지 문자열을 그것의 반대와 비교하는 것이 훨씬 더 간단할 것이다. Python에는 문자열에 대한 역함수가 없지만 여기에 표시된 것처럼 슬라이스로 문자열을 역방향으로 사용할 수 있는 방법이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def another_palindrome(word): ... return word == word[::-1] ...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; another_palindrome('radar') True&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; another_palindrome('halibut')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;False&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Iterate over Code Structures with itertools&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이터툴스는 특수 목적 반복기 기능을 포함한다. 각각 ...에 대해 a 내에서 호출하면 한 번에 하나의 항목을 반환합니다. 호출 사이의 상태를 기억합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;chain은 마치 하나의 참을 수 있는 것처럼 그 논거를 통과한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import itertools&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; for item in itertools.chain([1, 2], ['a', 'b']): ... print(item)&lt;br /&gt;...&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;a&lt;br /&gt;b&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;cycle()은 무한 반복자로, 그 인수를 순환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import itertools&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; for item in itertools.cycle([1, 2]): ... print(item)&lt;br /&gt;...&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기타 등등.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;누적은 누적된 값을 계산합니다. 기본적으로 합계가 계산됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import itertools&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; for item in itertools.accumulate([1, 2, 3, 4]): ... print(item)&lt;br /&gt;...&lt;br /&gt;1&lt;br /&gt;3&lt;br /&gt;6&lt;br /&gt;10&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;누적()할 두 번째 인수로 함수를 제공할 수 있으며, 추가 대신 이 인수가 사용됩니다. 함수는 두 개의 인수를 사용하여 단일 결과를 반환해야 합니다. 이 예제에서는 누적 제품을 계산합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import itertools&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; def multiply(a, b):&lt;br /&gt;... returna*b&lt;br /&gt;...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; for item in itertools.accumulate([1, 2, 3, 4], multiply): ... print(item)&lt;br /&gt;...&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;6&lt;br /&gt;24&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이터툴즈 모듈에는 더 많은 기능이 있으며, 특히 필요에 따라 시간을 절약할 수 있는 조합과 순열에 대한 기능이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Print Nicely with pprint()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;모든 예제는 인쇄()(또는 대화형 인터프리터의 변수 이름만)를 사용하여 인쇄했습니다. 때때로, 그 결과는 읽기 어렵다. 우리는 print 와 같은 예쁜 프린터가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; from pprint import pprint &amp;gt;&amp;gt;&amp;gt; quotes = OrderedDict([&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;('Moe', 'A wise guy, huh?'),&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;('Larry', 'Ow!'),&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;('Curly', 'Nyuk nyuk!'),&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;])&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그냥 오래된 인쇄물은 물건들을 그냥 저기에 버립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;gt;&amp;gt;&amp;gt; print(quotes) &lt;br /&gt;OrderedDict([('Moe', 'A wise guy, huh?'), ('Larry', 'Ow!'), ('Curly', 'Nyuk nyuk!')])&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그러나 pprint()는 가독성을 높이기 위해 요소를 정렬하려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; pprint(quotes)&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;{'Moe': 'A wise guy, huh?',&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;'Larry': 'Ow!',&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'Curly': 'Nyuk nyuk!'}&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;More Batteries: Get Other Python Code&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때때로, 표준 라이브러리는 여러분이 필요로 하는 것을 가지고 있지 않거나, 아주 올바른 방법으로 그것을 하지 않습니다. 오픈 소스, 타사 파이썬 소프트웨어가 전 세계에 걸쳐 있습니다. 좋은 리소스는 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;bull; PyPi (also known as the Cheese Shop, after an old Monty Python skit)&lt;/li&gt;
&lt;li&gt;&amp;bull; github&lt;/li&gt;
&lt;li&gt;&amp;bull; readthedocs&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;activestate에서 더 작은 코드 예제를 많이 볼 수 있습니다.&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;이 책에 있는 거의 모든 파이썬 코드는 모든 내장 및 표준 라이브러리를 포함하는 컴퓨터에 표준 파이썬 설치를 사용합니다. 외부 패키지는 다음과 같은 위치에 있습니다. 1장에서 요청을 언급했으며, 222페이지의 &quot;표준 라이브러리 너머: 요청&quot;에서 자세한 내용을 설명합니다. 부록 D는 다른 많은 너트 앤 볼트 개발 세부사항과 함께 타사 파이썬 소프트웨어를 설치하는 방법을 보여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해야 할 일&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5.1. zoo.py이라는 파일을 만듭니다. 여기에서 '매일 9-5 열기' 문자열을 인쇄하는 hours()라는 함수를 정의합니다. 그런 다음 대화형 통역기를 사용하여 동물원 모듈을 가져오고 시간() 기능을 호출합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5.2. 대화형 통역기에서 동물원 모듈을 menagerie로 가져오고 시간() 기능을 호출한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5.3. 통역실에 머무르면서 동물원으로부터 직접 시간() 기능을 가져와 전화한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5.4. 시간() 기능을 정보로 가져와 호출합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5.5. 키-값 쌍 'a'가 1, 'b': 2, 'c'인 일반 사전을 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3번, 그리고 인쇄하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5.6. 5.5에 나열된 동일한 쌍으로 팬시라고 불리는 OrderedDict를 만들어 인쇄합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;일반과 같은 순서로 인쇄되었습니까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5.7. dict_of_lists&lt;span&gt;라는&lt;/span&gt; &lt;span&gt;디폴트딕트를&lt;/span&gt; &lt;span&gt;만들어&lt;/span&gt; &lt;span&gt;인수&lt;/span&gt; &lt;span&gt;목록을&lt;/span&gt; &lt;span&gt;전달합니다&lt;/span&gt;. &lt;span&gt;목록을&lt;/span&gt; dict_of_lists['a']&lt;span&gt;로&lt;/span&gt; &lt;span&gt;만들고&lt;/span&gt; &lt;span&gt;한&lt;/span&gt; &lt;span&gt;번의&lt;/span&gt; &lt;span&gt;할당으로&lt;/span&gt; 'something for a' &lt;span&gt;값을&lt;/span&gt; &lt;span&gt;추가합니다&lt;/span&gt;. dict_of_lists['a']&lt;span&gt;를&lt;/span&gt; &lt;span&gt;인쇄합니다&lt;/span&gt;.&lt;/p&gt;</description>
      <category>파이썬코드</category>
      <category>파이썬코딩</category>
      <author>&amp;amp;$#@</author>
      <guid isPermaLink="true">https://about-design.tistory.com/7</guid>
      <comments>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%83%81%EC%9E%90-Handle-Missing-Keys-with-setdefault-and-defaultdict#entry7comment</comments>
      <pubDate>Wed, 8 Sep 2021 06:25:04 +0900</pubDate>
    </item>
    <item>
      <title>파이 상자: 모듈, 패키지 및 프로그램</title>
      <link>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4-%EC%83%81%EC%9E%90-%EB%AA%A8%EB%93%88-%ED%8C%A8%ED%82%A4%EC%A7%80-%EB%B0%8F-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코드모듈1.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9SJv9/btrd144dHYX/WS75XiGriLlvBTg9XY9p80/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9SJv9/btrd144dHYX/WS75XiGriLlvBTg9XY9p80/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9SJv9/btrd144dHYX/WS75XiGriLlvBTg9XY9p80/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9SJv9%2Fbtrd144dHYX%2FWS75XiGriLlvBTg9XY9p80%2Fimg.jpg&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코드모듈1.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size18&quot;&gt;상향식 상향식 상향식에서는 내장 데이터 유형에서 점점 더 큰 데이터 및 코드 구조를 구축하는 방식으로 발전해 왔습니다. 이 챕터에서는 마지막으로 파이썬에서 사실적이고 큰 프로그램을 작성하는 방법에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Standalone Programs&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;지금까지 Python의 대화형 인터프리터 내에서 다음과 같은 코드 조각을 작성하고 실행했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; print(&quot;This interactive snippet works.&quot;) This interactive snippet works.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 첫 번째 독립 실행형 프로그램을 만들어 보겠습니다. 컴퓨터에서 Python 코드 한 줄이 포함된 test1.py이라는 파일을 만드십시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;print(&quot;This standalone program works!&quot;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt; 프롬프트는 없으며 Python 코드 한 줄만 표시됩니다. 다음 항목이 있는지 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;인쇄 전에 라인에 자국이 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;텍스트 터미널 또는 터미널 창에서 Python을 실행하는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Python 프로그램과 프로그램 파일 이름:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;$ python test1.py&lt;br /&gt;This standalone program works!&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;지금까지 이 책에서 본 대화형 스니펫을 모두 파일로 저장하고 직접 실행할 수 있습니다. ▲를 잘라내어 붙여넣을 경우, 초기 &amp;gt;&amp;gt; 및 ...을(를) 삭제해야 합니다. (최종 공간을 확보합니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Command-Line Arguments&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;컴퓨터에서 다음 두 줄이 포함된 test2.py 파일을 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;import sys&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;print('Program arguments:', sys.argv)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 이 프로그램을 실행하려면 현재 버전의 Python을 사용하십시오. 이게 어떻게 보일지 알 수 있어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;표준 셸 프로그램을 사용하는 Linux 또는 Mac OS X 터미널 창:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;$ python test2.py&lt;br /&gt;Program arguments: ['test2.py']&lt;br /&gt;$ python test2.py tra la la&lt;br /&gt;Program arguments: ['test2.py', 'tra', 'la', 'la']&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Modules and the import Statement&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Python 코드를 두 개 이상의 파일에서 만들고 사용하는 한 단계 더 나아갈 것입니다. 모듈은 Python 코드의 파일일 뿐입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 책의 텍스트는 단어, 문장, 단락, 장 등의 계층 구조로 구성되어 있습니다. 그렇지 않으면 한두 페이지 후에 읽을 수 없습니다. 코드는 대략 비슷한 상향식 구성을 가지고 있습니다. 데이터 유형은 단어, 문장은 문장, 함수는 단락, 모듈은 장과 같습니다. 비유를 계속하자면, 이 책에서 제가 프로그래밍 8장에서 설명할 내용은 다른 모듈의 코드를 참조하는 것과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우리는 수입 명세서를 사용하여 다른 모듈의 코드를 참조합니다. 이렇게 하면 가져온 모듈의 코드와 변수를 프로그램에서 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Import a Module&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;가져오기 문을 가장 간단하게 사용하는 것은 가져오기 모듈입니다. 여기서 module은 .py 확장자가 없는 다른 Python 파일의 이름입니다. 기상 관측소를 시뮬레이션해서 기상 보고서를 출력해 봅시다. 하나의 메인 프로그램이 보고서를 인쇄하고, 단일 기능으로 별도의 모듈이 보고서에 사용된 날씨 설명을 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기 메인 프로그램이 있습니다.py):&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;import report&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;description = report.get_description() print(&quot;Today's weather:&quot;, description)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음은 모듈(report.py)입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;def get_description(): &lt;i&gt;# see the docstring below? &quot;&quot;&quot;Return random weather, just like the pros&quot;&quot;&quot; &lt;/i&gt;from random import choice&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;possibilities = ['rain', 'snow', 'sleet', 'fog', 'sun', 'who knows'] return choice(possibilities)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 두 파일이 동일한 디렉토리에 있고 Python이 weather▲ man.py을 메인 프로그램으로 실행하도록 지시하면, Python은 보고서 모듈에 액세스하여 get_tription tion 함수를 실행합니다. 문자열 목록에서 임의의 결과를 반환하기 위해 이 버전의 get_description()을 작성했습니다. 따라서 기본 프로그램은 다음과 같이 반환되고 인쇄됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;$ python weatherman.py Today's weather: who knows $ python weatherman.py Today's weather: sun&lt;br /&gt;$ python weatherman.py Today's weather: sleet&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우리는 수입품을 두 곳에서 사용했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 메인 프로그램 weatherman.py에서 모듈 보고서를 가져왔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 모듈 파일 report.py에서 get_discription unction 함수가 Python의 표준 랜덤 모듈에서 choice 함수를 가져왔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우리는 또한 수입품을 두 가지 다른 방법으로 사용했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 주요 프로그램이 import report를 호출한 후 report.get_descrip을 실행했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이온화&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 랜덤 가져오기에서 호출된 report.py의 get_discription function&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;선택 후 실행(가능성)했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;첫 번째 경우 보고서 모듈 전체를 가져오지만 report.를 접두사로 사용해야 get_description()이(가) 가능합니다. report.py의 모든 내용은 보고서 이름 앞에 있는 보고서만 붙이면 주 프로그램에서 사용할 수 있습니다. 모듈의 내용을 모듈 이름으로 한정함으로써 이름 충돌이 발생하는 것을 방지할 수 있습니다. 다른 모듈에 get_description() 함수가 있을 수 있으며 실수로 호출하지는 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;두 번째 경우에는 함수 내에 있고 여기에 다른 명명된 선택 항목이 없으므로 임의 모듈에서 선택() 함수를 직접 가져왔습니다. 임의의 결과를 반환하는 다음과 같은 함수를 작성할 수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;def get_description(): import random&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;possibilities = ['rain', 'snow', 'sleet', 'fog', 'sun', 'who knows'] return random.choice(possibilities)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프로그래밍의 여러 가지 측면과 마찬가지로 자신에게 가장 명확해 보이는 스타일을 고르십시오. 모듈 인증 이름(랜덤).(선택)이 더 안전하지만 조금 더 입력해야 합니다.위의 get_description() 예제는 가져올 항목의 다양성을 보여 주었지만 가져올 위치의 다양성은 나타내지 않았습니다. 모두 함수 내부에서 가져오기라고 했습니다. 함수 외부에서 임의로 가져올 수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import random&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; def get_description():&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp; &lt;span&gt;&amp;nbsp; &lt;/span&gt;possibilities = ['rain', 'snow', 'sleet', 'fog', 'sun', 'who knows']&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;... &amp;nbsp;return random.choice(possibilities) ...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; get_description()&lt;br /&gt;'who knows'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; get_description()&lt;br /&gt;'rain' &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;가져온 코드를 둘 이상의 장소에서 사용할 수 있는 경우 기능 외부에서 가져오고, 사용이 제한되는 경우 내부에서 가져오기를 고려해야 합니다. 일부 사람들은 코드의 모든 종속성을 명확히 하기 위해 모든 가져오기를 파일 맨 위에 놓는 것을 선호합니다. 어느 쪽이든 통한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mport a Module with Another Nam &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우리의 주요 weatherman.py 프로그램에서 우리는 수입 보고서를 호출했습니다. 하지만 이름이 같은 다른 모듈이 있거나 더 니모닉하거나 더 짧은 이름을 사용하려는 경우 어떻게 해야 합니까? 이러한 경우 별칭을 사용하여 가져올 수 있습니다. 다음 별칭을 사용합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;import report as wr&lt;br /&gt;description = wr.get_description() print(&quot;Today's weather:&quot;, description) &lt;/li&gt;
&lt;li&gt;Import Only What You Want from a Module &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Python을 사용하면 모듈의 하나 이상의 부품을 가져올 수 있습니다. 각 부분은 원래 이름을 유지하거나 별칭을 지정할 수 있습니다. 먼저 보고서 모듈에서 원래 이름으로 get_description()을 가져오겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;from report import get_description description = get_description() print(&quot;Today's weather:&quot;, description) &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 do_it로 가져옵니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;from report import get_description as do_it description = do_it()&lt;br /&gt;print(&quot;Today's weather:&quot;, description) &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Module Search Path&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 do_it로 가져옵니다.Python은 가져올 파일을 어디에서 찾습니까? 표준 sys 모듈에 저장된 디렉토리 이름과 ZIP 아카이브 파일 목록을 변수 경로로 사용합니다. 이 목록에 액세스하여 수정할 수 있습니다. 다음은 Mac에서 Python 3.3용 sys.path의 값입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import sys&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; for place in sys.path: ... print(place)&lt;br /&gt;...&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;/Library/Frameworks/Python.framework/Versions/3.3/lib/python33.zip&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/plat-darwin&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/lib-dynload&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;초기 빈 출력 라인은 현재 디렉토리를 나타내는 빈 문자열 ''입니다. sys.path에서 '가 처음인 경우 Python은 무언가를 가져오려고 할 때 현재 디렉토리를 먼저 찾습니다. 가져오기 보고서는 report.py을 찾습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;첫 번째 매치가 사용됩니다. 즉, 랜덤이라는 모듈을 정의하고 표준 라이브러리 이전의 검색 경로에 있는 경우 표준 라이브러리의 랜덤에 액세스할 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Packages&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;코드 한 줄에서 여러 줄 기능, 독립 실행형 프로그램, 동일한 디렉토리에 있는 여러 모듈로 이동했습니다. Python 응용 프로그램을 더 많이 확장할 수 있도록 모듈을 패키지라는 파일 계층으로 구성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아마도 우리는 다음 날과 다음 주에 각각 다른 유형의 문자 예보를 원하는 것 같습니다. 이를 구조화하는 한 가지 방법은 소스라는 이름의 디렉터리를 만들고 그 안에 daily.py과 weekly.py이라는 두 개의 모듈을 만드는 것입니다. 각각은 예측이라는 기능을 가지고 있다. 일별 버전은 문자열을 반환하고 주별 버전은 7개 문자열 목록을 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기 메인 프로그램과 두 개의 모듈이 있습니다. (enumerate() 함수는 목록을 분해하여 목록의 각 항목을 for 루프에 공급하여 각 항목에 숫자를 조금 더 추가합니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;주 프로그램: box/weather.py.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;from sources import daily, weekly&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;print(&quot;Daily forecast:&quot;, daily.forecast()) print(&quot;Weekly forecast:&quot;)&lt;br /&gt;for number, outlook in enumerate(weekly.forecast(), 1):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;print(number, outlook)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;모듈 1: box/box/daily.py.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;def forecast():&lt;br /&gt;'fake daily forecast' return 'like yesterday'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;모듈 2: box/box/weekly.py.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;def forecast():&lt;br /&gt;&lt;i&gt;&quot;&quot;&quot;Fake weekly forecast&quot;&quot;&quot;&lt;br /&gt;&lt;/i&gt;return ['snow', 'more snow', 'sleet',&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;'freezing rain', 'rain', 'fog', 'hail']&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;원본 디렉토리에 __init_.py라는 파일이 하나 더 필요합니다. 이 캔&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;비어 있지만 Python은 이 디렉터리를 패키지로 처리하려면 이 디렉터리가 필요합니다. 메인 weather.py 프로그램을 실행하여 다음 작업을 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;$ python weather.py&lt;br /&gt;Daily forecast: like yesterday Weekly forecast:&lt;br /&gt;1 snow&lt;br /&gt;2 more snow&lt;br /&gt;3 sleet&lt;br /&gt;4 freezing rain&lt;br /&gt;5 rain&lt;br /&gt;6 fog&lt;br /&gt;7 hail&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;The Python Standard Library&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Python의 주요 주장 중 하나는 Python이 많은 유용한 작업을 수행하는 대규모 표준 모듈 라이브러리인 &quot;배터리 포함&quot;을 가지고 있으며 핵심 언어가 과장되지 않도록 별도로 보관하고 있다는 것입니다. 일부 Python 코드를 작성하려고 할 때 먼저 원하는 작업을 이미 수행하는 표준 모듈이 있는지 확인하는 것이 좋습니다. 표준 도서관에서 작은 보석들을 자주 접하는 것은 놀라운 일입니다. Python은 또한 튜토리얼과 함께 모듈에 대한 권위 있는 설명서를 제공합니다. Doug Hellmann의 웹 사이트 Python Module of the Week와 그의 저서 The Python Standard Li bybrary by 예제(Addison-Wesley Professional)도 매우 유용한 가이드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이&lt;span&gt; &lt;/span&gt;책의&lt;span&gt; &lt;/span&gt;다음&lt;span&gt; &lt;/span&gt;장에서는&lt;span&gt; &lt;/span&gt;웹&lt;span&gt;, &lt;/span&gt;시스템&lt;span&gt;, &lt;/span&gt;데이터베이스&lt;span&gt; &lt;/span&gt;등과&lt;span&gt; &lt;/span&gt;관련된&lt;span&gt; &lt;/span&gt;많은&lt;span&gt; &lt;/span&gt;표준&lt;span&gt; &lt;/span&gt;모듈을&lt;span&gt; &lt;/span&gt;다룹니다&lt;span&gt;. &lt;/span&gt;이&lt;span&gt; &lt;/span&gt;섹션에서는&lt;span&gt; &lt;/span&gt;일반적인&lt;span&gt; &lt;/span&gt;용도가&lt;span&gt; &lt;/span&gt;있는&lt;span&gt; &lt;/span&gt;몇&lt;span&gt; &lt;/span&gt;가지&lt;span&gt; &lt;/span&gt;표준&lt;span&gt; &lt;/span&gt;모듈에&lt;span&gt; &lt;/span&gt;대해&lt;span&gt; &lt;/span&gt;설명하겠습니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;</description>
      <category>파이썬코드</category>
      <category>파이썬코드구조</category>
      <category>파이썬코드모듈</category>
      <author>&amp;amp;$#@</author>
      <guid isPermaLink="true">https://about-design.tistory.com/6</guid>
      <comments>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4-%EC%83%81%EC%9E%90-%EB%AA%A8%EB%93%88-%ED%8C%A8%ED%82%A4%EC%A7%80-%EB%B0%8F-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8#entry6comment</comments>
      <pubDate>Mon, 6 Sep 2021 11:26:22 +0900</pubDate>
    </item>
    <item>
      <title>파이썬코드구조 closures</title>
      <link>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%93%9C%EA%B5%AC%EC%A1%B0-closures</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코드구조.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/orOa7/btrea2cphYa/KurWFXiJslmkP8U88eCbz0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/orOa7/btrea2cphYa/KurWFXiJslmkP8U88eCbz0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/orOa7/btrea2cphYa/KurWFXiJslmkP8U88eCbz0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2ForOa7%2Fbtrea2cphYa%2FKurWFXiJslmkP8U88eCbz0%2Fimg.jpg&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코드구조.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size18&quot;&gt;Closures&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;내부 기능이 폐쇄 역할을 할 수 있습니다. 다른 함수에 의해 동적으로 생성되는 함수로, 함수 외부에서 생성된 변수의 값을 변경하고 기억할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음 예제는 이전 기사() 예제를 기반으로 합니다. 우리는 상상력이 없기 때문에 새로운 기사2()라고 부르고, 내부() 기능을 내부2()라고 하는 폐쇄 기능으로 바꾸자. 차이점은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; inner2는 외부말 매개변수를 인수로 얻는 대신 직접 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; nights2px는 내부 2 함수 이름을 호출하는 대신 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def knights2(saying):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;def inner2():&lt;br /&gt;return &quot;We are the knights who say: '%s'&quot; % saying&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;return inner2&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;내부2() 함수는 전달된 말의 가치를 알고 기억합니다. line return inner2는 inner2 함수의 이 특수 복사본을 반환합니다(하지만 호출하지는 않음). 이것은 폐쇄입니다. 어디서 왔는지 기억하는 동적으로 만들어진 함수입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다른 인수를 사용하여 기사 2()를 두 번 호출합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; a = knights2('Duck')&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; b = knights2('Hasenpfeffer')&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;좋아, 그럼 A와 B는 뭐야?&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; type(a) &amp;lt;class 'function'&amp;gt; &amp;gt;&amp;gt;&amp;gt; type(b) &amp;lt;class 'function'&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기능이지만 폐쇄이기도 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; a&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;function knights2.&amp;lt;locals&amp;gt;.inner2 at 0x10193e158&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; b&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;function knights2.&amp;lt;locals&amp;gt;.inner2 at 0x10193e1e0&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우리가 그들을 부른다면, 그들은 그들이 기사2에 의해 창조되었을 때 사용되었던 속담을 기억한다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; a()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&quot;We are the knights who say: 'Duck'&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; b()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&quot;We are the knights who say: 'Hasenpfeffer'&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Anonymous Functions: the lambda() Function&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Python에서 람다 함수는 단일 문장으로 표현되는 익명 함수입니다. 일반적인 작은 기능 대신 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이를 설명하기 위해 먼저 정규 함수를 사용하는 예를 만들어 보겠습니다. 먼저 edit_story() 함수를 정의하겠습니다. 그 주장은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 단어&amp;mdash;단어 목록&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; func&amp;mdash;단어의 각 단어에 적용하는 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def edit_story(words, func): ... for word in words:&lt;br /&gt;... print(func(word))&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 단어 목록과 각 단어에 적용할 기능이 필요합니다. 여기 제 고양이가 계단 하나를 놓쳤을 때 내는 (가정적인) 소리 목록이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; stairs = ['thud', 'meow', 'thud', 'hiss']&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리고 함수의 경우, 각 단어를 대문자로 쓰고 느낌표를 붙입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;고양이 타블로이드 신문 헤드라인에 적합:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def enliven(word): &lt;i&gt;# give that prose more punch &lt;/i&gt;... return word.capitalize() + '!'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;재료 혼합:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; edit_story(stairs, enliven)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Thud!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Meow!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Thud!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Hiss!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;드디어 람다에 도착했군. 활성화() 기능이 너무 짧아서 대체할 수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;람다와 함께:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; edit_story(stairs, lambda word: word.capitalize() + '!') Thud!&lt;br /&gt;Meow!&lt;br /&gt;Thud!&lt;br /&gt;Hiss!&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;람다는 하나의 주장을 받아들입니다. 여기서 우리는 그것을 단어라고 부릅니다. 대장과 끝 괄호 사이의 모든 것이 함수의 정의입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;종종 람다를 사용하는 것보다 활력()과 같은 실제 기능을 사용하는 것이 훨씬 더 명확합니다. 람다는 그렇지 않으면 많은 작은 함수들을 정의해야 할 경우에 가장 유용합니다. 그리고 그것들을 모두 기억해야 합니다. 특히 그래픽 사용자 인터페이스에서 람다를 사용하여 콜백 함수를 정의할 수 있습니다. 예는 부록 A를 참조하십시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Generators&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;생성기는 Python 시퀀스 생성 개체입니다. 이 기능을 사용하면 전체 시퀀스를 한 번에 만들고 메모리에 저장하지 않고도 잠재적으로 큰 시퀀스를 반복할 수 있습니다. 생성기는 반복측정기의 데이터 원본인 경우가 많습니다. 이전 코드 예제에서는 이미 범위()라는 이름을 사용하여 일련의 정수를 생성했습니다. Python 2에서 range()는 목록을 반환하여 메모리에 맞도록 제한합니다. Python 2에는 생성기 xrange()도 있으며, 이는 Python 3에서 일반 범위()가 되었다. 이 예제에서는 1에서 100까지의 모든 정수를 추가합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; sum(range(1, 101))&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;5050&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;생성기를 통해 반복할 때마다 마지막으로 호출된 시간을 추적하고 다음 값을 반환합니다. 이는 이전 통화에 대한 메모리가 없고 항상 동일한 상태의 첫 회선에서 시작되는 일반 함수와는 다릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;잠재적으로 큰 시퀀스를 만들고 코드가 너무 커서 제너레이터를 이해할 수 없는 경우 제너레이터 함수를 작성합니다. 정상 함수이지만 반환이 아닌 항복문으로 값을 반환합니다. 고유한 범위 버전()을 작성해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def my_range(first=0, last=10, step=1):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;number = first while number &amp;lt; last:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;yield number number += step&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;정상적인 기능입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; my_range&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;function my_range at 0x10193e268&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;생성기 개체를 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; ranger = my_range(1, 5)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; ranger&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;lt;generator object my_range at 0x101a0a168&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 생성기 개체에 대해 반복할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; for x in ranger: ... print(x) ...&lt;br /&gt;1&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2 3 4&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Decorators&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;경우에 따라 소스 코드를 변경하지 않고 기존 함수를 수정하려고 할 수 있습니다. 일반적인 예는 전달된 인수를 확인하기 위해 디버깅 문을 추가하는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데코레이터는 한 함수를 입력으로 사용하고 다른 함수를 반환하는 함수입니다. Python 트릭 백을 자세히 살펴보고 다음을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; *병력 및 **왜성&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 내부 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 인수로서의 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;document_it() 함수는 다음 작업을 수행할 장식자를 정의합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 함수의 이름과 인수 값을 인쇄합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 인수를 사용하여 함수 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 결과 인쇄&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 수정된 기능을 사용할 수 있도록 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;코드는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;gt;&amp;gt;&amp;gt; def document_it(func):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;document_it()에 전달하는 함수는 document_it()가 추가하는 추가 문을 포함하는 새 함수를 제공합니다. 데코레이터는 실제로 func에서 코드를 실행할 필요가 없지만 document_it()는 func를 호출하여 func뿐만 아니라 모든 추가 결과를 얻을 수 있도록 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 이걸 어떻게 사용하죠? 장식자를 수동으로 적용할 수 있습니다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;gt;&amp;gt;&amp;gt; def add_ints(a, b): &lt;/li&gt;
&lt;li&gt;... returna+b ...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; add_ints(3, 5) &lt;br /&gt;8 &lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; cooler_add_ints = document_it(add_ints) &lt;i&gt;# manual decorator assignment &lt;/i&gt;&amp;gt;&amp;gt;&amp;gt; cooler_add_ints(3, 5)&lt;br /&gt;Running function: add_ints &lt;br /&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Positional arguments: (3, 5)&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Keyword arguments: {}&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Result: 8&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;8&lt;/li&gt;
&lt;li&gt;위의 수동 데코레이터 할당 대신, 꾸미려는 함수 앞에 @decorator_name을 추가하십시오.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; @document_it&lt;br /&gt;... def add_ints(a, b):&lt;br /&gt;... returna+b&lt;br /&gt;...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; add_ints(3, 5)&lt;br /&gt;Start function add_ints Positional arguments: (3, 5) Keyword arguments: {} Result: 8&lt;br /&gt;8&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기능별로 둘 이상의 데코레이터를 둘 수 있습니다. 결과를 제곱하는 square_it()라는 다른 장식가를 작성해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;def new_function(*args, **kwargs): result = func(*args, **kwargs) return result * result&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;return new_function&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;함수에 가장 근접하게 사용된 데코레이터(decorator, 정의 바로 위)가 먼저 실행된 다음 그 위에 있는 데코레이터가 실행됩니다. 두 순서 모두 동일한 최종 결과를 제공하지만 중간 단계가 어떻게 변하는지 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; @document_it&lt;br /&gt;... @square_it&lt;br /&gt;... def add_ints(a, b):&lt;br /&gt;... returna+b&lt;br /&gt;...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; add_ints(3, 5)&lt;br /&gt;Running function: new_function Positional arguments: (3, 5) Keyword arguments: {}&lt;br /&gt;Result: 64&lt;br /&gt;64&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데코레이터 순서를 반대로 해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; @square_it&lt;br /&gt;... @document_it&lt;br /&gt;... def add_ints(a, b): ... returna+b&lt;br /&gt;...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; add_ints(3, 5) Running function: add_ints&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Positional arguments: (3, 5)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Keyword arguments: {}&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Result: 8&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;64&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Namespaces and Scope&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이름은 어디에 쓰이느냐에 따라 다른 것을 가리킬 수 있다. Python 프로그램에는 특정 이름이 고유하고 다른 네임스페이스의 동일한 이름과 관련이 없는 섹션 등 다양한 네임스페이스가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;각 함수는 고유한 네임스페이스를 정의합니다. 주 프로그램에서 x라는 변수를 정의하고 함수에서 x라는 다른 변수를 정의하면 다른 변수를 나타냅니다. 그러나 벽을 뚫을 수 있습니다. 필요한 경우 다양한 방법으로 다른 네임스페이스의 이름에 액세스할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프로그램의 주요 부분은 글로벌 네임스페이스를 정의하므로 해당 네임스페이스의 변수는 글로벌 변수입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;함수 내에서 전역 변수의 값을 가져올 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; animal = 'fruitbat'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; def print_global():&lt;br /&gt;... print('inside print_global:', animal) ...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; print('at the top level:', animal)&lt;br /&gt;at the top level: fruitbat&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; print_global()&lt;br /&gt;inside print_global: fruitbat&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그러나 전역 변수의 값을 가져와 함수 내에서 변경하려고 하면 다음 오류가 발생합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def change_and_print_global():&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;... &amp;nbsp;print('inside change_and_print_global:', animal) &lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;animal = 'wombat'&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;... &amp;nbsp;print('after the change:', animal) ...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; change_and_print_global()&lt;br /&gt;Traceback (most recent call last): &lt;br /&gt;File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt; &lt;br /&gt;File &quot;&amp;lt;stdin&amp;gt;&quot;, line 2, in change_and_report_it&lt;br /&gt;UnboundLocalError: local variable 'animal' referenced before assignment &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 변수를 변경하면 이름이 동물인 다른 변수도 변경되지만 이 변수는 함수 내부에 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;gt;&amp;gt;&amp;gt; def change_local():&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; change_local()&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;inside change_local: wombat 4330406160&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; animal&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'fruitbat'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; id(animal)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;4330390832&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이게 어찌된 일이냐? 첫 번째 줄은 동물이라는 글로벌 변수에 '과일배트' 문자열을 할당했습니다. change_local() 함수에도 animal이라는 변수가 있지만, 이 변수는 로컬 네임스페이스에 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서는 Python 함수 ID()를 사용하여 각 객체에 대한 고유한 값을 인쇄하고 change_local() 내부의 변수 동물이 프로그램의 메인 레벨에서 동물과 같지 않음을 증명했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;함수 내의 로컬 변수가 아닌 전역 변수에 액세스하려면 글로벌 키워드를 사용해야 합니다(이것이 올 것임을 알고 있었음: expiritive is been implicit):&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; animal = 'fruitbat'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; def change_and_print_global():&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;... &amp;nbsp;global animal &lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;animal = 'wombat'&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;... &amp;nbsp;print('inside change_and_print_global:', animal) ...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; animal&lt;br /&gt;'fruitbat'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; change_and_print_global()&lt;br /&gt;inside change_and_print_global: wombat&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; animal&lt;br /&gt;'wombat'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;함수 내에서 전역이라고 말하지 않으면 Python은 로컬 네임스페이스를 사용하며 변수는 로컬입니다. 기능이 완료되면 사라집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Python은 네임스페이스의 내용에 액세스할 수 있는 두 가지 기능을 제공합니다. &amp;bull; locals()는 로컬 네임스페이스의 콘텐츠 사전을 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; globalsyspace는 글로벌 네임스페이스의 내용에 대한 사전을 반환합니다. 그리고 여기서 사용되고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;gt;&amp;gt;&amp;gt; animal = 'fruitbat' &amp;gt;&amp;gt;&amp;gt; def change_local(): &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; print('globals:', globals()) &lt;i&gt;# reformatted a little for presentation &lt;/i&gt;globals: {'animal': 'fruitbat',&lt;br /&gt;'__doc__': None,&lt;br /&gt;'change_local': &amp;lt;function change_it at 0x1006c0170&amp;gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;'__package__': None,&lt;br /&gt;'__name__': '__main__',&lt;br /&gt;'__loader__': &amp;lt;class '_frozen_importlib.BuiltinImporter'&amp;gt;, '__builtins__': &amp;lt;module 'builtins'&amp;gt;}&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; animal&lt;br /&gt;'fruitbat'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;change_local() 내의 로컬 네임스페이스에는 로컬 변수 동물만 포함되어 있습니다. 글로벌 네임스페이스에는 별도의 글로벌 변수 동물과 여러 가지가 포함되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Uses of _ and __ in Names&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;두 개의 밑줄(__)로 시작하고 끝나는 이름은 Python 내에서 사용할 수 있도록 예약되어 있으므로 자신의 변수와 함께 사용하면 안 됩니다. 이 이름 지정 패턴은 응용 프로그램 개발자가 자체 변수에 대해 선택할 가능성이 낮기 때문에 선택되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;예를 들어, 함수의 이름은 시스템 변수 함수 ._name__에 있으며 문서화 문자열은 함수입니다.__doc__:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def amazing():&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'''This is the amazing function.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Want to see it again?'''&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;... &amp;nbsp;print('This function is named:', amazing.__name__) &lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;... &amp;nbsp;print('And its docstring is:', amazing.__doc__) ...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; amazing()&lt;br /&gt;This function is named: amazing&lt;br /&gt;And its docstring is: This is the amazing function. &lt;br /&gt;Want to see it again?&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앞서 글로벌 인쇄물에서 보셨듯이, 메인 프로그램에는 특별 프로그램이 할당되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이름 __main_.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Handle Errors with try and except&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;일부 언어에서는 오류가 특수 함수 반환 값으로 표시됩니다. Python은 관련 오류가 발생할 때 실행되는 코드: 예외를 사용합니다.&lt;br /&gt;위치를 벗어난 목록이나 튜플 또는 존재하지 않는 키를 가진 사전 액세스와 같은 일부 항목이 이미 있습니다. 경우에 따라 실패할 수 있는 코드를 실행하는 경우 잠재적인 오류를 차단하기 위해 적절한 예외 처리기도 필요합니다.&lt;/li&gt;
&lt;li&gt;예외가 발생할 수 있는 모든 위치에 예외 처리를 추가하여 사용자에게 상황을 알리는 것이 좋습니다. 문제를 해결하지 못할 수도 있지만 최소한 상황을 확인하고 프로그램을 정상적으로 종료할 수는 있습니다. 일부 기능에서 예외가 발생했지만 해당 기능에서 잡히지 않으면 일부 호출 기능에서 일치하는 핸들러에 잡힐 때까지 거품이 발생합니다. 사용자 고유의 예외 처리기를 제공하지 않는 경우 Python은 오류 메시지와 오류가 발생한 위치에 대한 일부 정보를 인쇄한 후 프로그램을 종료합니다.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; short_list = [1, 2, 3]&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; position = 5&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; short_list[position]&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Traceback (most recent call last):&lt;/li&gt;
&lt;li&gt;File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt; IndexError: list index out of range&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;코드를 운에 맡기지 말고 코드를 래핑해 보십시오. 오류 처리 기능은 예외입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; short_list = [1, 2, 3] &amp;gt;&amp;gt;&amp;gt; position = 5&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; try:&lt;br /&gt;... short_list[position] ... except:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;... print('Need a position between 0 and', len(short_list)-1, ' but got', ... position)&lt;br /&gt;...&lt;br /&gt;Need a position between 0 and 2 but got 5&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;시도 블록 내부의 코드가 실행됩니다. 오류가 발생하면 예외가 발생하고 예외 블록 내부의 코드가 실행됩니다. 오류가 없으면 예외 블록을 건너뜁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서처럼 인수가 없는 경우를 제외하고 평면을 지정하는 것은 모든 예외 유형에 대한 캐치올입니다. 둘 이상의 예외 유형이 발생할 수 있는 경우 각 예외 처리기를 별도로 제공하는 것이 가장 좋습니다. 이렇게 하도록 강요하는 사람은 없습니다. 모든 예외를 포착하는 것 외에는 베어(Bare)를 사용할 수 있지만 이러한 예외에 대한 처리가 일반적일 수 있습니다(일부 인쇄 오류가 발생했습니다). 원하는 수의 특정 예외 처리기를 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;때로는 유형을 벗어난 예외 세부 정보를 원할 수 있습니다. 다음 형식을 사용하는 경우 변수 이름에 전체 예외 개체가 표시됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;except &lt;i&gt;exceptiontype &lt;/i&gt;as &lt;i&gt;name&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음 예제에서는 시퀀스에 잘못된 위치를 제공할 때 IndexError가 발생하는 예외 유형이기 때문에 먼저 IndexError를 찾습니다. IndexError 예외는 변수에 저장하고 다른 예외는 변수에 저장합니다. 이 예에서는 다른 항목에 저장된 모든 내용을 인쇄하여 해당 개체에 있는 내용을 보여 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; short_list = [1, 2, 3] &amp;gt;&amp;gt;&amp;gt; while True:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;...&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;... try:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;value = input('Position [q to quit]? ') if value == 'q':&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;break&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Position [q to quit]? 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;2&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Position [q to quit]? 0&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;1&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Position [q to quit]? 2&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;3&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Position [q to quit]? 3&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Bad index: 3&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Position [q to quit]? 2&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;3&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Position [q to quit]? two&lt;br /&gt;Something else broke: invalid literal for int() with base 10: 'two' Position [q to quit]? q&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위치 3을 입력하면 예상대로 인덱스 오류가 발생했습니다. 두 개를 입력하면 두 번째에 처리한 int() 함수가 코드만 제외하고 모두 잡힙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Make Your Own Exceptions&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이전 섹션에서는 처리 예외에 대해 설명했지만, 모든 예외(예: IndexError)는 Python 또는 표준 라이브러리에 미리 정의되어 있습니다. 원하는 용도로 사용할 수 있습니다. 또한 프로그램에서 발생할 수 있는 특수한 상황을 처리하기 위해 고유한 예외 유형을 정의할 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;예외는 수업이다. 예외 클래스의 하위 항목입니다. 대문자라는 예외를 만들자.문자열에 대문자가 있을 경우 예외로 올리고 대문자로 표시합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; class UppercaseException(Exception): ... pass&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; words = ['eeenie', 'meenie', 'miny', 'MO'] &amp;gt;&amp;gt;&amp;gt; for word in words:&lt;br /&gt;... if word.isupper():&lt;br /&gt;... raise UppercaseException(word) ...&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Traceback (most recent call last): File &quot;&amp;lt;stdin&amp;gt;&quot;, line 3, in &amp;lt;module&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;__main__.UppercaseException: MO&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;대문자에 대한 동작도 정의하지 않았습니다.예외(방금 통과를 사용함)를 통해 상위 클래스인 예외(Exception)가 예외가 발생했을 때 인쇄할 내용을 파악할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;예외 개체 자체에 액세스하여 인쇄할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; try:&lt;br /&gt;... raise OopsException('panic') ... except OopsException as exc: ... print(exc)&lt;br /&gt;...&lt;br /&gt;panic&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Things to Do&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4.1 guess_me 변수에 값 7을 할당합니다. 그런 다음 guess_me가 7보다 작으면 'too low', 7보다 크면 'too high', 7보다 크면 'just right' 문자열을 인쇄하는 조건부 테스트(if, elif)를 작성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4.2 변수 guess_me에 값 7을, 변수 시작에 값 1을 할당합니다. guess_me와 시작을 비교하는 시간 루프를 작성합니다. 시작이 내 짐작보다 작으면 너무 낮게 인쇄합니다. 시작이 guess_me이면 '찾았다!'를 인쇄하고 루프를 종료합니다. 시작할 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;루프가 더 크죠&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4.3 4.4 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4.5 반품 시 a 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4.6 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4.9 범위(10)에서 홀수를 반환하는 get_odds라는 생성기 함수를 정의합니다. 반환된 세 번째 값을 찾아 인쇄하려면 for 루프를 사용하십시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;than guess_me, 'oops'를 인쇄하고 루프를 종료합니다. 끝에서 시작 증분&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;루프에서 목록 값을 인쇄합니다 [3, 2, 1, 0].&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(10) 범위의 짝수 목록을 작성하기 위해 이해 목록을 작성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사전 정사각형을 만들기 위한 사전 이해. 범위(10) 키를 사용하고 각 키의 정사각형을 값으로 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;범위(10)의 홀수에서 홀수 집합을 생성하도록 이해를 설정합니다. 발생기 이해는 문자열 'Got'을 반환하고, 값은 값을 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;범위(10). for 루프를 사용하여 이 과정을 반복합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4.8 목록을 반환하는 good라는 함수를 정의합니다 ['해리', '론', '헤르미온느'.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4.7 숫자 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4.10 함수를 호출할 때 '시작'을 인쇄하고 종료할 때 '끝'을 인쇄하는 테스트라는 데코레이터를 정의합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4.11 OopsException이라는 예외를 정의합니다. 무슨 일이 일어나는지 보려면 이 예외를 제기하십시오. 그런 다음 이 예외를 잡기 위한 코드를 작성하고 'Caught a oops'를 인쇄합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;4.12 zipcope&lt;/span&gt;을&lt;span&gt; &lt;/span&gt;사용하여&lt;span&gt; &lt;/span&gt;제목&lt;span&gt; = [&lt;/span&gt;습관의&lt;span&gt; &lt;/span&gt;창조물&lt;span&gt;', [&lt;/span&gt;크루웰&lt;span&gt; &lt;/span&gt;페이트&lt;span&gt;] &lt;/span&gt;및&lt;span&gt; &lt;/span&gt;플롯&lt;span&gt; = [&lt;/span&gt;수녀가&lt;span&gt; &lt;/span&gt;괴물로&lt;span&gt; &lt;/span&gt;변한다&lt;span&gt;', [&lt;/span&gt;유령&lt;span&gt; &lt;/span&gt;실&lt;span&gt; &lt;/span&gt;가게&lt;span&gt;] &lt;/span&gt;목록과&lt;span&gt; &lt;/span&gt;짝을&lt;span&gt; &lt;/span&gt;이루는&lt;span&gt; &lt;/span&gt;영화라는&lt;span&gt; &lt;/span&gt;사전을&lt;span&gt; &lt;/span&gt;만듭니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;</description>
      <category>파이선코딩</category>
      <category>파이썬코드구조</category>
      <author>&amp;amp;$#@</author>
      <guid isPermaLink="true">https://about-design.tistory.com/5</guid>
      <comments>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%93%9C%EA%B5%AC%EC%A1%B0-closures#entry5comment</comments>
      <pubDate>Sun, 5 Sep 2021 22:31:55 +0900</pubDate>
    </item>
    <item>
      <title>파이썬코드 functions</title>
      <link>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%93%9C-functions</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코드functions.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmKmIA/btrd0GhB0se/qHab0cNry5IxERefjEZqR0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmKmIA/btrd0GhB0se/qHab0cNry5IxERefjEZqR0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmKmIA/btrd0GhB0se/qHab0cNry5IxERefjEZqR0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmKmIA%2Fbtrd0GhB0se%2FqHab0cNry5IxERefjEZqR0%2Fimg.jpg&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코드functions.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&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 style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;Functions&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;지금까지 Python 코드 예는 모두 작은 조각이었습니다. 이러한 기능은 소규모 작업에 유용하지만 항상 조각을 다시 입력하려는 사람은 없습니다. 우리는 더 큰 코드를 관리할 수 있는 조각으로 정리할 수 있는 방법이 필요합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;코드 재사용을 위한 첫 번째 단계는 다른 모든 코드와 별도로 명명된 코드 조각입니다. 함수는 임의의 숫자와 유형의 입력 매개 변수를 사용하고 임의의 숫자와 유형의 출력 결과를 반환할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;기능을 사용하여 두 가지 작업을 수행할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;bull; &lt;i&gt;Define&lt;/i&gt;it &amp;bull; &lt;i&gt;Call&lt;/i&gt;it&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;Python 함수를 정의하려면 함수에 대한 입력 매개 변수를 포함하는 함수 이름인 def를 입력하고 마지막으로 콜론(:)을 입력합니다. 함수 이름은 변수 이름과 동일한 규칙을 가집니다(문자 또는 _로 시작하고 문자, 숫자 또는 _만 포함해야 함).&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;한 번에 한 단계씩 진행하고 먼저 파라미터가 없는 함수를 정의하고 호출합니다. 가장 간단한 Python 함수는 다음과 같습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def do_nothing(): ... pass&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이러한 매개변수가 없는 함수의 경우에도 정의에 괄호와 콜론이 필요합니다. if 문장으로 코드를 들여쓰는 것처럼 다음 줄을 들여써야 합니다. Python은 이 기능이 아무것도 하지 않는다는 것을 보여주기 위해 패스 문이 필요합니다. 이 페이지는 더 이상 표시되지 않더라도 일부러 비워둔 페이지와 같습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이름과 괄호를 입력하기만 하면 이 기능을 호출할 수 있습니다. 광고된 대로 작동하며 제대로 작동하는 것은 없습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; do_nothing()&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이제 매개 변수는 없지만 단어 하나를 인쇄하는 다른 함수를 정의하여 호출하겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def make_a_sound(): ... print('quack') ...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; make_a_sound() quack&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;make_a_sound() 함수를 호출했을 때, Python은 정의 내에서 코드를 실행했습니다. 이 경우, 한 단어를 인쇄하고 메인 프로그램으로 돌아갑니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;매개 변수는 없지만 값을 반환하는 함수를 시도해 보겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def agree(): ... return True ...&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;다음과 같은 경우 이 함수를 호출하고 반환된 값을 테스트할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; if agree():&lt;br /&gt;... print('Splendid!')&lt;br /&gt;... else:&lt;br /&gt;&lt;b&gt;.&lt;/b&gt;.. print('That was unexpected.') ...&lt;br /&gt;Splendid!&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;당신은 방금 큰 발걸음을 내디뎠어요. if 및 loop과 같은 테스트와 함수의 조합은 이전에 할 수 없었던 것을 가능하게 합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이쯤에서 괄호 사이에 무언가를 넣어야 할 때입니다. echo() 함수를 anything 매개 변수 하나로 정의하겠습니다. 반환 문을 사용하여 호출자에게 다음 사이의 공백을 사용하여 값을 두 번 보냅니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def echo(anything):&lt;br /&gt;... return anything + ' ' + anything ...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이제 'Rumplestiltskin' 문자열로 echo()를 호출하겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; echo('Rumplestiltskin')&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'Rumplestiltskin Rumplestiltskin'&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;함수를 호출할 때 함수에 전달되는 값을 인수라고 합니다. 인수를 사용하여 함수를 호출하면 해당 인수 값이 함수 내부의 해당 매개 변수에 복사됩니다. 이전 예에서는 echo() 함수를 'Rumplestiltskin' 인수 문자열로 호출했습니다. 이 값은 echo() 내에서 매개 변수에 복사된 다음 호출자에게 (이 경우 공백이 두 배로) 반환되었습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이러한 기능 예는 매우 기초적이었다. 입력 인수를 사용하여 실제로 수행하는 함수를 작성해 보겠습니다. 색상에 대한 코멘트가 있는 이전 코드 조각을 수정하겠습니다. 주석이라고 하고 color라는 입력 문자열 매개변수를 사용하도록 합니다. 문자열 설명을 호출자에게 반환하고 호출자는 문자열로 수행할 작업을 결정합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def commentary(color):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;...&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;... else:&lt;br /&gt;... return &quot;I've never heard of the color &quot; + color + &quot;.&quot; ...&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;문자열 인수가 'blue'인 함수 주석()을 호출합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; comment = commentary('blue')&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이 기능은 다음을 수행합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;bull; 함수의 내부 색상 매개변수에 '파란색' 값을 할당합니다&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;bull; if-elife-elife 논리 체인을 통해 실행&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;bull; 문자열을 반환합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;bull; 변수 설명에 문자열을 할당합니다. 무엇을 다시 얻을 수 있습니까?&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; print(comment)&lt;br /&gt;I've never heard of the color blue.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;함수는 모든 유형의 입력 인수(0 포함)를 수에 제한 없이 사용할 수 있습니다. 모든 유형의 출력 결과(0 포함)를 원하는 수만큼 반환할 수 있습니다. 함수가 명시적으로 호출되지 않으면 호출자는 없음 결과를 얻습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; print(do_nothing()) None&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;None Is Useful&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;None은 할 말이 없을 때 자리를 유지하는 특별한 Python 값입니다. 부울 값으로 평가하면 거짓으로 표시되지만 부울 값 False와 동일하지는 않습니다. 예는 다음과 같습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; thing = None&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; if thing:&lt;br /&gt;... print(&quot;It's some thing&quot;) ... else:&lt;br /&gt;... print(&quot;It's no thing&quot;) ...&lt;br /&gt;It's no thing&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;없음과 부울 False 값을 구분하려면 Python의 is 연산자를 사용합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; if thing is None:&lt;br /&gt;... print(&quot;It's nothing&quot;) ... else:&lt;br /&gt;... print(&quot;It's something&quot;) ...&lt;br /&gt;It's nothing&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이것은 미묘한 구별처럼 보이지만 Python에서는 중요합니다. 결측값과 빈 값을 구분하려면 없음을 입력해야 합니다. 0 값 정수 또는 부동 소수, 빈 문자열(''), 목록([]), 튜플( (, )), 사전({}) 및 집합( )은 모두 False이지만 없음과 같지는 않습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;해당 인수가 없음인지 여부를 인쇄하는 빠른 함수를 작성하겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; is_none(None)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;It's None&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; is_none(True)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;It's True&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; is_none(False)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;It's False&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; is_none(0)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;It's False&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; is_none(0.0)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;It's False&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; is_none(())&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;It's False&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; is_none([])&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;It's False&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; is_none({})&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;It's False&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; is_none(set())&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;It's False&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;위치 인수&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;Python은 많은 언어에 비해 매우 유연한 방식으로 함수 인수를 처리합니다. 가장 친숙한 인수 유형은 위치 인수이며, 위치 인수의 값은 순서대로 해당 매개 변수에 복사됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이 함수는 위치 입력 인수를 사용하여 사전을 만들고 다음을 반환합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def menu(wine, entree, dessert):&lt;br /&gt;... return {'wine': wine, 'entree': entree, 'dessert': dessert} ...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; menu('chardonnay', 'chicken', 'cake')&lt;br /&gt;{'dessert': 'cake', 'wine': 'chardonnay', 'entree': 'chicken'}&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;매우 흔하지만, 위치 논쟁의 단점은 각 위치의 의미를 다시 기억할 필요가 있다는 것입니다. 만약 우리가 잊고 와인과 함께 메뉴()를 첫 번째가 아닌 마지막 논쟁으로 부른다면, 식사는 매우 달라질 것이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; menu('beef', 'bagel', 'bordeaux')&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;{'dessert': 'bordeaux', 'wine': 'beef', 'entree': 'bagel'}&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;키워드 인수&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;위치 인수의 혼동을 방지하기 위해 함수의 정의와 다른 순서로 인수를 해당 매개 변수의 이름으로 지정할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; menu(entree='beef', dessert='bagel', wine='bordeaux')&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;{'dessert': 'bagel', 'wine': 'bordeaux', 'entree': 'beef'}&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;위치 인수와 키워드 인수를 혼합할 수 있습니다. 와인을 먼저 지정하고, 메뉴와 디저트에 키워드 인수를 사용합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; menu('frontenac', dessert='flan', entree='fish')&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;{'entree': 'fish', 'dessert': 'flan', 'wine': 'frontenac'}&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;위치 인수와 키워드 인수가 모두 포함된 함수를 호출할 경우 위치 인수가 먼저 와야 합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;기본 매개변수 값 지정&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;매개변수에 대한 기본값을 지정할 수 있습니다. 호출자가 해당 인수를 제공하지 않는 경우 기본값이 사용됩니다. 이 싱겁게 들리는 기능은 실제로 매우 유용할 수 있습니다. 이전 예제를 사용하여:&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def menu(wine, entree, dessert='pudding'):&lt;br /&gt;... return {'wine': wine, 'entree': entree, 'dessert': dessert}&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이번에는 디저트 인수 없이 메뉴()를 호출해 보십시오.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; menu('chardonnay', 'chicken')&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;{'dessert': 'pudding', 'wine': 'chardonnay', 'entree': 'chicken'}&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;인수를 제공하면 기본값 대신 사용됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; menu('dunkelfelder', 'duck', 'doughnut')&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;{'dessert': 'doughnut', 'wine': 'dunkelfelder', 'entree': 'duck'}&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;기본 인수 값은 함수를 실행할 때가 아니라 함수를 정의할 때 계산됩니다. 새로운 Python 프로그래머의 일반적인 오류는 목록이나 사전과 같은 가변 데이터 유형을 기본 인수로 사용하는 것입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;다음 테스트에서 buggy() 함수는 매번 빈 결과 목록과 함께 실행되고 arg 인수를 추가한 다음 단일 항목 목록을 인쇄해야 합니다. 하지만 버그가 있습니다. 처음 호출했을 때만 비어 있습니다. 두 번째로, 결과는 여전히 이전 통화의 항목 하나를 가지고 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def buggy(arg, result=[]): ... result.append(arg) ... print(result)&lt;br /&gt;...&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; buggy('a')&lt;br /&gt;['a']&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; buggy('b') &lt;i&gt;# expect ['b'] &lt;/i&gt;['a', 'b']&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;다음과 같이 작성되었더라면 작동했을 것입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def works(arg):&lt;br /&gt;... result = []&lt;br /&gt;... result.append(arg) ... return result&lt;br /&gt;...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; works('a')&lt;br /&gt;['a']&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; works('b')&lt;br /&gt;['b']&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;수정 사항은 다른 정보를 전달하여 첫 번째 통화를 나타내는 것입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def nonbuggy(arg, result=None): ... if result is None:&lt;br /&gt;... result = []&lt;br /&gt;... result.append(arg)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;... print(result) ...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; nonbuggy('a') ['a']&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; nonbuggy('b')&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;['b']&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;*를 사용하여 위치 인수 수집&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;C 또는 C++에서 프로그래밍한 경우 Python 프로그램의 별표(*)가 포인터와 관련이 있다고 가정할 수 있습니다. 아니요, Python은 포인터가 없습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;함수 내부에서 매개변수와 함께 사용할 경우 별표는 변수 개수의 위치 인수를 매개변수 값의 튜플로 그룹화합니다. 다음 예에서 args는 print_args() 함수에 전달된 인수에서 비롯된 매개 변수 튜플입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def print_args(*args):&lt;br /&gt;... print('Positional argument tuple:', args) ...&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;인수를 사용하지 않고 호출하면 *args에서 아무 것도 얻을 수 없습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; print_args()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;Positional argument tuple: ()&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;무엇을 주든 인수 튜플로 인쇄됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; print_args(3, 2, 1, 'wait!', 'uh...')&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Positional argument tuple: (3, 2, 1, 'wait!', 'uh...')&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이는 변수 개수의 인수를 허용하는 print()와 같은 함수를 작성할 때 유용합니다. 함수에 필요한 위치 인수도 있는 경우 *args는 끝에 가서 나머지 항목을 모두 잡습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def print_more(required1, required2, *args): ... print('Need this one:', required1)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;... &amp;nbsp;print('Need this one too:', required2) &lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;... &amp;nbsp;print('All the rest:', args)&lt;br /&gt;...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; print_more('cap', 'gloves', 'scarf', 'monocle', 'mustache wax') Need this one: cap &lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Need this one too: gloves&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;All the rest: ('scarf', 'monocle', 'mustache wax')&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;*를 사용할 때 tuple 매개 변수 args를 호출할 필요는 없지만 Python에서는 일반적인 관용어입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;**를 사용하여 키워드 인수 수집&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;두 개의 별표(**)를 사용하여 키워드 인수를 사전으로 그룹화할 수 있습니다. 여기서 인수 이름은 키이고 값은 해당 사전 값입니다. 다음은 키워드 인수를 인쇄하는 print_kwargs() 함수를 정의하는 예제입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;gt;&amp;gt;&amp;gt; def print_kwargs(**kwargs): &lt;/li&gt;
&lt;li&gt;... print('Keyword arguments:', kwargs) ... &lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이제 키워드 인수를 사용하여 호출해 보십시오.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; print_kwargs(wine='merlot', entree='mutton', dessert='macaroon')&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Keyword arguments: {'dessert': 'macaroon', 'wine': 'merlot', 'entree': 'mutton'}&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;함수에 들어 있는 콰르그스는 사전입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;위치 매개변수를 *args 및 **kwargs와 혼합할 경우 해당 순서에 따라 발생해야 합니다. args와 마찬가지로 이 키워드 매개 변수를 kwargs라고 할 필요는 없지만 일반적으로 사용됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;문서 문자열&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;Python의 Zen은 가독성이 중요하다고 말합니다. 함수 본문 시작 부분에 문자열을 포함시켜 설명서를 함수 정의에 첨부할 수 있습니다. 다음은 함수의 docstring입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def echo(anything):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'echo returns its input argument'&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;... &amp;nbsp;return anything &lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;원하는 경우 다음과 같이 문서 문자열을 상당히 길게 만들고 리치 형식을 추가할 수도 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;def print_if_true(thing, check): &lt;i&gt;''' &lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;Prints the first argument if a second argument is true.&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;The operation is:&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;br /&gt;&lt;i&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;1. Check whether the *second* argument is true.&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;2. If it is, print the *first* argument.&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;'''&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;if check: print(thing)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;함수의 docstring을 인쇄하려면 Python help() 함수를 호출합니다. 함수의 이름을 전달하여 멋진 형식의 docstring과 함께 인수 목록을 가져옵니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; help(echo)&lt;br /&gt;Help on function echo in module __main__:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;echo(anything)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;echo returns its input argument&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;형식을 사용하지 않고 원시 문서 문자열만 보려면:&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; print(echo.__doc__)&lt;br /&gt;echo returns its input argument&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이상하게 생긴 __doc__은(는) 함수 내에서 변수로서 docstring의 내부 이름입니다. 103페이지의 &quot;이름에서 _ 및 __의 사용&quot;은 이 모든 밑줄 뒤에 숨겨진 이유를 설명합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;Functions Are First-Class Citizens&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;파이썬의 모토를 언급했는데, 모든 것은 객체입니다. 여기에는 숫자, 문자열, 튜플, 목록, 사전 및 함수가 포함됩니다. 함수는 Python의 일급 시민권입니다. 변수를 변수에 할당하고 다른 함수에 인수로 사용하고 함수에서 반환할 수 있습니다. 이를 통해 다른 많은 언어로 수행하기가 어려운 Python에서 몇 가지 작업을 수행할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이를 테스트하기 위해 인수 없이 42만 인쇄하는 answer()라는 간단한 함수를 정의하겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def answer(): ... print(42)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이 기능을 실행하면 다음과 같은 결과를 얻을 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; answer()&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;42&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이제 run_something이라는 다른 함수를 정의하겠습니다. 실행할 함수인 func라는 인수가 하나 있습니다. 일단 안으로 들어가면, 기능을 호출할 뿐입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def run_something(func): ... func()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;run_something()에 대한 답변을 전달하면 다른 thing와 마찬가지로 함수를 데이터로 사용합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; run_something(answer)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;42&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;답변()이 아닌 답변을 전달했습니다. Python에서 이 괄호는 이 함수를 호출하는 것을 의미합니다. 괄호 없이 Python은 다른 객체처럼 함수를 처리합니다. 다른 모든 Python과 마찬가지로 Python도 객체이기 때문입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; type(run_something) &amp;lt;class 'function'&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;인수를 사용하여 함수를 실행해 보겠습니다. arg1과 arg2 두 숫자 인수의 합을 인쇄하는 add_args() 함수를 정의합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def add_args(arg1, arg2): ... print(arg1 + arg2)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;add_args()는 무엇입니까?&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; type(add_args)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;lt;class 'function'&amp;gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이 시점에서 run_something_with_args()라는 함수를 정의하자.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;인수:&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;bull; 기능&amp;mdash;실행 기능&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;bull; arg1&amp;mdash;펑크의 첫 번째 인수&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;bull; arg2&amp;mdash;함수에 대한 두 번째 인수&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def run_something_with_args(func, arg1, arg2): ... func(arg1, arg2)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;run_something_with_args()를 호출할 때 호출자가 전달한 함수는 func 매개 변수에 할당되고 arg1과 arg2는 인수 목록에 이어지는 값을 가져옵니다. 그런 다음 괄호가 Python에게 명령했기 때문에 실행 중인 func(arg1, arg2)는 이러한 인수를 사용하여 해당 함수를 실행합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;function name add_args와 un_something_with_args() 인수 5와 9를 전달하여 테스트해 봅시다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; run_something_with_args(add_args, 5, 9)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;14&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;run_something_with_args() 함수 내에서 add_args 함수는 func 매개 변수에 할당되었고, 5는 arg1에 할당되었으며, 9는 arg2에 할당되었습니다. 이 작업은 실행되었습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;add_args(5, 9)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;이를 *args 및 **kwargs 기법과 결합할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;임의의 수의 위치 인수를 사용하고 합() 함수를 사용하여 합계를 계산한 다음 합계를 반환하는 검정 함수를 정의하겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def sum_args(*args): ... return sum(args)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;나는 이전에 합계를 언급한 적이 없다. 이 함수는 기본 제공 Python 함수로, int 또는 float 인수의 값 합계를 계산합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;함수와 이 함수에 전달하기 위한 임의의 수의 위치 인수를 사용하는 새 함수 run_with_positional_args()를 정의합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def run_with_positional_args(func, *args): ... return func(*args)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;자, 어서 불러봐:&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; run_with_positional_args(sum_args, 1, 2, 3, 4)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;10&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;Inner Functions&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;다른 함수 내에서 함수를 정의할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def outer(a, b):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;...&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;...&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;...&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;...&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; outer(4, 7)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;11&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;내부&lt;span&gt; &lt;/span&gt;기능은&lt;span&gt; &lt;/span&gt;루프&lt;span&gt; &lt;/span&gt;또는&lt;span&gt; &lt;/span&gt;코드&lt;span&gt; &lt;/span&gt;중복을&lt;span&gt; &lt;/span&gt;방지하기&lt;span&gt; &lt;/span&gt;위해&lt;span&gt; &lt;/span&gt;다른&lt;span&gt; &lt;/span&gt;기능&lt;span&gt; &lt;/span&gt;내에서&lt;span&gt; &lt;/span&gt;복잡한&lt;span&gt; &lt;/span&gt;작업을&lt;span&gt; &lt;/span&gt;두&lt;span&gt; &lt;/span&gt;번&lt;span&gt; &lt;/span&gt;이상&lt;span&gt; &lt;/span&gt;수행할&lt;span&gt; &lt;/span&gt;때&lt;span&gt; &lt;/span&gt;유용합니다&lt;span&gt;. &lt;/span&gt;문자열&lt;span&gt; &lt;/span&gt;예제의&lt;span&gt; &lt;/span&gt;경우&lt;span&gt; &lt;/span&gt;이&lt;span&gt; &lt;/span&gt;내부&lt;span&gt; &lt;/span&gt;함수는&lt;span&gt; &lt;/span&gt;인수에&lt;span&gt; &lt;/span&gt;일부&lt;span&gt; &lt;/span&gt;텍스트를&lt;span&gt; &lt;/span&gt;추가합니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;</description>
      <category>파썬코드function</category>
      <category>파이썬코드</category>
      <author>&amp;amp;$#@</author>
      <guid isPermaLink="true">https://about-design.tistory.com/4</guid>
      <comments>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%93%9C-functions#entry4comment</comments>
      <pubDate>Sat, 4 Sep 2021 16:58:09 +0900</pubDate>
    </item>
    <item>
      <title>파이썬코드 Iterate Multiple Sequences with zip()</title>
      <link>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%93%9C-Iterate-Multiple-Sequences-with-zip</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코드.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIwrZh/btrd0v73tcv/XLTklXmENRyl08mvozjXY1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIwrZh/btrd0v73tcv/XLTklXmENRyl08mvozjXY1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIwrZh/btrd0v73tcv/XLTklXmENRyl08mvozjXY1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIwrZh%2Fbtrd0v73tcv%2FXLTklXmENRyl08mvozjXY1%2Fimg.jpg&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코드.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Iterate Multiple Sequences with zip()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;zip() 함수를 사용하여 여러 시퀀스에 걸쳐 병렬로 반복하는 멋진 반복 트릭이 하나 더 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;.&amp;gt;&amp;gt;&amp;gt; days = ['Monday', 'Tuesday', 'Wednesday']&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; fruits = ['banana', 'orange', 'peach']&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; drinks = ['coffee', 'tea', 'beer']&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; desserts = ['tiramisu', 'ice cream', 'pie', 'pudding']&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; &lt;b&gt;for &lt;/b&gt;day, fruit, drink, dessert &lt;b&gt;in &lt;/b&gt;zip(days, fruits, drinks, desserts): ... &lt;b&gt;print&lt;/b&gt;(day, &quot;: drink&quot;, drink, &quot;- eat&quot;, fruit, &quot;- enjoy&quot;, dessert) ...&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Monday : drink coffee - eat banana - enjoy tiramisu&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Tuesday : drink tea - eat orange - enjoy ice cream&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Wednesday : drink beer - eat peach - enjoy pie&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;최단 시퀀스가 완료되면 zip이 중지됩니다. 목록(후식) 중 하나가 다른 목록보다 길어서 다른 목록을 확장하지 않으면 푸딩을 받을 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이전포스팅의 &quot;사전&quot;은 딕트() 함수가 튜플, 목록 또는 문자열과 같은 두 항목 시퀀스에서 사전을 작성하는 방법을 보여줍니다. zip()을 사용하여 여러 시퀀스를 거닐고 동일한 간격띄우기에 있는 항목에서 튜플을 만들 수 있습니다. 해당하는 영어 단어와 프랑스어 단어 두 튜플을 만들어 봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; english = 'Monday', 'Tuesday', 'Wednesday'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; french = 'Lundi', 'Mardi', 'Mercredi'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 zip()을 사용하여 이 튜플을 페어링합니다. zip()으로 반환되는 값 자체는 튜플이나 목록이 아니라 다음 중 하나로 변환될 수 있는 테이블 값입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; list( zip(english, french) )&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;[('Monday', 'Lundi'), ('Tuesday', 'Mardi'), ('Wednesday', 'Mercredi')]&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;zip()의 결과를 dict()에 직접 입력하고 voil&amp;agrave;: 작은 영어-프랑스어 사전!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; dict( zip(english, french) )&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;{'Monday': 'Lundi', 'Tuesday': 'Mardi', 'Wednesday': 'Mercredi'}&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Generate Number Sequences with range()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;range() 함수는 지정된 범위 내의 숫자 스트림을 반환합니다. 먼저 목록이나 튜플과 같은 큰 데이터 구조를 만들고 저장할 필요가 없습니다. 이렇게 하면 컴퓨터의 모든 메모리를 사용하지 않고 프로그램을 손상시키지 않고도 큰 범위를 만들 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;범위()는 슬라이스를 사용하는 방법과 유사하게 사용합니다. 범위(시작, 중지, 단계) 시작을 생략하면 범위는 0에서 시작됩니다. 필요한 값은 중지뿐이며, 슬라이스와 마찬가지로 마지막으로 생성된 값은 중지 직전입니다. 스텝의 기본값은 1이지만 -1로 뒤로 돌아갈 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;zip()과 마찬가지로 range()는 테이블 가능한 개체를 반환하므로 ...에 대한 값을 단계별로 이동하거나 개체를 목록과 같은 시퀀스로 변환해야 합니다. 범위를 0, 1, 2로 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;b&gt;for &lt;/b&gt;x &lt;b&gt;in &lt;/b&gt;range(0,3): ... &lt;b&gt;print&lt;/b&gt;(x)&lt;br /&gt;...&lt;br /&gt;0&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;1&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;2&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; list( range(0, 3) )&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;[0, 1, 2]&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;다음은 2 ~ 0 범위를 만드는 방법입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;b&gt;for &lt;/b&gt;x &lt;b&gt;in &lt;/b&gt;range(2, -1, -1): ... &lt;b&gt;print&lt;/b&gt;(x)&lt;br /&gt;...&lt;br /&gt;2&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;0&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; list( range(2, -1, -1) )&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;[2, 1, 0]&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음은 스텝 크기 2를 사용하여 0에서 10 사이의 짝수를 가져옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; list( range(0, 11, 2) )&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;[0,2,4,6,8,10]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Other Iterators&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음포스팅에서는 파일에 대한 반복을 보여줍니다. 이전포스팅에서는 사용자가 직접 정의한 객체 위에 반복을 설정하는 방법을 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Comprehensions&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이해는 한 명 이상의 반복기에서 Python 데이터 구조를 만드는 간단한 방법입니다. 이해를 통해 루프와 조건부 테스트를 세부 구문을 적게 조합할 수 있습니다. 이해력을 사용하는 것은 때때로 당신이 파이썬을 초보자 이상 알고 있다는 신호로 받아들여집니다. 다시 말해, 피토닉에 가깝죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;List Comprehensions&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이렇게 한 번에 한 항목씩 1부터 5까지의 정수 목록을 작성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; number_list = []&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; number_list.append(1) &amp;gt;&amp;gt;&amp;gt; number_list.append(2) &amp;gt;&amp;gt;&amp;gt; number_list.append(3) &amp;gt;&amp;gt;&amp;gt; number_list.append(4) &amp;gt;&amp;gt;&amp;gt; number_list.append(5) &amp;gt;&amp;gt;&amp;gt; number_list [1,2,3,4,5]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;또는 반복기와 범위() 함수를 사용할 수도 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; number_list = []&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; &lt;b&gt;for &lt;/b&gt;number &lt;b&gt;in &lt;/b&gt;range(1, 6): ... number_list.append(number) ...&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; number_list&lt;br /&gt;[1,2,3,4,5]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;또는 범위()의 출력을 목록으로 직접 변환할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; number_list = list(range(1, 6)) &amp;gt;&amp;gt;&amp;gt; number_list&lt;br /&gt;[1,2,3,4,5]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이러한 접근 방식은 모두 유효한 Python 코드이며 동일한 결과를 생성합니다. 그러나 목록을 작성하는 더 많은 피토닉 방법은 목록 이해를 사용하는 것입니다. 목록 이해의 가장 간단한 형태는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;[ 아이템에 대한 식을(를) 반복할 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음은 목록 이해에서 정수 목록을 작성하는 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; number_list = [number &lt;b&gt;for &lt;/b&gt;number &lt;b&gt;in &lt;/b&gt;range(1,6)] &amp;gt;&amp;gt;&amp;gt; number_list&lt;br /&gt;[1,2,3,4,5]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;첫 번째 행에서 목록의 값을 생성하기 위한 첫 번째 숫자 변수가 필요합니다. 즉, 루프 결과를 number_list에 넣습니다. 두 번째 숫자는 for 루프의 일부입니다. 첫 번째 숫자가 식임을 표시하려면 다음 변형을 시도해 보십시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; number_list = [number-1 &lt;b&gt;for &lt;/b&gt;number &lt;b&gt;in &lt;/b&gt;range(1,6)] &amp;gt;&amp;gt;&amp;gt; number_list&lt;br /&gt;[0,1,2,3,4]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;목록 이해에 따라 대괄호 안의 루프가 이동합니다. 이 이해 예시는 이전 예보다 간단하지 않지만, 더 있습니다. list com&amp;agrave; 이해에는 다음과 같은 조건식이 포함될 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;[ 조건일 경우 반복할 수 없는 항목에 대한 표현식 ]&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1과 5 사이의 홀수 목록만 작성하는 새로운 이해를 만들어 봅시다(홀수일 경우 %2이 참이고 짝수일 경우 거짓임을 기억하십시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; a_list = [number &lt;b&gt;for &lt;/b&gt;number &lt;b&gt;in &lt;/b&gt;range(1,6) &lt;b&gt;if &lt;/b&gt;number % 2 == 1] &amp;gt;&amp;gt;&amp;gt; a_list&lt;br /&gt;[1, 3, 5]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제, 이해는 전통적인 이해 방식보다 조금 더 좁습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; a_list = []&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; &lt;b&gt;for &lt;/b&gt;number &lt;b&gt;in &lt;/b&gt;range(1,6): ... &lt;b&gt;if&lt;/b&gt;number%2==1:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;a_list&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;[1, 3, 5]&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;a_list.append(number)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;마지막으로, 내포된 루프가 있을 수 있는 것처럼, 해당 이해에 ...용 절이 두 개 이상 있을 수 있습니다. 먼저 일반 중첩 루프를 사용해 결과를 인쇄해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; rows = range(1,4) &amp;gt;&amp;gt;&amp;gt; cols = range(1,3) &amp;gt;&amp;gt;&amp;gt; &lt;b&gt;for &lt;/b&gt;row &lt;b&gt;in &lt;/b&gt;rows:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;... &amp;nbsp;&lt;b&gt;for &lt;/b&gt;col &lt;b&gt;in &lt;/b&gt;cols: &lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;... &amp;nbsp;&lt;b&gt;print&lt;/b&gt;(row, col) &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;...&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;11 12 21 22 31 32&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 이해를 사용하여 변수 셀에 할당하여 (행, 콜) 튜플 목록을 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; rows = range(1,4)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; cols = range(1,3)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; cells = [(row, col) &lt;b&gt;for &lt;/b&gt;row &lt;b&gt;in &lt;/b&gt;rows &lt;b&gt;for &lt;/b&gt;col &lt;b&gt;in &lt;/b&gt;cols] &amp;gt;&amp;gt;&amp;gt; &lt;b&gt;for &lt;/b&gt;cell &lt;b&gt;in &lt;/b&gt;cells:&lt;br /&gt;... &lt;b&gt;print&lt;/b&gt;(cell)&lt;br /&gt;...&lt;br /&gt;(1, 1)&lt;br /&gt;(1, 2)&lt;br /&gt;(2, 1)&lt;br /&gt;(2, 2)&lt;br /&gt;(3, 1)&lt;br /&gt;(3, 2)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;또한 튜플 언팩을 사용하여 셀 목록에서 반복하면서 각 튜플의 행 및 col 값을 유크할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;b&gt;for &lt;/b&gt;row, col &lt;b&gt;in &lt;/b&gt;cells: ... &lt;b&gt;print&lt;/b&gt;(row, col) ...&lt;br /&gt;11&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;12 21 22 31 32&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앞줄과 뒷줄에 대한 이해도의 파편도 만약 테스트를 했다면 그들만의 파편을 가질 수 있었을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Dictionary Comprehensions&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;단순히 목록만으로 뒤지지 않기 위해 사전도 이해력이 있다. 가장 간단한 양식은 친숙해 보입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;{key_expression : interitable 식에 대한 value_expression}&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;목록 이해와 마찬가지로 사전 이해도 테스트와 사전 이해도 함께 가질 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;절의 경우 다중:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; word = 'letters'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; letter_counts = {letter: word.count(letter) &lt;b&gt;for &lt;/b&gt;letter &lt;b&gt;in &lt;/b&gt;word}&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; letter_counts&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;{'l': 1, 'e': 2, 't': 2, 'r': 1, 's': 1}&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우리는 '문자' 문자열의 일곱 글자 각각에 루프를 돌리고 그 글자가 몇 번 표시되는지 세고 있습니다. 우리가 사용하는 단어 중 두 개는 모든 e와 모든 t를 두 번 세야 하기 때문에 시간 낭비입니다. 하지만, 우리가 e를 두 번째로 셀 때, 우리는 이미 있던 사전의 항목을 교체하기 때문에 해를 끼치지 않습니다; t를 셀 때도 마찬가지입니다. 그래서, 다음은 조금 더 피토닉했을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; word = 'letters'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; letter_counts = {letter: word.count(letter) &lt;b&gt;for &lt;/b&gt;letter &lt;b&gt;in &lt;/b&gt;set(word)} &amp;gt;&amp;gt;&amp;gt; letter_counts&lt;br /&gt;{'t': 2, 'l': 1, 'e': 2, 'r': 1, 's': 1}&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;집합(워드)을 반복하면 문자열 단어를 반복하는 순서와 다른 순서로 문자가 반환되기 때문에 사전의 키는 이전 예와 다른 순서로 정렬됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Set Comprehensions&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;누구도 소외되고 싶어하지 않기 때문에 세트도 이해력이 있다. 가장 간단한 버전은 방금 본 목록과 사전 이해도처럼 보입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;{식 interitable}&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;긴 버전(테스트의 경우 절에 대해 여러 개)도 다음 집합에 대해 유효합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; a_set = {number &lt;b&gt;for &lt;/b&gt;number &lt;b&gt;in &lt;/b&gt;range(1,6) &lt;b&gt;if &lt;/b&gt;number % 3 == 1} &amp;gt;&amp;gt;&amp;gt; a_set&lt;br /&gt;{1, 4}&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Generator Comprehensions&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;튜플은 이해력이 없습니다! 목록 이해의 대괄호를 괄호로 변경하면 튜플 이해가 생성된다고 생각했을 수 있습니다. 그리고 다음과 같이 입력하면 예외가 없기 때문에 작동하는 것으로 보입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; number_thing = (number &lt;b&gt;for &lt;/b&gt;number &lt;b&gt;in &lt;/b&gt;range(1, 6))&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;괄호 사이에 있는 것은 발전기 이해이며, 그것은 gen‐를 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;연산자 객체:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; type(number_thing)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;lt;&lt;b&gt;class &lt;/b&gt;'&lt;b&gt;generator&lt;/b&gt;'&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;발전기에 대해 더 자세히 알아보겠습니다(98페이지의 &quot;발전기&quot;). 발전기는 한 가지 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;반복자에게 데이터를 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음 그림과 같이 이 생성기 개체에 대해 직접 반복할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;b&gt;for &lt;/b&gt;number &lt;b&gt;in &lt;/b&gt;number_thing: ... &lt;b&gt;print&lt;/b&gt;(number)&lt;br /&gt;...&lt;br /&gt;1&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2 3 4 5&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;또는 생성기 이해에 목록() 통화를 줄여서 목록 이해처럼 작동할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; number_list = list(number_thing) &amp;gt;&amp;gt;&amp;gt; number_list&lt;br /&gt;[1,2,3,4,5]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;생성기는 한 번만 실행할 수 있습니다. 목록, 세트, 문자열 및 사전은 메모리에 존재하지만 생성기는 즉시 값을 생성하여 반복기를 통해 한 번에 하나씩 전달합니다. 이러한 구성 요소를 기억하지 못하므로 생성기를 다시 시작하거나 백업할 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 제너레이터를 다시 반복하려고 하면 다음과 같이 탭이 되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; try_again = list(number_thing)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; try_again&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;[]&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서와&lt;span&gt; &lt;/span&gt;같이&lt;span&gt; &lt;/span&gt;발전기를&lt;span&gt; &lt;/span&gt;이해하거나&lt;span&gt; &lt;/span&gt;발전기&lt;span&gt; &lt;/span&gt;기능을&lt;span&gt; &lt;/span&gt;통해&lt;span&gt; &lt;/span&gt;발전기를&lt;span&gt; &lt;/span&gt;만들&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있습니다&lt;span&gt;. &lt;/span&gt;먼저&lt;span&gt; &lt;/span&gt;일반적인&lt;span&gt; &lt;/span&gt;기능에&lt;span&gt; &lt;/span&gt;대해&lt;span&gt; &lt;/span&gt;이야기한&lt;span&gt; &lt;/span&gt;후&lt;span&gt; &lt;/span&gt;발전기&lt;span&gt; &lt;/span&gt;기능의&lt;span&gt; &lt;/span&gt;특수한&lt;span&gt; &lt;/span&gt;사례에&lt;span&gt; &lt;/span&gt;대해&lt;span&gt; &lt;/span&gt;알아보겠습니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;</description>
      <category>파썬코드예제</category>
      <category>파이썬코드</category>
      <author>&amp;amp;$#@</author>
      <guid isPermaLink="true">https://about-design.tistory.com/3</guid>
      <comments>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%93%9C-Iterate-Multiple-Sequences-with-zip#entry3comment</comments>
      <pubDate>Fri, 3 Sep 2021 21:48:12 +0900</pubDate>
    </item>
    <item>
      <title>파이썬코드구조</title>
      <link>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%93%9C%EA%B5%AC%EC%A1%B0</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코드구조.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PMz4i/btrdOWrTqy5/XkkZ6QlCqooA5hukGgdbZK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PMz4i/btrdOWrTqy5/XkkZ6QlCqooA5hukGgdbZK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PMz4i/btrdOWrTqy5/XkkZ6QlCqooA5hukGgdbZK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPMz4i%2FbtrdOWrTqy5%2FXkkZ6QlCqooA5hukGgdbZK%2Fimg.jpg&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;450&quot; data-filename=&quot;파이썬코드구조.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size18&quot;&gt;대부분의 코드 예제는 대화형 인터프리터를 사용했으며 짧았습니다. 이제 데이터뿐만 아니라 Python 코드 구조화 방법에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;많은 컴퓨터 언어는 코드 섹션을 표시하기 위해 중괄호({ 및 })와 같은 문자 또는 시작 및 끝과 같은 키워드를 사용합니다. 이러한 언어에서는 일관된 들여쓰기를 사용하여 자신과 다른 사용자가 프로그램을 더 잘 읽을 수 있도록 하는 것이 좋습니다. 코드 라인업을 깔끔하게 할 수 있는 도구도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그가 파이썬이 된 언어를 디자인할 때 Guido van Rossum은 들여쓰기 자체만으로도 프로그램의 구조를 정의하기에 충분하다고 판단하고 모든 괄호와 곱슬곱슬한 중괄호를 입력하는 것을 피했다. Python은 프로그램 구조를 정의하기 위해 이렇게 공간을 사용하는 경우는 흔하지 않습니다. 신입들이 가장 먼저 주목하는 부분 중 하나이며, 다른 언어를 접해본 경험이 있는 사람들에게는 이상하게 보일 수 있다. 알고 보니 Python을 잠시 쓰고 나면 자연스럽고 더 이상 눈치채지 못하게 된다. 더 적게 타이핑하면서 더 많은 것을 하는 것에 익숙해지기도 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Comment with #&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;주석은 프로그램에서 Python 해석기에서 무시되는 텍스트입니다. 주석을 사용하여 근처의 Python 코드를 명확히 하거나, 언젠가 수정하기 위해 스스로 메모를 하거나, 원하는 목적을 위해 메모를 할 수 있습니다. # 문자를 사용하여 설명을 표시하면 해당 시점부터 현재 줄 끝까지 모두 설명의 일부입니다. 일반적으로 다음과 같이 줄 자체에 설명이 표시됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;i&gt;# 60 sec/min * 60 min/hr * 24 hr/day&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; seconds_per_day = 86400&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;또는 코드와 같은 줄에 다음과 같이 언급합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; seconds_per_day = 86400 &lt;i&gt;# 60 sec/min * 60 min/hr * 24 hr/day&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;캐릭터는 해시, 샤프, 파운드 또는 사악한 옥토 소프의 여러 이름을 가집니다.1 당신이 뭐라고 부르든, 2의 효과는 그것이 나타나는 선의 끝까지만 지속됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Python에는 여러 줄의 설명이 없습니다. #로 각 주석 줄 또는 섹션을 명시적으로 시작해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;i&gt;# I can say anything here, even if Python doesn't like it, &lt;/i&gt;... &lt;i&gt;# because I'm protected by the awesome&lt;br /&gt;&lt;/i&gt;... &lt;i&gt;# octothorpe.&lt;br /&gt;&lt;/i&gt;...&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그러나 텍스트 문자열에 있는 경우 강력한 옥토소프는 일반 # 문자 역할로 돌아갑니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; print(&quot;No comment: quotes make the # harmless.&quot;) No comment: quotes make the &lt;i&gt;# harmless.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Continue Lines with \&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;줄이 상당히 짧을 때 프로그램을 더 잘 읽을 수 있습니다. 권장(필수는 아님) 최대 행 길이는 80자입니다. 하고 싶은 말을 다 할 수 없는 경우에는 연속 문자 \(백슬래시)를 사용할 수 있습니다. 줄 끝에 \를 붙이면 Python이 갑자기 같은 줄에 서 있는 것처럼 행동합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;예를 들어, 작은 문자열로 긴 문자열을 작성하려면 다음과 같은 단계를 거치면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; alphabet = ''&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; alphabet += 'abcdefg'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; alphabet += 'hijklmnop'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; alphabet += 'qrstuv'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; alphabet += 'wxyz'&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;또는 연속 문자를 사용하여 한 번에 수행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; alphabet = 'abcdefg' + \&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp; &lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'hijklmnop' + \&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &amp;nbsp; &lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;'qrstuv' + \&lt;/li&gt;
&lt;li&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;...&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;'wxyz'&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Python 식이 여러 줄로 확장되는 경우에도 줄 연속성이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt;1+2+&lt;br /&gt;File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1+2+ ^&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;SyntaxError: invalid syntax &amp;gt;&amp;gt;&amp;gt;1+2+\&lt;br /&gt;... 3&lt;br /&gt;6&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Compare with if, elif, and else&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;지금까지 포스팅에서 우리는 거의 전적으로 데이터 구조에 대해 이야기했습니다. 이제 데이터를 프로그램으로 엮는 코드 구조에 첫 발을 내디뎠습니다(세트에 관한 이전 장의 섹션에서 이러한 내용을 미리 볼 수 있습니다). 지속적인 피해가 없었으면 좋겠다.) 첫 번째 예는 부울 변수 재해의 값을 확인하고 적절한 주석을 인쇄하는 작은 Python 프로그램입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; disaster = True &amp;gt;&amp;gt;&amp;gt; if disaster:&lt;br /&gt;... print(&quot;Woe!&quot;) ... else:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;... print(&quot;Whee!&quot;) ...&lt;br /&gt;Woe!&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;if 및 else 행은 조건(여기서 재해 값)이 True인지 여부를 확인하는 Python 문입니다. Print()는 일반적으로 화면에 인쇄하는 Python의 내장 기능입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다른 언어로 프로그래밍한 경우에는 if 테스트에 괄호가 필요하지 않습니다. 만약(재앙 == 진실) 같은 말은 하지 마라. 끝에 콜론(:)이 필요합니다. 나처럼 가끔 콜론을 입력하지 않으면 Python이 오류 메시지를 표시합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;각 인쇄() 라인은 테스트 아래에 들여씁니다. 네 칸을 이용해서 각 부문을 들여보냈지 원하는 모든 들여쓰기를 사용할 수 있지만 Python은 섹션 내의 코드에 일관성을 유지해야 합니다. 왼쪽 줄에 있는 줄에 같은 양을 들여써야 합니다. PEP-8이라고 불리는 권장 스타일은 네 개의 공간을 사용하는 것입니다. 탭을 사용하거나 탭과 공백을 섞지 마십시오. 들여쓰기 카운트를 망칩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여기서는 여러 가지 작업을 수행했습니다. 챕터가 진행됨에 따라 자세히 설명하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; Disaster라는 변수에 True 부울 값 할당&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 재해의 가치에 따라 다른 코드를 실행하고 if와 other를 사용하여 조건부 비교 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;bull; 일부 텍스트를 인쇄하기 위해 인쇄() 함수 호출&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;필요한 만큼 깊이 있는 테스트를 테스트 내에서 수행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;gt;&amp;gt;&amp;gt; furry = True&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; small = True&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; if furry:&lt;br /&gt;... if small:&lt;br /&gt;... print(&quot;It's a cat.&quot;) ... else: &lt;/li&gt;
&lt;li&gt;... print(&quot;It's a bear!&quot;) ... else:&lt;br /&gt;... if small:&lt;br /&gt;... print(&quot;It's a skink!&quot;) ... else: &lt;br /&gt;... print(&quot;It's a human. Or a hairless bear.&quot;) ...&lt;br /&gt;It's a cat. &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Python에서 들여쓰기는 if 섹션과 다른 섹션의 쌍을 지정하는 방법을 결정합니다. 우리의 첫 번째 테스트는 털을 확인하는 것이었다. 털북숭이가 사실이기 때문에, Python은 작으면 움푹 들어간 곳으로 간다. 작으면 True로 설정했기 때문에 작으면 True로 평가됩니다. 그래서 Python은 다음 줄을 실행시켜서 인쇄하게 됩니다. 고양이입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;테스트할 수 있는 가능성이 세 개 이상인 경우, elif(다른 경우 의미) 및 다음을 사용합니다.를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; color = &quot;puce&quot;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; if color == &quot;red&quot;:&lt;br /&gt;... print(&quot;It's a tomato&quot;)&lt;br /&gt;... elif color == &quot;green&quot;:&lt;br /&gt;... print(&quot;It's a green pepper&quot;)&lt;br /&gt;... elif color == &quot;bee purple&quot;:&lt;br /&gt;... print(&quot;I don't know what it is, but only bees can see it&quot;) ... else:&lt;br /&gt;... print(&quot;I've never heard of the color&quot;, color)&lt;br /&gt;...&lt;br /&gt;I've never heard of the color puce&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앞의 예에서는 == 연산자와 동일한지 테스트했습니다. Python의 비교 연산자는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;equality == inequality != less than &amp;lt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;less than or equal &amp;lt;= greater than &amp;gt; greater than or equal &amp;gt;= membership in ...&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그러면 부울 값이 True 또는 False로 반환됩니다. 이 모든 기능이 어떻게 작동하는지 살펴보겠습니다. 먼저 x에 값을 할당합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt;x=7&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 몇 가지 테스트를 해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt;x==5 False &amp;gt;&amp;gt;&amp;gt;x==7 True &amp;gt;&amp;gt;&amp;gt;5&amp;lt;x True &amp;gt;&amp;gt;&amp;gt;x&amp;lt;10 True&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;동일성을 검정하는 데 두 등호(==)가 사용됩니다. 단일 등호(=)는 변수에 값을 할당하는 데 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;동시에 여러 번 비교해야 하는 경우 부울 연산자를 사용하고 최종 부울 결과를 결정하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;부울 연산자는 비교 중인 코드 청크보다 우선 순위가 낮습니다. 즉, 덩어리를 먼저 계산한 다음 비교한다는 뜻입니다. 이 예에서는 xx를 7,5 &amp;lt; x로 설정하고 x &amp;lt; 10도 True로 계산하기 때문에 최종적으로 True와 True를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt;5&amp;lt;xandx&amp;lt;10 True&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이전내용의 &quot;우선 순위&quot;가 지적하듯이, 우선순위에 대한 혼란을 피하는 가장 쉬운 방법은 괄호를 추가하는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt;(5&amp;lt;x)and(x&amp;lt;10) True&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음은 몇 가지 다른 테스트입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt;5&amp;lt;xorx&amp;lt;10 True &amp;gt;&amp;gt;&amp;gt;5&amp;lt;xandx&amp;gt;10 False &amp;gt;&amp;gt;&amp;gt;5&amp;lt;xandnotx&amp;gt;10 True&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하나의 변수를 사용하여 다중 비교를 수행하는 경우 Python을 사용하면 다음과 같은 작업을 수행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt;5&amp;lt;x&amp;lt;10 True&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5&amp;lt;x&amp;gt;와 10&amp;lt;x&amp;gt;와 같습니다. 더 긴 비교를 작성할 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt;5&amp;lt;x&amp;lt;10&amp;lt;999&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;True&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;무엇이 진실인가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우리가 검사하는 요소가 부울이 아니라면요? Python에서 True와 False로 간주하는 것은 무엇입니까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;거짓 값이 반드시 False일 필요는 없습니다. 예를 들어, 다음 항목은 모두 False로 간주됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;boolean False null None zero integer 0&lt;br /&gt;zero float 0.0 empty string '' empty list [] empty tuple () empty dict {} empty set set()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다른 모든 것은 사실로 간주됩니다. Python 프로그램은 이 &quot;truthiness&quot;(또는 이 경우 &quot;false&quot;) 정의를 사용하여 빈 데이터 구조와 False 조건을 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; some_list = []&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; if some_list:&lt;br /&gt;... print(&quot;There's something in here&quot;) ... else:&lt;br /&gt;... print(&quot;Hey, it's empty!&quot;)&lt;br /&gt;...&lt;br /&gt;Hey, it's empty!&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;테스트하는 것이 단순 변수가 아닌 표현식인 경우 Python은 표현식을 평가하고 부울 결과를 반환합니다. 따라서 다음을 입력하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;if color == &quot;red&quot;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Python은 색상 == &quot;빨간색&quot;을 평가합니다. 이 예에서는 puce라는 문자열을&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;color == &quot;red&quot;는 False이고 Python은 다음 테스트로 이동합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;elif color == &quot;green&quot;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Repeat with while&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위에서 아래로 실행되는지, 엘프 또는 다른지를 사용하여 테스트합니다. 가끔, 우리는 한 번 이상 무언가를 해야 합니다. 우리는 루프가 필요합니다. 파이썬의 가장 간단한 루핑 메커니즘은 while입니다. 대화형 인터프리터를 사용하여 다음 예제를 시도해 보십시오. 1에서 5까지의 숫자를 인쇄하는 간단한 루프입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; count = 1&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; while count &amp;lt;= 5: ... print(count) ... count += 1 ...&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우리는 먼저 셀 값 1을 할당했습니다. 반면 루프는 카운트의 값을 5와 비교하고 카운트가 5보다 작거나 같으면 계속했습니다. 루프 내부에서 count 값을 출력한 다음 count + = 1 문장으로 값을 1씩 증가시켰습니다. Python은 루프의 맨 위로 돌아가서 카운트를 다시 5와 비교합니다. count 값이 2가 되므로 while loop의 내용이 다시 실행되어 count가 3으로 증가합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이는 루프 하단에서 카운트가 5에서 6으로 증가할 때까지 계속됩니다. 다음 번에 맨 위로 이동할 때 카운트 = 5가 이제 False가 되고 while 루프가 종료됩니다. Python은 다음 행으로 넘어갑니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Cancel with break&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;문제가 발생할 때까지 루프를 수행하려고 하지만 언제 발생할지 확신할 수 없는 경우 중단 문과 함께 무한 루프를 사용할 수 있습니다. 이번에는 Python의 입력() 함수를 통해 키보드의 입력 줄을 읽고 첫 글자를 대문자로 인쇄하겠습니다. 문자 q만 포함된 줄을 입력하면 루프가 해제됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; while True:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;hellip; stuff = input(&amp;ldquo;string to capitalize [Type q quit]: &amp;ldquo;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;... it stuff == &amp;ldquo;q&amp;rdquo; :&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;... brake&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;... print(stuff.capitalize())&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;String to capitalize [type q to quit]: test&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Test&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;String to capitalize [type q to quit]: hey, it works&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Hey, it works&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;String to capitalize [type q to quit]: q&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;stuff = input(&quot;String to capitalize [type q to quit]: &quot;)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Skip Ahead with continue&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;때로는 루프에서 벗어나고 싶지 않고 어떤 이유로든 다음 반복으로 건너뛰고 싶을 때가 있습니다. 다음은 계획된 예입니다. 정수를 읽고, 정사각형이 홀수이면 인쇄하고, 짝수이면 건너뜁시다. 댓글 몇 개 달았어요. 다시 q를 사용하여 루프를 중지합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; while True: &lt;br /&gt;Integer, please [q to quit]: 1 1 squared is 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;value = input(&quot;Integer, please [q to quit]: &quot;) if value == 'q': &lt;i&gt;# quit&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;break&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;number = int(value)&lt;br /&gt;if number % 2 == 0: &lt;i&gt;# an even number&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;continue&lt;br /&gt;print(number, &quot;squared is&quot;, number*number)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Integer, please [q to quit]: 2 Integer, please [q to quit]: 3 3 squared is 9&lt;br /&gt;Integer, please [q to quit]: 4 Integer, please [q to quit]: 5 5 squared is 25&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Integer, please [q to quit]: q&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Iterate with for&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Python은 그럴듯한 이유로 반복기를 자주 사용합니다. 데이터 구조의 크기나 구현 방법을 알지 못한 채 데이터 구조를 이동할 수 있습니다. 즉석에서 생성된 데이터 위에 반복할 수도 있으므로, 그렇지 않으면 컴퓨터 메모리에 맞지 않는 데이터 스트림을 한 번에 처리할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음과 같은 시퀀스를 밟는 것은 합법적인 Python입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; rabbits = ['Flopsy', 'Mopsy', 'Cottontail', 'Peter'] &amp;gt;&amp;gt;&amp;gt; current = 0&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; while current &amp;lt; len(rabbits):&lt;br /&gt;... print(rabbits[current])&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;... &lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;current += 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Flopsy&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Mopsy&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Cottontail&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Peter&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하지만 더 좋은, 더 피토닉한 방법이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; for rabbit in rabbits: ... print(rabbit)&lt;br /&gt;...&lt;br /&gt;Flopsy&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Mopsy&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Cottontail&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Peter&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;토끼와 같은 목록은 문자열, 튜플, 사전, 세트 및 기타 일부 요소와 함께 Python에서 쉽게 사용할 수 있는 개체 중 하나입니다. 튜플 또는 목록 반복은 한 번에 항목을 생성합니다. 문자열 반복은 다음과 같이 한 번에 문자를 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; word = 'cat'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; for letter in word: ... print(letter) ...&lt;br /&gt;c&lt;br /&gt;a&lt;br /&gt;t&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사전(또는 해당 키() 함수) 위에 반복하면 키가 반환됩니다. 이 예제에서 키는 보드 게임 Clou(북미 이외의 클루도)에 있는 카드 유형입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; accusation = {'room': 'ballroom', 'weapon': 'lead pipe',&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;'person': 'Col. Mustard'}&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; for card in accusation: &lt;i&gt;# or, for card in accusation.keys(): &lt;/i&gt;... print(card)&lt;br /&gt;...&lt;br /&gt;room&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;weapon&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;person&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;키 대신 값을 반복하려면 사전의 값() 함수를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; for value in accusation.values(): ... print(value)&lt;br /&gt;...&lt;br /&gt;ballroom&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;lead pipe&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;Col. Mustard&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;튜플의 키와 값을 모두 반환하려면 다음과 같은 항목() 함수를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; for item in accusation.items(): ... print(item)&lt;br /&gt;...&lt;br /&gt;('room', 'ballroom')&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;('weapon', 'lead pipe')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;('person', 'Col. Mustard')&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;한 번에 튜플에 할당할 수 있습니다. 항목()으로 반환되는 각 튜플에 대해 첫 번째 값(키)을 카드에 할당하고 두 번째 값(값)을 내용에 할당합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; for card, contents in accusation.items():&lt;br /&gt;... print('Card', card, 'has the contents', contents) ...&lt;br /&gt;Card weapon has the contents lead pipe&lt;br /&gt;Card person has the contents Col. Mustard&lt;br /&gt;Card room has the contents ballroom&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Cancel with break&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;잠시 동안처럼 a 루프의 중단이 루프를 벗어나게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Skip with continue&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;for 루프에 계속을 삽입하면 잠시 동안처럼 루프의 다음 반복으로 점프합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Check break Use with else&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;for에는&lt;span&gt;&amp;nbsp; &lt;/span&gt;정상적으로 완료되었는지 여부를 확인하는 다른 옵션이 있습니다. break가 호출되지 않은 경우 다른 문이 실행됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 기능은 루프의 이전 항목이 중단으로 조기에 중지되는 대신 완료로 실행되었는지 확인하려는 경우에 유용합니다. 다음 예제의 for 루프에는 치즈의 이름이 인쇄되어 있으며 치즈 가게에서 치즈가 발견되면 파손됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt;&amp;gt;&amp;gt; cheeses = []&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; for cheese in cheeses:&lt;br /&gt;... print('This shop has some lovely', cheese)&lt;br /&gt;... break&lt;br /&gt;... else: &lt;i&gt;# no break means no cheese&lt;br /&gt;&lt;/i&gt;... print('This is not much of a cheese shop, is it?') ...&lt;br /&gt;This is not much of a cheese shop, is it?&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>파이썬예제</category>
      <category>파이썬코드구조</category>
      <author>&amp;amp;$#@</author>
      <guid isPermaLink="true">https://about-design.tistory.com/2</guid>
      <comments>https://about-design.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%BD%94%EB%93%9C%EA%B5%AC%EC%A1%B0#entry2comment</comments>
      <pubDate>Fri, 3 Sep 2021 02:54:38 +0900</pubDate>
    </item>
  </channel>
</rss>