<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>blue_cherry.log</title>
        <link>https://velog.io/</link>
        <description>벨로그 적응할 수 있을까</description>
        <lastBuildDate>Thu, 29 May 2025 18:52:45 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>blue_cherry.log</title>
            <url>https://velog.velcdn.com/images/blue_cherry/profile/3f6f4758-4509-4e14-a6e7-a9df83aed1df/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. blue_cherry.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/blue_cherry" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[미드프로젝트 관련 : 회귀분석, One-Hot Encoding 이용한 상관분석]]></title>
            <link>https://velog.io/@blue_cherry/%EB%AF%B8%EB%93%9C%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B4%80%EB%A0%A8-%EA%B3%B5%EB%B6%80</link>
            <guid>https://velog.io/@blue_cherry/%EB%AF%B8%EB%93%9C%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B4%80%EB%A0%A8-%EA%B3%B5%EB%B6%80</guid>
            <pubDate>Thu, 29 May 2025 18:52:45 GMT</pubDate>
            <description><![CDATA[<p><em>휘발되기 전에 두서없이 적어보는 개념, 이해한 바 정리</em></p>
<h2 id="회귀분석이란">회귀분석이란?</h2>
<ul>
<li>한 개 이상의 독립변수(X)가 종속변수(Y)에 어떤 영향을 미치는지를 분석하는 통계 기법</li>
<li>두 변수 사이의 관계를 함수로 해석하는 것</li>
<li>원인과 결과 간의 관계를 수학적 모델로 설명하려는 것</li>
</ul>
<h3 id="회귀분석-종류">회귀분석 종류</h3>
<table>
<thead>
<tr>
<th>종류</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><strong>단순 선형 회귀</strong></td>
<td>독립변수 1개, 종속변수 1개</td>
</tr>
<tr>
<td><strong>다중 선형 회귀</strong></td>
<td>독립변수 여러 개, 종속변수 1개</td>
</tr>
<tr>
<td><strong>로지스틱 회귀</strong></td>
<td>종속변수가 범주형일 때 사용 (0 또는 1 같은 분류 문제)</td>
</tr>
<tr>
<td><strong>릿지, 라쏘 회귀</strong></td>
<td>다중공선성 해결을 위한 정규화 회귀</td>
</tr>
</tbody></table>
<span style="color: green">
내가 분석하고 싶은 건 boolean 데이터들 <br>
부가서비스 사용 True / False <br>
이탈여부 True / False <br>
의 분석 <br>
-> 연속형이 아니었고, 이진데이터라서 로지스틱 회귀로 분석 
</span>

<p>개념은 어려울지 몰라도
코드로는 쉽게 할 수 있는 느낌
boolean을 int로 바꿔서 1, 0으로 변경하고</p>
<p>독립변수, 종속변수 할당해서
모델 생성</p>
<p>해석은 마찬가지로
p-value 값이 0.05보다 작으면 유의미한 것으로 간주</p>
<blockquote>
<p>의문점
내가 아는 방식 중에서는 카이스퀘어 독립성 검정이 연관성이 있는지 확인하는 검정인데
어떤 경웨 로지스틱 회귀를, 어떤 때에 카이제곱 검정을 쓰는가?
위의 미드프로젝트 사례에서는 어떤 것을 쓰는 게 맞는가?</p>
</blockquote>
<table>
<thead>
<tr>
<th>항목</th>
<th><strong>로지스틱 회귀</strong></th>
<th><strong>카이제곱 검정 (χ²)</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>목적</strong></td>
<td>원인 변수(X)가 결과(Y)에 <strong>영향을 미치는지</strong> 분석 (인과 관계 추정)</td>
<td>두 범주형 변수 간에 **연관성(상관성)**이 있는지 확인 (관련성 유무 판단)</td>
</tr>
<tr>
<td><strong>입력 변수</strong></td>
<td>독립변수: 범주형 또는 수치형 / 종속변수: <strong>이진형(True/False)</strong></td>
<td>두 변수 모두 범주형 (2×2 교차표 또는 더 큰 표)</td>
</tr>
<tr>
<td><strong>출력</strong></td>
<td>회귀계수(coef), p값, 예측 확률 등 → <strong>예측모델</strong> 생성 가능</td>
<td>p값 하나 → <strong>연관성 있음/없음만 판단</strong></td>
</tr>
<tr>
<td><strong>해석</strong></td>
<td>계수가 양수/음수인지로 영향 방향 판단 (예: 가입하면 이탈률이 줄어든다)</td>
<td>오직 연관이 있는지만 알려줌 (방향·영향력은 알 수 없음)</td>
</tr>
<tr>
<td><strong>예측 가능 여부</strong></td>
<td>O (새로운 데이터 예측 가능)</td>
<td>X (단지 관계만 평가함)</td>
</tr>
<tr>
<td><strong>사용 예</strong></td>
<td>&quot;기기보호서비스가 이탈을 줄이는 데 영향을 주는가?&quot;</td>
<td>&quot;기기보호서비스와 이탈 여부는 관련이 있는가?&quot;</td>
</tr>
</tbody></table>
<p>gpt피셜</p>
<p>예측모델 생성을 통한 예측이 가능한지, p값 하나로 연관성만 평가하는지
가 메인인 느낌이고 아무래도 머신러닝과 통계적 기법이라는 방식의 차이
카이제곱 검정으로 관련성 확인 후, 로지스틱 회귀로 영향성과 방향 파악하는 등 함께 쓰이기도 한다고 함
우리는 분석 정도의 과제이기 때문에 통계로 연관성만 봐도 될 것이라 추측</p>
<h3 id="보조강사님의-조언">보조강사님의 조언</h3>
<ol>
<li>머신러닝을 이용한 분석은 프로젝트 이후, 제대로 배우고 나서 하는 것이 좋아 보임. 아직은 시기상조</li>
<li>통계의 경우 <del>검정은 안 나가긴 했지만</del> 정규 시간에 배운 범위에 있으므로 카이제곱검정까지만 접근하는 게 맞는 듯 → 상관계수 높은 값 먼저, 배경지식상 왜 관련이 없지? 싶은 것들</li>
<li>get_dummies 이용해서 이탈 안 하는 변수의 조건, 하는 조건, 상관없어 보이는 조건</li>
<li>(캐글의 다른 이들의 분석 참조하기 : 다른 시선으로 볼 수 있음)</li>
<li>(GitHub 사용해 보기)</li>
</ol>
<h3 id="카이제곱-독립성-검정">카이제곱 독립성 검정</h3>
<p><em>(출처: ㅇㅅㅈ 멘토님 특강)</em></p>
<ul>
<li><p>정의 : 두 범주형 변수 사이에 <strong>연관성(독립성 여부)</strong>이 있는지 확인하는 검정</p>
</li>
<li><p>조건 : 범주형 X 범주형 데이터 (교차표 형태)  </p>
</li>
<li><p>예시<br>→ 성별과 과목 선호가 관계가 있는가?<br>→ 흡연 여부와 질병 발병이 관련 있는가?</p>
</li>
<li><p>해석</p>
<ul>
<li>p-value &lt; 0.05 → 두 변수는 관련 있음 → H₀ 기각  </li>
<li>p-value ≥ 0.05 → 두 변수는 독립임 → H₀ 유지  </li>
</ul>
</li>
</ul>
<h2 id="분석-절차">분석 절차</h2>
<h3 id="1-one-hot-encoding">1. One-Hot Encoding</h3>
<ul>
<li><p>범주형 데이터를 숫자 벡터로 변환하는 인코딩 기법</p>
</li>
<li><p>각 범주를 이진 변수인 1, 0으로 나타냄</p>
</li>
<li><p>고유값에 해당하는 컬럼에만 1, 나머지는 0</p>
</li>
<li><p><strong><code>pd.get_dummies()</code></strong></p>
<ul>
<li>pandas에서 범주형 데이터를 이진(0/1) 변수들로 바꾸는 함수</li>
</ul>
</li>
<li><p><strong>주의점 : 다중공선성 문제</strong>
다중공선성 : 통계학의 회귀분석에서 독립변수들 간에 강한 상관관가 나타나는 문제
성별이라는 변수에 &quot;남자&quot;, &quot;여자&quot;가 있다면</p>
</li>
</ul>
<table>
<thead>
<tr>
<th align="center">성별_남자</th>
<th align="center">성별_여자</th>
</tr>
</thead>
<tbody><tr>
<td align="center">1</td>
<td align="center">0</td>
</tr>
</tbody></table>
<p>두 열은 완전히 종속적
따라서 열 하나를 제거해서 </p>
<table>
<thead>
<tr>
<th align="center">성별_여자</th>
</tr>
</thead>
<tbody><tr>
<td align="center">1</td>
</tr>
<tr>
<td align="center">만 남기면 불필요한 중복 제거</td>
</tr>
</tbody></table>
<ul>
<li><code>drop_first=True</code>로 열 한 개 제거</li>
</ul>
<span style="color: darkblue">
현재 하나의 범주가 아닌 여러 범주를 한 번에 상관계수를 구하려고 변환하였음. <br>
회귀 분석이 아닌 탐색적 분석만을 위한 One-Hot-Encoding이었고, <br>
추후 카이제곱 독립성 검정을 시행할 것이므로 범주마다 열 하나씩 제외하는 것보다는 그대로 두는 것 선택
</span>

<ul>
<li><strong>주의점 : 차원의 저주</strong><ul>
<li>데이터의 차원이 증가할수록, 데이터가 희소해지고 모델의 성능이 저하되는 현상</li>
</ul>
</li>
</ul>
<span style="color: darkblue">
boolean 이외 범주형 데이터는 최대 4개의 unique 값을 가짐.
→ 해당 없음
</span>

<h3 id="2-상관계수-행렬">2. 상관계수 행렬</h3>
<ul>
<li>2차원 행렬로, 각 변수(열) 간의 상관계수를 보여줌</li>
<li><strong><code>.corr()</code></strong><ul>
<li>pandas의 DF 메서드로, column간의 상관계수(피어슨 상관계수)를 계산해주는 함수</li>
</ul>
</li>
<li><strong>주의점</strong><ul>
<li>피어슨 상관계수는 &#39;선형 상관성&#39;을 측정 (선형 관계 가정)</li>
<li>Boolean 값의 경우 1, 0뿐이므로 패턴이 우연히 겹칠 수 있음</li>
</ul>
</li>
</ul>
<span style="color: darkblue">
카이제곱 독립성 검정을 통해 두 변수의 연관성 검정
</span>

<h3 id="3-히트맵">3. 히트맵</h3>
<ul>
<li>행렬 형태의 데이터를 색상으로 시각화한 그래프</li>
<li>상관계수 행렬을 히트맵으로 표현</li>
</ul>
<h3 id="4-카이제곱-검정">4. 카이제곱 검정</h3>
<ul>
<li>|상관계수| &gt; 3 인 쌍들 대상으로 카이제곱 검정<pre><code class="language-py">from scipy.stats import chi2_contingency
</code></pre>
</li>
</ul>
<h1 id="상관계수-절댓값-기준-필터링">상관계수 절댓값 기준 필터링</h1>
<p>threshold = 0.3
corr_filtered = corr_matrix[(corr_matrix.abs() &gt; threshold) &amp; (corr_matrix.abs() &lt; 1)]</p>
<h1 id="중복-제거">중복 제거</h1>
<p>import numpy as np
checked_pairs = set()</p>
<p>for col in corr_filtered.columns:
    for row in corr_filtered.index:
        if not np.isnan(corr_filtered.loc[row, col]):
            pair = tuple(sorted([row, col]))
            if row != col and pair not in checked_pairs:
                checked_pairs.add(pair)</p>
<pre><code>            # 카이제곱 검정
            contingency = pd.crosstab(df_encoded[row], df_encoded[col])
            chi2, p, dof, expected = chi2_contingency(contingency)

            print(f&quot;[{row} vs {col}]&quot;)
            print(f&quot;카이제곱 통계량: {chi2:.2f}, p-value: {p:.4f}&quot;)
            if p &lt; 0.05:
                print(&quot;→ 유의미한 연관성 있음 (독립 아님)\n&quot;)
            else:
                print(&quot;→ 통계적으로 독립 (연관성 없음)\n&quot;)</code></pre><p>```
한 번에도 할 수 있는데 하나씩 할 생각했네 역시 머리가 나쁘면 고생...</p>
<blockquote>
<p>느낀 점
우리 조가 중하는 가고 있다고 생각했는데, 다른 조들은 엄청나게 앞서 가고 있었음...어리석음에 반성
문서화, 구조화하는 능력이 확실히 부족한 듯. 확실히 이 부분은 개선 필요 O
<del>느낀 점 2</del>
<del>아이고 내 시간</del></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[멋쟁이사자처럼 데이터분석] 파이썬 실습]]></title>
            <link>https://velog.io/@blue_cherry/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%8B%A4%EC%8A%B5</link>
            <guid>https://velog.io/@blue_cherry/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%8B%A4%EC%8A%B5</guid>
            <pubDate>Wed, 09 Apr 2025 09:16:44 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Notion에서 정리한 내용을 공유용으로 옮긴 내용입니다.
양식과 구성의 어색함이 있을 수 있습니다.</p>
</blockquote>
<p><em>04/09(수) 학습내용을 바탕으로 업로드하였음</em></p>
<p><em>코드라이언 LMS에 따라 실습한 내용입니다.</em></p>
<h1 id="메뉴-자판기-만들기">메뉴 자판기 만들기</h1>
<h2 id="이론">이론</h2>
<h3 id="메뉴-랜덤-출력">메뉴 랜덤 출력</h3>
<pre><code class="language-python">import random

print(random.choice([&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;]))</code></pre>
<ul>
<li>random.choice : 리스트, 튜플, 문자열(”abcde”면 random으로 “d” 나옴)에서 랜덤으로 값을 하나 추출</li>
</ul>
<br>

<h3 id="반복--for-문">반복 : for 문</h3>
<pre><code class="language-python">import random

# list
menu = [&quot;된장찌개&quot;, &quot;피자&quot;, &quot;치킨&quot;,&quot;떡볶이&quot;, &quot;라면&quot;]
# 30번 반복
for _ in range(30) :
    print(random.choice(menu))
    # print(&quot;이 문장도 반복되는가?&quot;)</code></pre>
<h3 id="반복--while-문">반복 : while 문</h3>
<pre><code class="language-python">import random
import time

menu = [&quot;된장찌개&quot;, &quot;피자&quot;, &quot;치킨&quot;,&quot;떡볶이&quot;, &quot;라면&quot;]
# 30번 반복
while True:
    print(random.choice(menu))
    # break   # break 위치 학습
    print(&quot;이 문장도 반복되는가?&quot;)
    time.sleep(1)
    break</code></pre>
<ul>
<li>무한히 반복되지 않게 주의</li>
<li>while True: 형태라면
break 필요</li>
</ul>
<h3 id="변수">변수</h3>
<ul>
<li><strong>이해</strong><ul>
<li>정리 상자에서 티셔츠를 가져다 줘, 라고 친구에게 부탁한다면?
→ 티셔츠 상자 안에 있는 티셔츠를 하나 꺼내서 줌
→ ‘티셔츠’ 이름표를 가져다 주는 게 아님</li>
</ul>
</li>
</ul>
<pre><code>import random

lunch = random.choice([&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;])
lunch = &quot;냉장고&quot;
# 변수 덮어씌워짐. lunch 는 그저 문자열 &quot;냉장고&quot;
# 이제 위의 list 불러올 수 없음

dinner = random.choice([&quot;김밥&quot;, &quot;쫄면&quot;, &quot;돈까스&quot;])

print(lunch)</code></pre><p><code>lunch</code>를 프린트하면 <code>lunch</code>가 나오는 게 아닌 그 안에 있는 “피자”가 나옴</p>
<ul>
<li>이름표 = lunch = 변수<br>

</li>
</ul>
<h3 id="dictionary">Dictionary</h3>
<ul>
<li>도입<ul>
<li>조립식 약통</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/blue_cherry/post/d37da565-499b-4a72-b0e6-29ed7d2c5f2c/image.png" alt=""></p>
<p><em>그림출처 : 멋쟁이사자처럼 / CODELION</em></p>
<ul>
<li><p>약이 많다면 이런 식으로 각각 <strong>요일</strong>로 구분된 약통에 약을 미리 담아 놓고 먹기도 함</p>
<pre><code>  - 월요일 : 주황색 알약 한 개
  - 화요일 : 초록색 알약 한 개
  - 수요일 :  작은 알약 각각 한 개</code></pre><ul>
<li>&#39;월요일&#39;  또는 &#39;초록색 알약 한 개&#39; 만으로는 의미가 없음. 두 개가 같이 있어야 의미 완성</li>
</ul>
</li>
<li><p>딕셔너리 만들기</p>
<ul>
<li>고향은 수원이다.</li>
<li>취미는 영화보기이다.</li>
<li>좋아하는 음식은 국수이다.</li>
</ul>
</li>
<li><p>딕셔너리 형태로</p>
<pre><code class="language-python">  Info1 = {&quot;고향&quot; : &quot;수원&quot;, &quot;취미&quot; : &quot;영화보기&quot;, &quot;좋아하는 음식&quot; : &quot;국수&quot;}
  print(Info1)</code></pre>
</li>
<li><p>취미가 무엇인지 알고 싶다면?</p>
<pre><code class="language-python">  print(Info1.get(&quot;취미&quot;))</code></pre>
</li>
<li><p>get( )</p>
<ul>
<li><p>딕셔너리에서 값을 꺼내되, 에러 없이 None이나 대체값을 줄 수 있는 안전한 메서드</p>
<ul>
<li><code>dict[&quot;키&quot;]</code> 는 키가 없으면 오류 발생(KeyError)</li>
</ul>
<pre><code class="language-python">info = {&quot;이름&quot;: &quot;지민&quot;, &quot;나이&quot;: 25}

print(info.get(&quot;취미&quot;))           # 출력: None (취미가 없으니까!)
print(info.get(&quot;취미&quot;, &quot;없음&quot;))   # 출력: 없음 (기본값을 설정했으니까!)
</code></pre>
</li>
<li><p>“없음”이 기본값 → 원하는 값이 없을 때 대신 사용하는 값</p>
</li>
<li><p>dict.get(”키”,”기본값”)의 형태로 쓰는 게 좋음</p>
</li>
</ul>
</li>
<li><p>key, value</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/blue_cherry/post/43671fd9-8acc-457b-bb47-a81982504218/image.png" alt=""></p>
<p><em>그림출처 : 멋쟁이사자처럼 / CODELION</em></p>
<br>

<h3 id="list와-dictionary에-자료-추가삭제">List와 Dictionary에 자료 추가/삭제</h3>
<p>자료를 저장하는 방법에는 <strong>리스트, 딕셔너리</strong>가 가장 중요</p>
<p><strong><em>DIctionary</em></strong></p>
<ul>
<li>딕셔너리에 값 추가하기<ul>
<li>dict[”키”] = “값”</li>
</ul>
</li>
</ul>
<pre><code class="language-python">info = {&quot;나이&quot;: 25}
info[&quot;이름&quot;] = &quot;지민&quot;

print(info)
# 출력: {&#39;나이&#39;: 25, &#39;이름&#39;: &#39;지민&#39;}</code></pre>
<p>수정하는 형식도 마찬가지</p>
<ul>
<li><p>딕셔너리에 값 삭제하기</p>
<ul>
<li><p>del dict[”키”]</p>
<pre><code class="language-python">  info = {&quot;이름&quot;: &quot;지민&quot;, &quot;나이&quot;: 25}
  del info[&quot;이름&quot;]

  print(info)
  # 출력: {&#39;나이&#39;: 25}</code></pre>
<p>  없는 키 del 하면 KeyError</p>
  <br>
</li>
<li><p>dict.clear : 딕셔너리 전체를 싹 비움</p>
<pre><code class="language-python">  info = {&quot;이름&quot;: &quot;지민&quot;, &quot;나이&quot;: 25}
  info.clear()

  print(info)
  # 출력: {}</code></pre>
</li>
</ul>
</li>
</ul>
<pre><code class="language-python">information = {&quot;고향&quot;:&quot;수원&quot;, &quot;취미&quot;:&quot;영화관람&quot;,&quot;좋아하는 음식&quot;:&quot;국수&quot;}
foods = [&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;]
print(information.get(&quot;취미&quot;))

# 딕셔너리에 값 추가하기
information[&quot;특기&quot;] = &quot;피아노&quot;
information[&quot;사는곳&quot;] = &quot;서울&quot;

# 딕셔너리에 값 삭제하기
del information[&quot;좋아하는 음식&quot;]

# 딕셔너리에 정보 묶음이 몇 개인지
print(information)
print(len(information)) # 3개 + 2개 추가 - 1개 삭제 = 4

# clear
information.clear()
print(information)</code></pre>
<p><em>영화관람
{&#39;고향&#39;: &#39;수원&#39;, &#39;취미&#39;: &#39;영화관람&#39;, &#39;특기&#39;: &#39;피아노&#39;, &#39;사는곳&#39;: &#39;서울&#39;}
4
{}</em></p>
<br>

<p><strong><em>List</em></strong></p>
<ul>
<li>순서 값 (인덱싱)</li>
</ul>
<pre><code class="language-python">foods = [&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;]
print(foods[2]) # 출력 : 제육볶음
print(foods[3]) # 에러
print(foods[-2]) # 출력 : 피자</code></pre>
<p><img src="https://velog.velcdn.com/images/blue_cherry/post/84f62bb7-6d80-4c21-9229-3d0bc51a3c35/image.png" alt=""></p>
<p><em>그림출처 : 멋쟁이사자처럼 / CODELION</em></p>
<ul>
<li>위와 같은 방법으로 0부터 배정</li>
<li>없는 경우 에러</li>
</ul>
<br>

<ul>
<li><p>음수 순서값 : 뒤에서부터 -1, -2, …순으로</p>
<br>
</li>
<li><p>리스트에 값 추가 : list.append(”값”)</p>
</li>
</ul>
<pre><code>foods.append(&quot;김밥&quot;)
print(foods)

# [&#39;된장찌개&#39;, &#39;피자&#39;, &#39;제육볶음&#39;, &#39;김밥&#39;]</code></pre><br>

<ul>
<li>리스트에 값 삭제 : del list[ 순서값 ]</li>
</ul>
<pre><code class="language-python">del foods[-1]
print(foods)

# [&#39;된장찌개&#39;, &#39;피자&#39;, &#39;제육볶음&#39;]</code></pre>
<p>list 뒤 순서 값에는 int, slices만 들어갈 수 있음
<br></p>
<h3 id="반복">반복</h3>
<ul>
<li>단순 range</li>
</ul>
<pre><code class="language-python">for x in range(30):
    print(x)
# 0부터 29까지 x 안에 넣어져서 출력</code></pre>
<br>

<ul>
<li>list 반복 1)</li>
</ul>
<pre><code class="language-python">foods = [&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;]
for x in range(3):
    print(foods[x])</code></pre>
<p>→ 리스트에 “라면”을 추가하고 싶으면, range값 바꿔 줘야 함
→ 리스트 수정될 때마다 range 변경 필요
→ 개선 필요
<br></p>
<ul>
<li>list 반복 2)</li>
</ul>
<pre><code class="language-python">for i in foods:
    print(i)</code></pre>
<p><em>된장찌개
피자
제육볶음</em></p>
<p>→ 이렇게 하면 list 가 몇 개든 알아서 반복
<br></p>
<ul>
<li>Dictionary도 유사</li>
</ul>
<pre><code class="language-python">information = {&quot;고향&quot;:&quot;수원&quot;, &quot;취미&quot;:&quot;영화관람&quot;, &quot;좋아하는 음식&quot;:&quot;국수&quot;}
for x, y in information.items():
    print(x)
    print(y)</code></pre>
<p><em>고향
수원
취미
영화관람
좋아하는 음식
국수</em></p>
<p>→ DIctionary의 요소 개수가 몇 개든 알아서 반복
<br></p>
<h3 id="집합">집합</h3>
<ul>
<li>순서 없음</li>
<li>중복 없음</li>
</ul>
<pre><code class="language-python">menu1 = set([&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;])
menu2 = set([&quot;된장찌개&quot;, &quot;떡국&quot;, &quot;김밥&quot;])</code></pre>
<br>

<ul>
<li>합집합<ul>
<li>두 집합의 겹치는 부분 알아서 1번으로 처리</li>
</ul>
</li>
</ul>
<pre><code class="language-python">menu3 = menu1 | menu2
print(menu3)</code></pre>
<p><em>{&#39;떡국&#39;, &#39;김밥&#39;, &#39;피자&#39;, &#39;제육볶음&#39;, &#39;된장찌개&#39;}</em>
<br></p>
<ul>
<li>교집합<ul>
<li>겹치는 부분만 집합</li>
</ul>
</li>
</ul>
<pre><code class="language-python">menu4 = menu1 &amp; menu2
print(menu4)</code></pre>
<p><em>{&#39;된장찌개&#39;}</em>
<br></p>
<ul>
<li>차집합</li>
</ul>
<pre><code class="language-python">menu5 = menu1 - menu2
print(menu5)</code></pre>
<p><em>{&#39;피자&#39;, &#39;제육볶음&#39;}</em>
<br></p>
<h3 id="if-문">if 문</h3>
<ul>
<li><p>if 문 사용시 들여쓰기 주의</p>
</li>
<li><p>만약 뽑힌 게 제육볶음이면, “곱빼기 주세요”를 출력하자. → if - print</p>
</li>
</ul>
<pre><code class="language-python">import random

food = random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;])

if(food == &quot;제육볶음&quot;):
    print(&quot;곱배기 주세요&quot;)
print(&quot;종료&quot;)</code></pre>
<ul>
<li><p>만약 뽑힌 게 제육볶음이면, “곱빼기 주세요”를 출력하자. → if - print</p>
<p>  그렇지 않다면 “그냥 주세요”를 출력하자. → else - print</p>
</li>
</ul>
<pre><code class="language-python">food2 = random.choice([&quot;된장찌개&quot;,&quot;피자&quot;,&quot;제육볶음&quot;])

if(food2 == &quot;제육볶음&quot;):
    print(&quot;곱배기 주세요&quot;)
else:
    print(&quot;그냥 주세요&quot;)
print(&quot;종료&quot;)</code></pre>
<hr>
<h2 id="실습">실습</h2>
<ul>
<li><p>추가/삭제 기능을 탑재한 메뉴 리스트를 만들어서 그 중에 하나를 뽑아라.</p>
</li>
<li><p>메뉴 리스트를 input받아서 추가 + 반복</p>
</li>
</ul>
<pre><code class="language-python"># 메뉴 리스트
lunch = [&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;, &quot;짜장면&quot;]

# 음식 추가
while True : # 반복해서 추가
    item = input(&quot;음식을 추가해 주세요 : &quot;)
    lunch.append(item)
    print(lunch)
    #무한으로 추가됨</code></pre>
<ul>
<li>특정 조건에서 종료할 수 있도록 변경</li>
</ul>
<pre><code class="language-python"># 메뉴 리스트
lunch = [&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;, &quot;짜장면&quot;]

# 음식 추가
while True : # 반복해서 추가
    print(lunch)
    item = input(&quot;음식을 추가해 주세요 : &quot;)
    if (item == &quot;q&quot;): # q면 중단되고
        break
    else:
        lunch.append(item) # 아니면 계속 반복
print(lunch) # 최종 결과 출력 후 종료</code></pre>
<br>

<h3 id="데이터-삭제">데이터 삭제</h3>
<ul>
<li>차집합 사용해 보기</li>
</ul>
<pre><code class="language-python">set_lunch = set([&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;, &quot;짜장면&quot;])
item = &quot;짜장면&quot;
print(set_lunch - set([item]))
# 차집합을 하기 위해 item 리스트로 만들어서 set으로 묶어줌 : 3개만 출력
print(set_lunch) # 원래의 set_lunch이므로 4개 출력
</code></pre>
<p>차집합은 원래의 set_lunch 에 변화를 주지 않음
<br></p>
<ul>
<li>본인을 참조? 하여 바꿔 주어야 함</li>
</ul>
<pre><code class="language-python">set_lunch = set([&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;, &quot;짜장면&quot;])
item = &quot;짜장면&quot;
set_lunch = set_lunch - set([item])
print(set_lunch) # 3개 출력</code></pre>
<ul>
<li><code>set_lunch = set_lunch - set([item])</code> 부분 추가하면 3개로 출력<br>

</li>
</ul>
<h3 id="최종">최종</h3>
<pre><code class="language-python">import random
import time

# 메뉴 리스트
lunch = [&quot;된장찌개&quot;, &quot;피자&quot;, &quot;제육볶음&quot;, &quot;짜장면&quot;]

# 음식 추가
while True : # 반복해서 추가
    print(lunch)
    item = input(&quot;음식을 추가해 주세요 : &quot;)
    if (item == &quot;q&quot;): # q면 중단되고
        break
    else:
        lunch.append(item) # 아니면 계속 반복
print(lunch) # 최종 결과 출력 후 종료

set_lunch = set(lunch) # lunch가 집합으로 바뀌어 저장

# food12에서 이어서

# 음식 삭제
while True:
    print(set_lunch)
    item = input(&quot;음식을 삭제해 주세요 : &quot;)
    if (item == &quot;q&quot;):
        break
    else:
        set_lunch = set_lunch - set([item]) # 괄호 중요

print(set_lunch, &quot;중에서 선택합니다.&quot;)
# print를 ,로 연결하면 한 줄로 쭉 출력할 수 있음
print(&quot;5&quot;)
time.sleep(1)
print(&quot;4&quot;)
time.sleep(1)
print(&quot;3&quot;)
time.sleep(1)
print(&quot;2&quot;)
time.sleep(1)
print(&quot;1&quot;)
time.sleep(1)

print(random.choice(list(set_lunch))) # random은 set에서 쓸 수 없음 -&gt; list로</code></pre>
<hr>
<h1 id="이상형이-뭐예요">이상형이 뭐예요</h1>
<h2 id="함수">함수</h2>
<ul>
<li><strong>이해</strong><ul>
<li>카페에 가서 돌체 라떼를 시킨다면</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/blue_cherry/post/96c2d8f2-4340-49f3-8c5f-1eb09edf8389/image.png" alt=""></p>
<p><em>그림출처 : 멋쟁이사자처럼 / CODELION</em></p>
<ul>
<li>이러한 준비물, 레시피, 주의사항 등이 필요</li>
<li>사람이 하면 실수가 있을 수 있음<br>

</li>
</ul>
<ul>
<li>but 돌체라떼 기계<ul>
<li>버튼을 누르면 항상 똑같은 돌체라떼가 나옴
= 함수!</li>
</ul>
</li>
</ul>
<br>

<ul>
<li>함수의 구조<ul>
<li>def 함수이름():
   함수가 해야 할 내용 1
   함수가 해야 할 내용 2
  …
<img src="https://velog.velcdn.com/images/blue_cherry/post/d4bfe852-965f-4e81-980f-80826266b1c0/image.png" alt=""></li>
</ul>
</li>
</ul>
<p><em>그림출처 : 멋쟁이사자처럼 / CODELION</em></p>
<br>
<br>

<ul>
<li><p>익명 게시판에 질문/답변 형식 만들기</p>
</li>
<li><p>구현 idea1)</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/blue_cherry/post/ff9ccd07-d161-4e9f-9edb-c2ed0a6e7a74/image.png" alt=""></p>
<p><em>그림출처 : 멋쟁이사자처럼 / CODELION</em>
<br></p>
<p>→ 딕셔너리로 구현하자!</p>
<p>{”질문” : “취미는 무엇입니까”, “답변” : “영화 보기입니다”}</p>
<p>{”질문” : “특기는 무엇입니까”, “답변” : “댄스입니다”}
<br></p>
<ul>
<li>구현 idea2 )</li>
</ul>
<p><img src="https://velog.velcdn.com/images/blue_cherry/post/591a5db5-0de0-4786-b1b5-503cd28be8f2/image.png" alt=""></p>
<p>→ 리스트로 하나의 딕셔너리씩 나누기</p>
<p>[</p>
<p>{”질문” : “취미는 무엇입니까”, “답변” : “영화 보기입니다”}</p>
<p>{”질문” : “특기는 무엇입니까”, “답변” : “댄스입니다”}</p>
<p>]</p>
<p>위와 같이 리스트 - 딕셔너리 중첩해서 쓰는 경우 많음
<br></p>
<ul>
<li>작성 방식</li>
</ul>
<p><img src="https://velog.velcdn.com/images/blue_cherry/post/fe14e806-37fa-4278-b44f-7bd5f9444811/image.png" alt=""></p>
<p><em>그림출처 : 멋쟁이사자처럼 / CODELION</em>
<br></p>
<ul>
<li>1번<ul>
<li>list, dictionary 둘 다 사용</li>
<li>어느 것이 질문, 어느 것이 답변인지 확실히 알 수 있음</li>
<li>코드가 복잡함</li>
</ul>
</li>
<li>2번<ul>
<li>dictionary만 사용</li>
<li>작성한 사람만 알 수 있음</li>
<li>다른 사람과 협업 어려움</li>
<li>코드 간결해짐</li>
</ul>
</li>
</ul>
<p>서로 데이터 어떻게 저장하는지 방식 비교하며 보기
<br></p>
<h3 id="dictionary만-사용">dictionary만 사용</h3>
<pre><code class="language-python"># 딕셔너리만 사용

total_dictionary = {}

# 질문 q로 중단할 때까지 차례로 입력받음
while True:
    question = input(&quot;질문을 입력해주세요 : &quot;)
    if question == &quot;q&quot;:
        break
    else:
        total_dictionary[question] = &quot;&quot;
        # question이 total_dictionary에 들어가고 답변은 &quot;&quot;

# 질문 전부 하나씩 출력하면서 답변 적을 것임
for i in total_dictionary:
    print(i)
    answer = input(&quot;답변을 입력해 주세요 : &quot;)
    total_dictionary[i] = answer # answer로 받은 답변 딕셔너리에 넣기

print(total_dictionary)</code></pre>
<p><em>질문을 입력해주세요 : 취미는?
질문을 입력해주세요 : 특기는?
질문을 입력해주세요 : q
취미는?
답변을 입력해 주세요 : 피아노
특기는?
답변을 입력해 주세요 : 줄넘기
{&#39;취미는?&#39;: &#39;피아노&#39;, &#39;특기는?&#39;: &#39;줄넘기&#39;}</em></p>
<ul>
<li>key 먼저 넣고, key 하나씩 띄우면서 answer 다시 넣었음<br>

</li>
</ul>
<h3 id="list-dictionary-사용">list, dictionary 사용</h3>
<p><img src="https://velog.velcdn.com/images/blue_cherry/post/5bc54bf0-0a8a-4168-9f47-31ccf81159f2/image.png" alt=""></p>
<p><em>그림출처 : 멋쟁이사자처럼 / CODELION</em>
<br></p>
<ul>
<li>질문 부분 구성<ul>
<li>total_list 안에 담음</li>
<li>else 부분 : 딕셔너리 형태로 리스트에 append</li>
</ul>
</li>
</ul>
<pre><code># 리스트 사용
total_lsit = []

# 질문하는 부분
while True:
    question = input(&quot;질문을 입력해주세요 : &quot;)
    if question == &quot;q&quot;:
        break
    else:
        total_list.append({&quot;질문&quot; : question, &quot;답변&quot; : &quot;&quot;})</code></pre><br>

<ul>
<li>답변 부분 구성<ul>
<li>흰 네모 각각이 딕셔너리</li>
<li>답변하는 부분에서 딕셔너리가 통째로 i에 들어감</li>
<li>취미는 무엇입니까? 만 출력하려면 i[”질문”] 해야 출력됨</li>
</ul>
</li>
</ul>
<pre><code class="language-python"># 리스트 사용
total_list = []

# 질문하는 부분
while True:
    question = input(&quot;질문을 입력해주세요 : &quot;)
    if question == &quot;q&quot;:
        break
    else:
        total_list.append({&quot;질문&quot; : question, &quot;답변&quot; : &quot;&quot;})

# 답변하는 부분
for i in total_list:
    print(i[&quot;질문&quot;])
    answer = input(&quot;답변을 입력해주세요 : &quot;)
    i[&quot;답변&quot;] = answer
print(total_list)</code></pre>
<p>(전체 코드. #답변하는 부분 추가됨)</p>
<p><em>질문을 입력해주세요 : 취미는?
질문을 입력해주세요 : 특기는?
질문을 입력해주세요 : q
취미는?
답변을 입력해주세요 : 라면 끓이기
특기는?
답변을 입력해주세요 : 라면 먹기
[{&#39;질문&#39;: &#39;취미는?&#39;, &#39;답변&#39;: &#39;라면 끓이기&#39;}, {&#39;질문&#39;: &#39;특기는?&#39;, &#39;답변&#39;: &#39;라면 먹기&#39;}]</em></p>
<hr>
<p>실습하는 내용이 굉장히 기초적인 내용이라 쉽기도 하고 해서 재밌게는 한 듯
일단 객체지향 가지고 뭔가 Class와 함수 만들어서 출력하는 것보다 훨씬 이해하기 편함</p>
<p>하지만 시간 체크가 너무 귀찮게 해...분명 정리하면서 천천히 듣고 점심도 한 20분은 켜놨던 거 같은데 어째서 시간이 이렇게 적게 측정됐냔 말임...
내일은 점심 풀로 켜놔야지ㅠㅠㅠㅠ</p>
<p>객체지향 예제를 일부러 정리 안했는데 오늘 이해해서 정리해보려 했더니😵
챗GPT와 떠든 길이가 장난이 아님
이해는 어찌어찌 된 거 같은데 이걸 말로 풀 자신이 없다...</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[멋쟁이사자처럼 데이터분석] 객체지향, 상속, 예외처리, 모듈]]></title>
            <link>https://velog.io/@blue_cherry/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%EC%83%81%EC%86%8D-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC-%EB%AA%A8%EB%93%88</link>
            <guid>https://velog.io/@blue_cherry/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%EC%83%81%EC%86%8D-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC-%EB%AA%A8%EB%93%88</guid>
            <pubDate>Tue, 08 Apr 2025 20:00:15 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Notion에서 정리한 내용을 공유용으로 옮긴 내용입니다.
양식과 구성의 어색함이 있을 수 있습니다.</p>
</blockquote>
<p><em>04/07(월) ~ 04/08(화) 학습내용을 바탕으로 업로드하였음</em></p>
<p>하루 밀려서 오늘 싹 정리...</p>
<hr>
<h1 id="객체-지향-프로그래밍">객체 지향 프로그래밍</h1>
<p><del>이 부분 너무 어려워...나 울어...</del>
<del>기존에 문제 풀 때도 헤맸던...영상을 따로 찾아보고 했었는데 또 배워도 모르네</del></p>
<ul>
<li><p><strong>객체 지향 프로그래밍이란?</strong></p>
<ul>
<li>객체를 지향하는 프로그래밍 방식</li>
</ul>
</li>
<li><p><strong>객체의 배경</strong>
(방식의 발전?)</p>
</li>
<li><p>변수에서 시작 (v1, v2, v3...)</p>
<ul>
<li>이름만 정해주면 값 저장해 두었다가 이름으로 접근해서 가져오기</li>
<li>학생 500명 → <em>변수가 너무 많아…</em> → 배열 등장</li>
</ul>
</li>
<li><p>배열/리스트/튜플 (묶어서 [v1, v2, v3...] 한번에 관리)</p>
<ul>
<li>국어, 수학, 등등 점수 배열이 많아짐</li>
<li>마찬가지로 관리 귀찮음</li>
</ul>
</li>
<li><p>딕셔너리</p>
<ul>
<li><p>학생 한 명을 딕셔너리에 담음</p>
</li>
<li><p>그것들을 모아서 리스트로</p>
<p>  → 이름을 가지고 관리 <em>이거 괜찮네.</em></p>
</li>
</ul>
</li>
<li><p>딕셔너리에서 객체로</p>
<ul>
<li><p>자동차의 이름, 연식 : 자동차의 데이터</p>
</li>
<li><p>출력하기 위해 외부에 함수 만듦
자동차의 데이터 전달 → 이 정보를 가지고 외부의 함수에서 출력됨</p>
</li>
<li><p>즉, 자동차의 데이터 : 딕셔너리가 가지고 있음
  자동차의 데이터 처리 : 다른 함수에 할당되어 있음
  *이걸 한 번에 묶어버리자! * →  ‘객체’</p>
</li>
</ul>
</li>
<li><p>객체란?</p>
<ul>
<li>자동차<ul>
<li>자동차의 요소 : 엔진, 타이어, 등등 + 전진/후진/ 등등 처리하는 기능들</li>
<li>누군가 자동차를 외부에서 밀지 않음 → 전부 자동차 객체에 담겨 있는 것</li>
</ul>
</li>
<li>비행기<ul>
<li>누군가 날리는 게 아님</li>
<li>스스로 나는 것 ← 스스로 날 수 있는 기능 내장</li>
</ul>
</li>
<li>학생<ul>
<li>학생 객체 = 데이터 + 데이터에 할당된 기능</li>
<li>but <strong>반드시</strong> 학생과 관련된 것만 담아야 함</li>
<li>이렇게 만들면 학생 객체만 가져오면 그 안에 있는 데이터와 기능을 다 가져올 수 있음</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="객체">객체</h3>
<ul>
<li><p>어떤 개체들을 구성하는 데이터 → 변수</p>
</li>
<li><p>데이터에 있는 값들을 처리하는 기능 → 함수(메서드)</p>
</li>
<li><p>객체는 객체와 관련 있는 데이터(데이터를 담는 <strong>변수)</strong></p>
<p>  +거기에 담겨있는 변수를 처리하는 기능, 함수(<strong>메서드)</strong>로 구성</p>
</li>
<li><p>객체를 생성하기 위한 설계도 존재 → Class</p>
</li>
</ul>
<h3 id="클래스">클래스</h3>
<p>개발자는 class 설계</p>
<p>이거 가지고 객체 만들어줘 요청하면 class 개수만큼의 객체 생성</p>
<p>학생 100개 만들어줘 100번 요청한다면 → 객체 100개</p>
<ul>
<li>변수 : 각 객체마다 만들어짐</li>
<li>메서드 : 하나만</li>
<li>class : 메모리에 올라감</li>
</ul>
<p>객체를 아무리 많이 만들어도 변수만 만들어지기 때문에 메모리를 많이 먹지 않음</p>
<ul>
<li>학생 객체는 각각 독립적
학생 A의 ‘이름’에 김이 들어갔다고 모든 학생의 이름이 김인 건 아님</li>
</ul>
<br>

<ul>
<li>사람들이 객체 지향에서 가장 어려워하는 것<ul>
<li>뭘 작성해 줘야 하지 → 설계 어려워함</li>
</ul>
</li>
<li>프로그램 상에서 필요한 기능들 정리하기</li>
<li>각 처리를 위해 필요한 기능 정리</li>
<li>관련 있는 것들 묶기 → 이게 바로 객체 지향</li>
<li>다른 곳에서 쓴다면 밖으로 빼기</li>
</ul>
<hr>
<h2 id="클래스-1">클래스</h2>
<p><del>시작이다</del></p>
<ul>
<li>객체를 생성하기 위한 설계도</li>
</ul>
<pre><code class="language-python">class TestClass1 :
    pass</code></pre>
<ul>
<li>객체 생성</li>
</ul>
<pre><code class="language-python"># 객체를 생성한다.
t1 = TestClass1()
t2 = TestClass1()
print(t1)
print(t2)</code></pre>
<p>&lt;<strong>main</strong>.TestClass1 object at 0x0000016871104EC0&gt;
&lt;<strong>main</strong>.TestClass1 object at 0x0000016871104680&gt;</p>
<ul>
<li>TestClass1 object : TestClass1의 객체이다.</li>
<li>뒤 주소값이 다름 → <strong>t1, t2는 다른 객체</strong></li>
</ul>
<pre><code class="language-python"># 비교
t3 = t2
print(t2)
print(t3)</code></pre>
<p>&lt;<strong>main</strong>.TestClass1 object at 0x0000016871104680&gt;
&lt;<strong>main</strong>.TestClass1 object at 0x0000016871104680&gt;</p>
<p>→ t2, t3는 <strong>같은 객체</strong>
<br></p>
<ul>
<li>객체에 변수 추가</li>
</ul>
<pre><code class="language-python"># 파이썬은 생성한 객체에 변수를 추가하는 것이 가능하다.
t1.a1 = 100
print(t1.a1)</code></pre>
<p><code>100</code> </p>
<ul>
<li>객체의 독립성</li>
</ul>
<pre><code class="language-python"># 객체에 변수를 추가한다고 하더라도 같은 클래스를 가지고 만든 다른 객체에는 추가되지 않는다.
# 객체는 독립적이기 때문이다.
print(t2.a1)

# 에러!</code></pre>
<h3 id="객체의-멤버">객체의 멤버</h3>
<ul>
<li>멤버 : 클래스나 객체 안에 들어 있는 것들</li>
<li>멤버 변수 : 객체가 가지고 있는 데이터</li>
<li>멤버 메서드 : 객체가 할 수 있는 동작(함수)</li>
</ul>
<pre><code class="language-python">~~# 파이썬은 클래스를 통해 생성되는 객체의 멤버 변수를 정의할 수 없다. 헷갈려서 수정~~
# 파이썬은 클래스 정의 부분에 멤버 변수를 미리 선언하지 않는다.
# 클래스를 통해 객체를 생성하면 아무것도 가지고 있지 않는 텅 비어있는 객체가 생성된다.

# 이 객체에 변수를 추가해 줘야 한다.

class TestClass2 :
    # 생성자
    # self : 생성된 객체의 정보가 담기고 이를 통해 객체에 접근할 수 있다.
    def __init__(self) :
        print(&#39;init&#39;)
        print(f&#39;self : {self}&#39;)
        # 객체가 가지고 있어야 할 변수를 여기에서 추가해준다.
        self.a1 = 100
        self.a2 = 200</code></pre>
<h3 id="생성자">생성자</h3>
<ul>
<li><p>클래스를 통해 객체를 생성할 때 자동으로 호출되는 함수(메서드)</p>
</li>
<li><p>파이썬에서는 클래스를 통해 객체를 생성할 경우 텅 비어있는 객체를 생성하고 생성자를 호출한다.</p>
</li>
<li><p>여기에서 객체에 변수를 추가하는 작업을 하면 클래스를 통해 만들어지는 모든 객체는 동일한 이름의 변수들을 가진 상태에서 사용할 수 있다.</p>
</li>
<li><p>t1과 self의 주소값 같음</p>
</li>
</ul>
<pre><code class="language-python">t1 = TestClass2() # 객체 생성 : 텅 빈 객체 생성 # -&gt; 무조건 자동으로 __init__ 호출
# 객체의 주소값이 매개변수인 self 로 들어옴
print(f&#39;t1 : {t1}&#39;) </code></pre>
<pre><code>init
self : &lt;__main__.TestClass2 object at 0x00000168713D40B0&gt; 
t1 : &lt;__main__.TestClass2 object at 0x00000168713D40B0&gt;</code></pre><ul>
<li>주소값, 객체에서 변수 호출해보기</li>
</ul>
<pre><code class="language-python">t1 = TestClass2()
print(f&#39;t1 : {t1}&#39;)
# 객체가 가지고 있는 변수에 접근한다.
print(f&#39;t1.a1 : {t1.a1}&#39;)
print(f&#39;t1.a2 : {t1.a2}&#39;)</code></pre>
<pre><code>init
self : &lt;__main__.TestClass2 object at 0x00000168711048C0&gt;
t1 : &lt;__main__.TestClass2 object at 0x00000168711048C0&gt;
t1.a1 : 100
t1.a2 : 200</code></pre><pre><code class="language-python">t2 = TestClass2()
print(f&#39;t2 : {t2}&#39;)
print(f&#39;t2.a1 : {t2.a1}&#39;)
print(f&#39;t2.a2 : {t2.a2}&#39;)</code></pre>
<pre><code>init
self : &lt;__main__.TestClass2 object at 0x00000168713D4AD0&gt;
t2 : &lt;__main__.TestClass2 object at 0x00000168713D4AD0&gt;
t2.a1 : 100
t2.a2 : 200</code></pre><p>t1 실행시 self와 t1의 주소값, t2 실행시 self와 t2의 주소값 각각 같음</p>
<p>그러나 t1과 t2의 self의 주소값은 서로 다름 (독립적)</p>
<br>
<span style="color: green">

<ul>
<li>나름대로 이해를 위한 몸부림</li>
</ul>
<p>파이썬은 클래스 정의시 멤버 변수를 필수로 선언하지 않기 때문에,</p>
<p><code>__init__</code>이 없는 경우 클래스를 통해 객체를 생성하면 아무 멤버도 없는 텅 빈 객체가 생성됨</p>
<pre><code class="language-python"># (학습) 텅 빈 객체 만들어짐
class TestClass5:
    pass

t = TestClass5()
print(t.__dict__)  #객체 t가 가진 멤버 변수들을 딕셔너리 형태로 보여줘.</code></pre>
<p><code>{}</code>
    따라서 생성자를 이용해 객체가 생성될 때 객체 내부에 변수를 추가하는 작업을 함</p>
<pre><code class="language-python">class TestClass2 :
    def __init__(self) :
        print(&#39;init&#39;)
        print(f&#39;self : {self}&#39;)
        self.a1 = 100
        self.a2 = 200</code></pre>
<br>

<p>이러한 class가 있으면 객체 생성시 a1, a2라는 멤버 변수를 가진 상태로 생성됨</p>
<p>(’a1’ : 100, ‘a2’ : 200)</p>
<pre><code class="language-python">t1 = TestClass2()
print(f&#39;t1 : {t1}&#39;) </code></pre>
<p>실행하면 파이썬이 TestClass2()를 호출하면서 <strong>init</strong>(self) 함수도 자동으로 호출</p>
<p>생성된 객체의 주소값을 self 자리에 넣음 (<strong>init</strong>(t1)이 실행되는 것. 일종의 t1 = self 가 됨)</p>
<p>만약 새 객체 t2를 생성한다면, t2의 주소값과 그때 <code>print(f&#39;self : {self}&#39;)</code>되는 self의 주소값도 같을 것</p>
</span>

<p><del>색깔 넣었다!!! 어휴 내가 파이썬하니 HTML하니</del></p>
<br>
- 객체는 서로 독립적

<pre><code class="language-python"># 같은 클래스로 생성한 객체라고 하더라도 서로 독립적이므로
# 변수의 값이 항상 같지는 않다.
t1.a1 = 1000
print(f&#39;t1.a1 : {t1.a1}&#39;)
print(f&#39;t2.a1 : {t2.a1}&#39;)</code></pre>
<p>→ <em>t1.a1 : 1000
t2.a1 : 100</em></p>
<br>

<ul>
<li>매개변수를 가진 생성자</li>
</ul>
<pre><code class="language-python"># 생성자도 함수의 일종이므로 매개변수를 가질 수 있다.
# 단, 첫 번째 매개변수에는 생성된 객체의 주소 값으로 결정되기 때문에
# 두 번째 매개변수부터 값을 결정해 주면 된다. (기본값도 설정할 수 있다.)
class TestClass3 :
    # 생성자
    def __init__(self, v1, v2, v3 = 3) :
        self.a1 = v1
        self.a2 = v2
        self.a3 = v3</code></pre>
<ul>
<li><strong>첫 번째 매개변수 → 무조건 객체의 주소값(self)이 들어옴</strong></li>
</ul>
<pre><code class="language-python">t1 = TestClass3(10, 20, 30)
print(t1.a1, t1.a2, t1.a3)

t2 = TestClass3(10, 20)
print(t2.a1, t2.a2, t2.a3)</code></pre>
<p>→ <em>10 20 30
10 20 3</em></p>
<h3 id="메서드">메서드</h3>
<ul>
<li>객체를 통해 호출하는 함수들</li>
</ul>
<pre><code class="language-python"># 객체를 통해 호출하기 때문에 첫 번째 매개변수에는 객체의 주소값이 들어온다.
# 이를 통해 객체에 접근하여 객체가 가지고 있는 변수를 사용할 수 있다.
class TestClass4 :
    # 생성자
    def __init__(self, a1, a2) :
        self.v1 = a1
        self.v2 = a2

    # 메서드
    # 객체를 통해서 메서드를 호출하면 첫 번째 매개변수에 메서드를 호출하기 위해
    # 사용한 객체의 주소값이 들어온다.
    # 이를 통해 객체에 접근하여 객체의 변수를 사용할 수 있다.
    def test_method(self) :
        print(self.v1)
        print(self.v2)</code></pre>
<pre><code class="language-python">t1 = TestClass4(10, 20)
t1.test_method()

t2 = TestClass4(100, 200)
t2.test_method()</code></pre>
<p>→ <em>10
20
100
200</em></p>
<span style="color: green">

<ul>
<li><p>헷갈려서 또 정리</p>
<pre><code class="language-python">  class TestClass4 :
      def __init__(self, a1, a2) :
          self.v1 = a1
          self.v2 = a2</code></pre>
<p>  위와 같은 클래스 호출할 때</p>
<pre><code class="language-python">  t1 = TestClass4(10, 20)</code></pre>
<p>  클래스 호출 → <code>__init__</code>이라는 <strong>생성자</strong>를 호출</p>
<p>  self : 이 객체 자신 ( t1 )</p>
<pre><code class="language-python">  TestClass4.__init__(t1, 10, 20)</code></pre>
<p>  그래서 마치 이렇게 t1이라는 객체가 자동으로 self 자리에 들어가고 10, 20이 a1, a2로 들어가는 것처럼 동작</p>
</li>
</ul>
</span>


<h1 id="상속">상속</h1>
<p>각각의 특성을 알아보면</p>
<ul>
<li>강아지<ul>
<li>다리가 4개</li>
<li>꼬리 1개</li>
<li>멍멍 짖는다</li>
<li>사고친다</li>
<li>먹은 사료 개수</li>
</ul>
</li>
<li>구미호<ul>
<li>다리가 4개</li>
<li>꼬리 9개</li>
<li>변신한다</li>
<li>사고친다</li>
<li>먹은 간 개수</li>
</ul>
</li>
<li>class 마다 동일한 기능 있음</li>
</ul>
<p>→ 동물 class 새로 생성</p>
<ul>
<li>동물<ul>
<li>다리 개수</li>
<li>꼬리 개수</li>
<li>사고친다</li>
</ul>
</li>
<li>그 후 강아지, 구미호 → 동물 상속<br>

</li>
</ul>
<h3 id="상속-1">상속</h3>
<ul>
<li><p>클래스가 다른 클래스가 가진 것들을 물려받는 개념</p>
</li>
<li><p>상속 시켜 주는 클래스 : 부모 클래스</p>
</li>
<li><p>상속 받는 클래스 : 자식 클래스</p>
</li>
<li><p>자식 클래스는 부모가 가진 것들을 마치 자기 자신한테 있는 것 처럼 사용할 수 있다.</p>
<br>
</li>
<li><p>부모 클래스</p>
</li>
</ul>
<pre><code class="language-python">class Animal :
    def __init__(self, _type) :
        self.animal_type = _type

    def eat(self) :
        print(f&#39;{self.animal_type}가 사료를 먹습니다&#39;)</code></pre>
<ul>
<li>자식 클래스</li>
</ul>
<pre><code class="language-python">class Dog(Animal) :
    def speaking(self) :
        print(&#39;멍멍&#39;)

class Cat(Animal) :
    def speaking(self) :
        print(&#39;냐옹 냐옹&#39;)</code></pre>
<p><em>Animal이 변수 자리에</em></p>
<pre><code class="language-python">t1 = Dog(&#39;강아지&#39;)
print(t1.animal_type)
t1.eat()
t1.speaking()

t2 = Cat(&#39;고양이&#39;)
t2.eat()
t2.speaking()</code></pre>
<pre><code>강아지
강아지가 사료를 먹습니다
멍멍
고양이가 사료를 먹습니다
냐옹 냐옹</code></pre><p><em>울음소리는 다르지만 먹는 것은 같으므로 애니멀 클래스(부모 클래스)에서 상속</em></p>
<ul>
<li>부모 init이 먼저 호출, 그 다음 자식 init이 호출</li>
</ul>
<hr>
<h1 id="예외처리">예외처리</h1>
<ul>
<li>오류 발생 대비하려면<ul>
<li>발생할 가능성이 높은 것들 목록화</li>
<li>실제로 그 작업이 일어나기 전에 먼저 확인하고 그 작업이 일어나지 않도록 중단시킴 → 예외</li>
</ul>
</li>
<li>오류(error) ≠ 예외 (exception)</li>
<li>예외 : 사전에 미리 확인이 가능한 오류</li>
<li>오류 : 실행을 해 봐야 아는 것들</li>
<li>PVM : 오류가 발생할 가능성이 동작할 경우 수행 중단<ul>
<li>튕기는 이유 : 주로 그 코드가 오류를 발생시킬 가능성이 있어서 virtual machine이 강제 중단 시키는 것</li>
<li>개발자는 미리 대처해 놓아서 강제 종료되지 않고 잘 작동되게 함</li>
</ul>
</li>
</ul>
<p>ex) 키보드 입력받는 것 → 문자열로 받음</p>
<ul>
<li>문자열 → 숫자로 바꾸는 과정이 있다면<ul>
<li>100 → 정상으로 바뀜</li>
<li>안녕하세요 → 오류 → 강제 종료(튕김)</li>
</ul>
</li>
</ul>
<p>대응방법</p>
<ul>
<li>사용자가 정상적으로 입력할 때까지 계속 받기</li>
</ul>
<ul>
<li>오류가 발생했거나 오류가 발생될 가능성을 만났을 때 프로그램이 강제 종료되는 것을 막고 돌아가도록 하는 것</li>
<li>다시 정상화하거나 오류 기록 후 종료할 수 있도록
(<strong>가장 중요한 건 오류가 나지 않도록 코드를 잘 만드는 것</strong>)</li>
</ul>
<p>발생되는 데이터에 대해서 문제가 있는 데이터를 동작시키기 전에 if 문으로 미리 검사
→ 문제가 있으면 return 등을 통해서 돌아가지 않도록 만들기</p>
<ul>
<li><p>오류 발생시</p>
<ul>
<li>정상화</li>
<li>오류 기록 후 종료<ul>
<li>만약 어디까지 했는지 기록하지 않으면 처음부터 해야 함<br>
</li>
</ul>
</li>
</ul>
</li>
<li><p>이런저런 오류들</p>
</li>
<li><p>test 1)</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/blue_cherry/post/31ed7597-f71d-4581-b288-36f7644c6bb4/image.png" alt=""></p>
<p>ZeroDivisionError : 파이썬에서 만들어 목록화해놓은 일종의 “Class”</p>
<br>
- test 2)

<pre><code class="language-python">a1 = 10 / 0
print(a1)

print(&#39;이 부분이 수행될까요?&#39;)</code></pre>
<p><img src="https://velog.velcdn.com/images/blue_cherry/post/9df5f4d6-b779-46d4-82fd-3925f29fda99/image.png" alt=""></p>
<p>→ 10 / 0 에서 중단
아래 수행은 되지 않음</p>
<ul>
<li>test 3)</li>
</ul>
<pre><code class="language-python">try:
    a1 = 10 / 0
    print(a1)
except :
    print(&#39;오류가 발생하였습니다&#39;)

print(&#39;이 부분이 수행될까요?&#39;)</code></pre>
<pre><code>오류가 발생하였습니다
이 부분이 수행될까요?</code></pre><p>잘 수행됨</p>
<br>


<h3 id="용어">용어</h3>
<ul>
<li><p>try : 개발자가 작업하고자 하는 코드를 작성하는 부분</p>
</li>
<li><p>except : try 부분에서 예외가 발생하면 try 부분의 수행을 중단하고 except 부분을 수행해 준다.</p>
<p>  여기에 정상화를 위한 코드나 오류메시지 기록 등에 관련된 작업을 해준다.</p>
</li>
<li><p>else : try 부분에서 예외가 발생하지 않고 모두 수행되었을 경우 동작하는 부분</p>
</li>
<li><p>finally : try 부분에서 예외 발생 여부와 관계없이 무조건 동작하는 부분이다.
(but finally 안 써도 코딩 가능)</p>
</li>
</ul>
<h3 id="진행-구조">진행 구조</h3>
<ul>
<li>예외가 발생하지 않았을 경우 : try 부분을 모두 수행<ul>
<li>else가 있다면 else 부분 수행</li>
<li>finally가 있다면 finally 부분을 수행</li>
</ul>
</li>
<li>예외가 발생했다면 : try 부분의 수행을 중단<ul>
<li>except 부분을 수행</li>
<li>finally 부분이 있다면 finally 부분을 수행</li>
</ul>
</li>
</ul>
<br>
- **구조 요약**
try,  except 는 필수

<ul>
<li>try<ul>
<li>try에서 아무것도 문제 없으면 else</li>
<li>try에서 오류 있으면 except</li>
<li>둘 중 한 쪽은 무조건 실행</li>
</ul>
</li>
<li>finally (없어도 됨)<br>
<br></li>
<li>구조 1)</li>
</ul>
<pre><code class="language-python">try :
    a1 = 10 + 20
    print(a1)
except :
    print(&#39;예외가 발생하였습니다&#39;)
else :
    print(&#39;예외가 발생하지 않았습니다&#39;)
finally :
    print(&#39;무조건 동작하는 부분입니다&#39;)</code></pre>
<pre><code class="language-python">30
예외가 발생하지 않았습니다
무조건 동작하는 부분입니다</code></pre>
<p>try → else → finally 동작
<br></p>
<ul>
<li>구조 2)</li>
</ul>
<pre><code class="language-python">try :
    a1 = 10 / 0
    print(a1)
except :
    print(&#39;예외가 발생하였습니다&#39;)
else :
    print(&#39;예외가 발생하지 않았습니다&#39;)
finally :
    print(&#39;무조건 동작하는 부분입니다&#39;)</code></pre>
<pre><code>예외가 발생하였습니다
무조건 동작하는 부분입니다</code></pre><p>try → except → finally 동작
<br></p>
<ul>
<li><p>오류는 하나만 발생한다.</p>
<ul>
<li>오류가 여러 개여도 첫 번째 오류 발생하면 중단</li>
<li>따라서 여러 except를 만들어서 구분</li>
<li>구분 기준 : 오류 클래스</li>
<li>오류가 발생하면 그 클래스에 대한 객체 생성됨<ul>
<li>except Exception as e: 통해서 객체 받을 수 있음</li>
</ul>
</li>
</ul>
</li>
<li><p>오류 클래스</p>
<ul>
<li>Exception<ul>
<li>모든 오류 클래스들은 Exception 상속받음</li>
</ul>
</li>
<li>ZeroDivisionError<ul>
<li>0으로 나누는 에러</li>
</ul>
</li>
<li>IndexError<ul>
<li>순서값 잘못 넣은 에러 (list len이 10인데 a1[20])</li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="모듈">모듈</h1>
<pre><code class="language-python"># 모듈
- 파이썬 코드를 작성하는 파일의 확장자는 py이다.
- 이 py 파일이 하나의 모듈이 된다.
- 파이썬 코드를 작성할 때 다른 py 파일에 작성되어 있는 것을
사용할 수 있다.</code></pre>
<h3 id="모듈-생성작동">모듈 생성/작동</h3>
<ul>
<li>모듈 새로 생성 (test_module1)</li>
</ul>
<pre><code class="language-python"># test_module1.py

print(&#39;test_module.py&#39;)
print(&#39;안녕하세요&#39;)</code></pre>
<br>

<ul>
<li>모듈 작동시켜보기</li>
</ul>
<pre><code class="language-python"># test_module1.py 파일의 코드를 &quot;실행&quot;시킨다.
# (다른 언어와 다른 부분)
import test_module1</code></pre>
<pre><code>test_module.py
안녕하세요</code></pre><br>

<ul>
<li>이미 import한 모듈을 또 import 하면 아무런 일도 하지 않는다.</li>
</ul>
<pre><code class="language-python">import test_module1</code></pre>
<p>→ 출력 아무것도 안 됨
<br></p>
<h3 id="모듈의-변수-함수-클래스-사용하기">모듈의 변수, 함수, 클래스 사용하기</h3>
<ul>
<li>변수, 함수, 클래스를 가진 모듈 생성 (test_modul2)</li>
</ul>
<pre><code class="language-python"># &lt;test_modul2.py&gt;

test2 = 100

def test2_function() :
    print(&#39;test2_function&#39;)

class TestClass2 :
    pass</code></pre>
<br>

<ul>
<li>다른 모듈에 있는 변수, 함수, 클래스 사용해 보기<ul>
<li>기본적으로는 모듈명과 같이 사용해야 함</li>
<li>어느 모듈의 것인지 명시</li>
<li>다른 모듈에 같은 이름일 경우 구분</li>
</ul>
</li>
</ul>
<pre><code class="language-python">import test_module2

print(test_module2.test2)
test_module2.test2_function()
t2 = test_module2.TestClass2()
print(t2)</code></pre>
<pre><code>100
test2_function
&lt;test_module2.TestClass2 object at 0x000001BDEC44FBF0&gt;</code></pre><h2 id="모듈명-쉽게-쓰기">모듈명 쉽게 쓰기</h2>
<ul>
<li><p>쉽게 쓰는 방법</p>
<ol>
<li><p>(그냥) 생략하기</p>
<ul>
<li><p>but 동일이름이 다른 모듈에 있을 수 있으니 주의</p>
</li>
<li><p>두 모듈에서의 이름이 같은 경우</p>
<p>  modul1의 것은 그냥 쓰고</p>
<p>  modul2의 것은 module2.TestClass2( ) 처럼 붙여 쓰기</p>
</li>
</ul>
</li>
<li><p>별칭 사용하기</p>
</li>
</ol>
</li>
</ul>
<h3 id="별칭-사용하기"><strong>별칭 사용하기</strong></h3>
<ul>
<li>test_module3 생성</li>
</ul>
<pre><code class="language-python"># &lt;test_module3.py&gt;

test3 = 300

def test3_function() :
    print(&#39;test3_function&#39;)

class TestClass3 :
    pass</code></pre>
<ul>
<li>별칭은 import module as m1 의 형식으로 사용</li>
</ul>
<pre><code class="language-python"># 별칭
# 모듈명이 너무 길다고 생각되면 별칭을 사용할 수 있다.
import test_module3 as m3
print(m3.test3)
m3.test3_function()
t3 = m3.TestClass3()
print(t3)</code></pre>
<pre><code>300
test3_function
&lt;test_module3.TestClass3 object at 0x000001BDEC55AC60&gt;</code></pre><br>

<ul>
<li>별칭을 부여해서 import 한 모듈은 모듈명으로는 사용할 수 없고 별칭으로만 사용해야 한다.</li>
</ul>
<pre><code class="language-python">print(test_module3.test3)</code></pre>
<p>→ NameError</p>
<h3 id="모듈명-생략--부분-생략"><strong>모듈명 생략 : 부분 생략</strong></h3>
<ul>
<li>test_module4 생성</li>
</ul>
<pre><code class="language-python"># &lt;test_module4.py&gt;

test4 = 400

def test4_function() :
    print(&#39;test4_function&#39;)

class TestClass4 :
    pass</code></pre>
<br>

<ul>
<li>모듈명 생략 : 사용하고 싶은 것에 대해서만 지정하기</li>
<li>from 모듈명 import 함수명,변수명,클래스명 등</li>
</ul>
<pre><code class="language-python"># 모듈명 생략 - 사용하고 싶은 것에 대해서만 지정하기
# from 모듈명 import 함수명,변수명,클래스명등
from test_module4 import test4
from test_module4 import test4_function, TestClass4

print(test4)
test4_function()
t4 = TestClass4()
print(t4)</code></pre>
<pre><code>400
test4_function
&lt;test_module4.TestClass4 object at 0x000001BDEB92AF60&gt;</code></pre><h3 id="모듈명-생략--전체-생략"><strong>모듈명 생략 : 전체 생략</strong></h3>
<ul>
<li>test_module5 생성</li>
</ul>
<pre><code class="language-python"># &lt;test_module5.py&gt;

test5 = 500

def test5_function() :
    print(&#39;test5_function&#39;)

class TestClass5 :
    pass</code></pre>
<br>

<ul>
<li>모듈명 생략 : 전체 모듈명 생략</li>
</ul>
<pre><code class="language-python"># 모듈에 있는 모든 요소들을 모듈명 생략하겠다라고 한다.

from test_module5 import *

print(test5)
test5_function()
t5 = TestClass5()
print(t5)</code></pre>
<pre><code>500
test5_function
&lt;test_module5.TestClass5 object at 0x000001BDEA31C560&gt;</code></pre><hr>
<h1 id="패키지">패키지</h1>
<ul>
<li>py 파일을 가지고 있는 디렉토리(폴더)</li>
<li>패키지 안에 있는 모듈을 사용할 때도 import  필요</li>
</ul>
<h3 id="패키지-내-모듈-import">패키지 내 모듈 import</h3>
<ul>
<li>test_module6 생성</li>
</ul>
<pre><code class="language-python"># &lt;test_module6.py&gt;

test6 = 600

def test6_function() :
    print(&#39;test6_function&#39;)

class TestClass6 :
    pass</code></pre>
<br>

<ul>
<li>패키지 내 모듈 사용시 package1.module1.xxx</li>
</ul>
<pre><code class="language-python"># 패키지 내의 모듈을 import 한다.
import package1.test_module6

# 패키지 내의 모듈이 가지고 있는 요소를 사용할 때는 패키지명.모듈명을 해야 한다.
print(package1.test_module6.test6)
package1.test_module6.test6_function()
t6 = package1.test_module6.TestClass6()
print(t6)</code></pre>
<pre><code class="language-python">600
test6_function
&lt;package1.test_module6.TestClass6 object at 0x000001F6A6AD2600&gt;</code></pre>
<h3 id="패키지명-생략-모듈명-명시">패키지명 생략, 모듈명 명시</h3>
<ul>
<li>test_module7 생성</li>
</ul>
<pre><code class="language-python"># &lt;test_module7.py&gt;

test7 = 700

def test7_function() :
    print(&#39;test7_function&#39;)

class TestClass7 :
    pass</code></pre>
<ul>
<li>패키지명 생략 → 모듈명 명시</li>
</ul>
<pre><code class="language-python"># 패키지명을 생략하고 싶다면
# 모듈명은 명시해야 한다.
from package2 import test_module7
print(test_module7.test7)
test_module7.test7_function()
t7 = test_module7.TestClass7()
print(t7)</code></pre>
<pre><code class="language-python">700
test7_function
&lt;package2.test_module7.TestClass7 object at 0x000001F6A7FF7B30&gt;</code></pre>
<br>

<h3 id="패키지명모듈명-생략">패키지명.모듈명 생략</h3>
<ul>
<li>test_module8 생성</li>
</ul>
<pre><code class="language-python"># &lt;test_module8.py&gt;

test8 = 800

def test8_function() :
    print(&#39;test8_function&#39;)

class TestClass8 :
    pass</code></pre>
<ul>
<li>package.module로 패키지명+모듈명 생략</li>
</ul>
<pre><code class="language-python"># 패키지명과 모듈명을 생략한다.
from package3.test_module8 import test8, test8_function, TestClass8

print(test8)
test8_function()
t8 = TestClass8()
print(t8)</code></pre>
<pre><code>800
test8_function
&lt;package3.test_module8.TestClass8 object at 0x000001F6A7FA79B0&gt;</code></pre><br>

<h3 id="모든-모듈의-패키지-생략-from-package-import-">모든 모듈의 패키지 생략 (from package import *)</h3>
<ul>
<li>주의<ul>
<li>패키지 내의 모든 모듈들을 패키지명을 생략하고 사용할 수 있도록 하기 위해 *를 사용하면 <code>__init__</code> .py 파일에 있는 <code>__all__</code> 변수에 담긴 리스트를 확인</li>
<li>이 리스트에 명시되어 있는 모듈들에 한해서만 패키지명을 생략하고 사용할 수 있음<ul>
<li>원래 과거의 파이썬에서는 <code>__init__</code> .py 파일이 있는 폴더만 패키지로 인식을 하였으나버전이 업데이트 되면서 py만 있으면 패키지로 인식</li>
<li>but * 를 통해 패키지명을 생락하고 싶은 모듈을 지정할 때는 <code>__init__</code> .py 파일을 만들고 <code>__all__</code>  변수에 모듈명이나 하위 패키지명을 문자열로 넣어 줘야 함<br>


</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><code>__init__</code> .py 없을 때</li>
</ul>
<pre><code class="language-python">from package4 import *

print(test_module9.test9)
print(test_module10.test10)</code></pre>
<p>→ NameError
<br></p>
<ul>
<li><p>package 내에</p>
<ul>
<li><p><code>__init__</code> .py 파일 생성</p>
<pre><code class="language-python">  # * 를 통해 패키지명을 생략하고 사용할 수 있도록 허용해주고 싶은 모듈이나 하위 패키지명을
  # 리스트에 문자열로 작성해준다.
  __all__ = [&#39;test_module9&#39;, &#39;test_module10&#39;]</code></pre>
</li>
<li><p>test_module9 생성</p>
<pre><code class="language-python">  &lt;test_module9.py&gt;

  test9 = 900

  def test9_function() :
      print(&#39;test9_function&#39;)

  class TestClass9 :
      pass</code></pre>
</li>
<li><p>test_module10 생성</p>
<pre><code class="language-python">  &lt;test_module10.py&gt;

  test10 = 1000

  def test10_function() :
      print(&#39;test10_function&#39;)

  class TestClass10 :
      pass</code></pre>
</li>
</ul>
</li>
<li><p>실행시키면 잘 작동한다.</p>
</li>
</ul>
<pre><code class="language-python">from package4 import *

print(test_module9.test9)
print(test_module10.test10)</code></pre>
<pre><code>900
1000</code></pre><hr>
<p>진짜 끝</p>
<p> 노션에서는 토글로 접어서 내보냈는데 다 들어갔네...
 오래 전부터 필기에서 초록색으로 내 생각, 모르겠는 부분, 사족 적는 데 쓰는데
 객체지향 부분 노션 페이지는 진짜 한 20~30%가 초록색ㅋㅋㅋ
 이제 이해될 거 같긴 한데 또 실전 만나면 모르겠네</p>
<p> 일단은 GPT가 많이 발전해서 다행이라는 생각만 드는 중</p>
<p> 와 5시! 디코에 아무도 없음 <del>당연하지</del>
 노는 시간이 길어서 늦어졌지만 어쨌든 마무리</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[멋쟁이사자처럼 데이터분석] 시간, 함수]]></title>
            <link>https://velog.io/@blue_cherry/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D-%EC%8B%9C%EA%B0%84-%ED%95%A8%EC%88%98-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5</link>
            <guid>https://velog.io/@blue_cherry/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D-%EC%8B%9C%EA%B0%84-%ED%95%A8%EC%88%98-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5</guid>
            <pubDate>Mon, 07 Apr 2025 16:06:30 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Notion에서 정리한 내용을 공유용으로 옮긴 내용입니다.
양식과 구성의 어색함이 있을 수 있습니다.</p>
</blockquote>
<p><em>04/07(월) 학습내용을 바탕으로 업로드하였음</em></p>
<p>오늘 진짜 거의 마지막이라고 미친 듯이 어려운 거 몰아친 느낌
따라가기도 벅차서 거의 기권함
변명을 해보자면 어제 공부하다가 4시 반에 자서 6시 반에 일어났다...</p>
<hr>
<h1 id="시간">시간</h1>
<h3 id="유닉스-타임">유닉스 타임</h3>
<ul>
<li><p>C 언어 : OS 개발을 위해 → 유닉스 → 리눅스(라이트 유닉스)</p>
</li>
<li><p>UTC : 1970-01-01-00:00:00:0ms</p>
</li>
<li><p>당시 메모리 용량 비쌈</p>
<ul>
<li>어떻게 하면 최소의 용량으로 데이터를 관리할 수 있을까?<ul>
<li>7개의 데이터를 저장하려면 4(정수) * 7 = 28byte 필요</li>
</ul>
</li>
</ul>
</li>
<li><p>유닉스 타임 개발 :  UTC 기준 1970년 1월 1일 자정(0시 0분 0초)에서부터 현재까지 몇 초가 지났는지를 정수 형태로 표시</p>
<ul>
<li>8 byte 기준 서기 42만 년의 데이터 관리 가능</li>
<li>현재는 ms 보다 더 작은 단위 필요 : ns 단위나 더 적은 단위 지원<br></li>
</ul>
</li>
<li><p>time.time</p>
<ul>
<li>유닉스 타임</li>
<li>1970년 1월 1일 0시 0분 0초 0ms(세계 표준시 기준, 대한민국은 9시간을 더한다)을 0으로 정하고 1ms 마다 증가시키거나 감소시킨 값</li>
<li>컴퓨터 입장에서의 시간 값</li>
<li>a1 = time.time()</li>
<li><strong>서로 중복되지 않는 유일한 값이 필요 → 현재 시간 사용</strong></li>
</ul>
</li>
<li><p>time.localtime</p>
<ul>
<li>사람 입장에서의 시간 값</li>
<li>현재 컴퓨터에 설정되어 있는 지역 기준</li>
</ul>
</li>
</ul>
<pre><code class="language-python">a2 = time.localtime()

print(f&#39;타임 존 : {a2.tm_zone}&#39;)
print(f&#39;년 : {a2.tm_year}&#39;)
print(f&#39;월 : {a2.tm_mon}&#39;)
print(f&#39;현재 월에서 몇 번째 일인지 : {a2.tm_mday}&#39;)
print(f&#39;시 : {a2.tm_hour}&#39;)
print(f&#39;분 : {a2.tm_min}&#39;)
print(f&#39;초 : {a2.tm_sec}&#39;)
print(f&#39;이번 주에서 몇 번째 일인지 : {a2.tm_wday}&#39;)
print(f&#39;올해에서 몇 번째 일인지 : {a2.tm_yday}&#39;)</code></pre>
<pre><code>타임 존 : 대한민국 표준시
년 : 2025
월 : 4
현재 월에서 몇 번째 일인지 : 7
시 : 9
분 : 41
초 : 27
이번 주에서 몇 번째 일인지 : 0   # 월요일
올해에서 몇 번째 일인지 : 97</code></pre><p><del>시간 진짜 오지게 빠르다</del></p>
<ul>
<li><p>sleep</p>
<ul>
<li>주어진 시간동안 쉰다. 단위는 초 단위</li>
<li>0.1초를 쉬고 싶다면 sleep(0.1)</li>
</ul>
</li>
<li><p>시간 문자열로 만들기</p>
<ul>
<li><a href="https://docs.python.org/ko/3.13/library/time.html#time.strftime">https://docs.python.org/ko/3.13/library/time.html#time.strftime</a></li>
<li>파이썬은 1월부터 시작 (보통 0월부터 시작)</li>
</ul>
</li>
</ul>
<p>a1 = time.localtime()
a2 = time.strftime(&quot;%Y년 %m월 %d일 %H시 %M분 %S초&quot;, a1)
→ <code>2025년 04월 07일 10시 13분 02초</code></p>
<ul>
<li>수행 시간 측정 방법</li>
</ul>
<pre><code class="language-python"># 코드 실행 시작 시간
start_time = time.perf_counter()

for v1 in range(5) :
    time.sleep(1)

# 코드 실행 종료 시간
end_time = time.perf_counter()

print(f&#39;시작 시간 : {start_time}&#39;)
print(f&#39;종료 시간 : {end_time}&#39;)
print(f&#39;총 수행 시간 : {end_time - start_time}&#39;)</code></pre>
<pre><code>시작 시간 : 5228.2431957
종료 시간 : 5233.2443848
총 수행 시간 : 5.001189100000374</code></pre><hr>
<h1 id="함수">함수</h1>
<ul>
<li>코드를 미리 만들어 놓고 필요할 때마다 수행할 수 있도록 만든 코드 블럭</li>
<li>재사용이 쉬움</li>
</ul>
<h3 id="return">return</h3>
<ul>
<li><del>되돌아간다</del> → 파이썬은 끝까지 수행되거나 값이 없으면 ‘<strong>None</strong>’ 전달</li>
<li>되돌아가면서 값을 전달한다<br></li>
<li>함수 수행 원리<ul>
<li>함수를 쓸 거야 = ‘호출한다(Call)’</li>
<li>끝까지 수행되면 알아서 되돌아감</li>
<li>but 유효성 검사시 문제가 있다면 return 이용해 호출</li>
<li>return 만나면 호출한 쪽으로 되돌아감</li>
</ul>
</li>
<li>개발에서 함수 사용 방법<ul>
<li>중복된 코드는 없는 게 좋음</li>
<li>따라서 필요한 기능 미리 함수로 만들어 놓음</li>
<li>코드 한 줄이거나 한 번만 사용하더라도 함수로 만들어 놓음</li>
<li>그 후 함수 호출해서 사용 : 수정시 찾기 쉬움</li>
</ul>
</li>
</ul>
<h3 id="함수-1">함수</h3>
<ul>
<li>코드를 관리하는 요소</li>
<li>개발자가 만든 코드를 수행하다가 함수 내부의 코드가 필요할 경우 코드의 흐름을 함수 쪽으로 이동하여 수행하고 끝나면 다시 돌아오는 개념</li>
<li>중복된 코드를 작성하지 않을 수 있어서 코드의 재사용이 좋아지고 생산성이 좋아지며 유지·보수가 용이해진다.</li>
<li>함수 내부의 코드를 동작시키기 위해 &quot;함수를 사용하겠습니다&quot;라고 하는 것을 &quot;함수를 호출한다&quot;라고 부른다.
<br><br></li>
<li>함수를 호출하기 전에 반드시 함수를 작성한 부분이 실행되어야만 한다.
<code>test1()</code>
→ <em>오류</em><br></li>
<li>함수 정의<pre><code class="language-python"># 코드가 수행되다가 함수를 만나게 되면 함수의 존재만 파악하고
# 함수 내부의 코드는 수행되지 않는다.
</code></pre>
</li>
</ul>
<p>def test1() :
    print(&#39;test1 함수&#39;)
    print(&#39;안녕하세요&#39;)</p>
<pre><code>
- 함수 호출
    `test1()`
    → *test1 함수
        안녕하세요*

- 파이썬에서 함수의 이름 = 함수를 가지고 있는 변수
    `print(test1)`
    → *&lt;function test1 at 0x000001BA25446DE0&gt;*

    - 함수 뒤에 괄호가 들어가면 호출 : test1( )
    - 그냥 함수만 쓰여 있으면 ‘test1’이라는 변수

- **다른 변수에 담아 함수를 호출할 수 있다.**
    `test2 = test1
    test2()`
    → *test1 함수
        안녕하세요*

    - 굉장히 좋은 기능
    - but 조심해서 사용해야 함
- **주의**

```python
# 함수의 이름은 변수이므로 다른 것을 넣을 수 있다.
# 단, 다시는 그 이름으로 함수를 호출할 수 없다.
test1 = 100
test1()</code></pre><p>→ <strong>TypeError</strong>: <em>&#39;int&#39; object is not callable</em></p>
<p>(그냥 ‘100’이 되어 버려서 함수가 아니게 됨)</p>
<ul>
<li>실수로 어느 함수에 새로운 값을 집어넣어 버리면 그 함수는 동작하지 않음</li>
<li>list 같은 내장 함수도 마찬가지</li>
<li><strong>변수 이름 조심히 정하기!!!</strong><ul>
<li>애매하다 싶으면 숫자 붙이기<br>

</li>
</ul>
</li>
</ul>
<h3 id="매개변수-parameter-파라미터">매개변수 (parameter, 파라미터)</h3>
<ul>
<li>함수를 호출할 때 함수에게 값들을 전달할 수 있다.</li>
</ul>
<pre><code class="language-python">def test3(a1, a2, a3) :
    print(a1)
    print(a2)
    print(a3)</code></pre>
<ul>
<li>파이썬은 함수를 호출할 때 함수에 정의되어 있는 모든 매개변수에 들어갈 값을 <strong>결정</strong>해 줘야 한다 → <strong>개수 맞춰야 함</strong></li>
<li>함수를 호출할 때 전달하는 값은 매개변수에 담겨져 매개변수에 저장할 값으로 결정된다.</li>
<li>작성해 준 값은 함수의 매개변수에 1:1 대응하여 하나씩 담기게 된다.</li>
</ul>
<pre><code class="language-python">test3(10, 20, 30)
test3(100, 200, 300)</code></pre>
<pre><code>10
20
30
100
200
300</code></pre><ul>
<li>함수에 정의되어 있는 매개변수의 개수보다 부족하게 값을 전달하면 값이 결정되지 않는 매개변수가 있기 때문에 오류가 발생한다.
  <code>test3(10, 20)</code><pre><code>  → 오류 발생</code></pre></li>
</ul>
<ul>
<li>매개변수보다 더 많이 전달하면 오류가 발생한다.
<code>test3(10, 20, 30, 40)</code>
 → 오류 발생</li>
</ul>
<br>
※ 오류 메시지가 발생

<ul>
<li><p>의미 파악해서 해결하려 노력!</p>
</li>
<li><p>모르면 GPT</p>
<br>
</li>
<li><p>함수를 호출할 때 값만 작성하면 순서대로 1:1 매칭하여 값을 저장한다.</p>
</li>
<li><p>어떠한 매개변수에 값을 담을지 정해줄 수도 있다. (순서 무관)</p>
<pre><code class="language-python">test3(a2 = 30, a3 = 30, a1 = 10)</code></pre>
</li>
<li><p>만약 어느 변수에 담길 것임을 지정하지 않은 값이 있다면 변수의 이름을 지정하지 않은 값은 무조건 앞쪽에 몰려 있어야 한다.</p>
</li>
</ul>
<pre><code class="language-python">test3(10, a3=30, a2=20) # 오류 발생 X
test3(a3=30, 20, a1=10) # 오류 발생 O</code></pre>
<ul>
<li>저장될 값은 한 변수당 하나씩만 가능하다.</li>
</ul>
<pre><code class="language-python"># a2에 저장될 값을 두 개를 지정하였으므로 오류 발생한다.
test3(10, a2=20, a2=30, a3=30)</code></pre>
<h3 id="기본값을-가지고-있는-매개변수">기본값을 가지고 있는 매개변수</h3>
<ul>
<li>기본값을 가지고 있는 매개변수에 저장될 값을 결정해주지 않으면 기본값으로 결정된다.</li>
</ul>
<pre><code class="language-python">def test4(a1, a2 = 2, a3 = 3) :
    print(a1)
    print(a2)
    print(a3)

# a1은 기본값이 설정되어 있지 않기 때문에
# 함수를 호출할 때 반드시 값을 전달해야 하고
# a2와 a3은 기본값이 설정되어 있기 때문에
# 함수를 호출할 때 값을 전달하지 않으면 기본값으로 결정된다.</code></pre>
<ul>
<li>함수를 호출할 때 값을 전달하면 기본값이 아닌 전달한 값으로 결정되고 기본값이 있는 매개변수에 값을 전달하지 않으면 기본값으로 결정된다.</li>
</ul>
<pre><code class="language-python">test4(10, 20, 30)
test4(10, 20)
test4(10)
test4(10, a3=30)</code></pre>
<pre><code>10
20
30

10
20
3
# 앞에서 2개는 순서대로 전달, 전달되지 않은 a3은 기본값인 3

10
2
3
# a1은 전달, 전달되지 않은 a2, a3는 기본값인 a2 =2, a3 = 3

10
2
30
# 순서대로 a1에 10 전달, a3 = 30으로 지정되었으니 a2는 기본값인 2</code></pre><hr>
<h2 id="반환-값">반환 값</h2>
<ul>
<li>파이썬은 반환 값을 명시하지 않을 경우 None을 반환한다.</li>
</ul>
<pre><code class="language-python">def test5() :
    print(&#39;test5 함수 호출&#39;)</code></pre>
<pre><code class="language-python">a1 = test5()
# print(&#39;test5 함수 호출&#39;)까지 작동하고 None이 a1에 들어감
# 따라서 반환 값 따로 출력 안 됨
print(a1) # None 출력</code></pre>
<p>→ <em>test5 함수 호출
None</em></p>
<ul>
<li>return 다음에 값을 적어주면 값 하나를 반환할 수 있다.</li>
</ul>
<pre><code class="language-python">def test6(a1, a2) :
    r1 = a1 + a2
    return r1 # r1 : 반환 값</code></pre>
<ul>
<li>함수를 호출하여 함수가 반환하는 값을 받는다.</li>
</ul>
<pre><code class="language-python">t1 = test6(10, 20) 
print(t1)

t2 = test6(100, 200)
print(t2)

# test6 함수 위치로 올라가서 진행
# r1 = 100 + 200 = 300
# return 만나 r1 반환되어 t2 = r1 = 300
# print(t2) 하면 300 출력</code></pre>
<p>→ <em>30</em>
<em>300</em>
<br></p>
<ul>
<li>return 키워드는 함수의 수행을 중단하고 함수를 호출하는 쪽으로 돌아간다라는 의미</li>
<li>함수의 수행을 더 이상 하고 싶지 않을 때 많이 사용</li>
<li><strong>유효성 검사</strong> : 정상적으로 동작해야 하는 조건이 있다면 그 조건에 위배될 시 중단</li>
</ul>
<pre><code class="language-python">def test7(a1) :
    if a1 % 2 == 0 :
        # 함수 수행 중단
        return

    print(f&#39;test7 : {a1}&#39;)</code></pre>
<pre><code class="language-python">test7(3)
test7(4)</code></pre>
<p>→ <em>test7 : 3</em></p>
<p>(3 인 경우 if 가 거짓이기 때문에 if 아래는 출력되지 않고, 바로 print(a1) 으로 →  a1 = 3 출력</p>
<p>4인 경우 if가 참이기 때문에 return → return 뒤 반환 값이 없으므로 a1 = none. 뒤 print 건너뛰고 함수 끝남 → 출력 X)
<br></p>
<ul>
<li>함수는 무조건 값 하나만 반환됨<ul>
<li>여러 값이 반환되는 것이 아닌 ‘튜플 하나’를 반환하는 것</li>
</ul>
</li>
</ul>
<pre><code class="language-python">def test8(a1, a2) :
    r1 = a1 + a2
    r2 = a1 - a2
    r3 = a1 * a2
    r4 = a1 // a2
    # 아래의 반환은 동시에 여러개의 값을 반환하는 것이 아닌
    # 튜플로 생성하여 튜플 하나를 반환하는 것이다.
    return r1, r2, r3, r4</code></pre>
<p>확인해 보면</p>
<pre><code class="language-python">t1 = test8(10, 3)
print(t1)
print(type(t1))</code></pre>
<p>→* (13, 7, 30, 3)
    &lt;class &#39;tuple&#39;&gt;*</p>
<ul>
<li>원리는 이러하고 할 때는 그냥 값 여러 개를 반환하는 것처럼 사용하면 됨</li>
<li>주로 아래처럼 많이 사용</li>
</ul>
<pre><code class="language-python">t1, t2, t3, t4 = test8(10, 3)
print(t1, t2, t3, t4)</code></pre>
<p>→* 13 7 30 3*</p>
<h2 id="가변형-매개변수">가변형 매개변수</h2>
<pre><code class="language-python">def test1 = (a1, a2) :
    t1 = a1 + a2
    print(t1)

def test2 = (a1, a2, a3) :
    t2 = a1 + a2 + a3
    print(t2)

def test3 = (a1, a2, a3, a4) :
    t2 = a1 + a2 + a3 + a4
    print(t2)

# 무한히 반복할 수 없으므로 편한 방법을 찾음</code></pre>
<ul>
<li>가변형 매개변수<ul>
<li>매개변수 하나로 다수의 값을 받을 수 있다라는 개념</li>
</ul>
</li>
</ul>
<h3 id="args-→-tuple">*args → tuple</h3>
<ul>
<li>함수를 호출할 때 전달해주는 값들을 모아 <strong>튜플</strong>로 만들어 변수에 담아 준다.</li>
</ul>
<pre><code class="language-python">def test9(*a1) :
    return sum(a1)</code></pre>
<pre><code class="language-python">t1 = test9(10, 20, 30)
t2 = test9(10, 20, 30, 40, 50)
t3 = test9(10, 20, 30, 40, 50, 60, 70, 80)

print(t1)
print(t2)
print(t3)</code></pre>
<p>→ <em>60
    150
    360</em></p>
<h3 id="kargs">**kargs</h3>
<ul>
<li>전달되는 값들을 모아 <strong>딕셔너리</strong>로 만들어서 변수에 담아준다.</li>
<li>이때 함수를 호출하는 쪽에서 사용한 이름이 딕셔너리의 이름이 된다.</li>
</ul>
<pre><code class="language-python">def test10(**a1) :
    print(a1)</code></pre>
<pre><code class="language-python">test10(k1=10, k2=20, k3=30)
test10(t1=100, t2=200, t3=300)</code></pre>
<p>→ *{&#39;k1&#39;: 10, &#39;k2&#39;: 20, &#39;k3&#39;: 30}</p>
<p>{&#39;t1&#39;: 100, &#39;t2&#39;: 200, &#39;t3&#39;: 300}*</p>
<h3 id="섞여-있는-경우">섞여 있는 경우</h3>
<ul>
<li>*와 일반 매개변수</li>
</ul>
<pre><code class="language-python"># *변수와 다른 일반적인 매개변수와 섞여 있을 경우
# 앞의 두 개는 a1, a2, 뒤의 두개는 a4, a5에 담기고 나머지는 튜플로 만들어져서
# a3에 담긴다.

def test11(a1, a2, *a3, a4, a5) :
    print(a1)
    print(a2)
    print(a3)
    print(a4)
    print(a5)</code></pre>
<p>예시)</p>
<pre><code class="language-python"># *변수 다음에 있는 매개변수로 들어갈 값은 이름을 지정해줘야 한다.
# (키워드 인자로 써야 한다.)
test11(10, 20, 30, 40, 50, 60, 70, 80, a4=90, a5=100)

# 또는 a4, a5에 기본값 정해줘도 됨</code></pre>
<pre><code>10
20
(30, 40, 50, 60, 70, 80)
90
100</code></pre><ul>
<li><p>a1 → 10 / a2 → 20에 담김</p>
</li>
<li><ul>
<li><p>뒤의 매개변수들은 이름 지정해야 함 → a4 = 90 / a5 = 100</p>
<ul>
<li><p>키워드 인자 : 함수를 호출할 때 인자의 이름을 직접 지정해서 전달하는 것 (a4 = 90, a5 = 100)</p>
<p>  ↔ 위치 인자 : 순서대로 값을 넣는 방식</p>
</li>
<li><p>키워드 인자 뒤에는 위치 인자를 쓰면 X</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>가운데는 전부 튜플로 a3에 전달됨</p>
<pre><code class="language-python">  test11(10, 20, 30, 40, 50, 60, a4 = 70, a5 = 80, 90, 100)
  # 에러</code></pre>
</li>
</ul>
<br>    
- **와 일반 매개변수

<pre><code class="language-python"># **변수 다음에는 다른 변수를 두면 안 된다.
def test12(a1, a2, **a3, a4, a5) :
    print(a1, a2, a3)

# 에러</code></pre>
<br>
- * 와 ** 섞여 있는 경우

<pre><code class="language-python"># (학습)
def test12(a1, a2, *args, a4, a5, **a3):  # OK!
    print(a1, a2, args, a4, a5, a3)</code></pre>
<pre><code class="language-python">test12(10, 20, 30, 40, 50, a4=60, a5=70, x=100, y=200)</code></pre>
<p>→ <code>10 20 (30, 40, 50) 60 70 {&#39;x&#39;: 100, &#39;y&#39;: 200}</code></p>
<hr>
<h1 id="함수-연습">함수 연습</h1>
<ul>
<li>저번 자동차 딕셔너리 문제</li>
</ul>
<blockquote>
<p>문제1)</p>
<p>자동차의 정보가 다음과 같이 구성되어 있다.</p>
<p>자동차 하나의 정보는 다음과 같다.</p>
<p>모델명, 연식, 배기량, 색상, 주행거리</p>
<p>첫 번째 자동차 : 붕붕이, 2000, 500, 노란색, 100000</p>
<p>두 번째 자동차 : 방구차, 1950, 200, 빨간색, 200000</p>
<p>세 번째 자동차 : 아스라다, 1980, 5000000, 흰색, 300000</p>
<p>출력은 다음과 같다.</p>
<p>각 자동차의 정보를 모두 출력한다.</p>
<p>총 배기량과 배기량 평균을 출력한다.</p>
<p>총 주행거리와 총 주행거리 평균을 출력한다.</p>
</blockquote>
<ul>
<li><p>설계 과정</p>
<ul>
<li><p>설계 (출력)</p>
<pre><code class="language-python">  1. 자동차의 정보를 담는다.

  2. 총 배기량과 배기량 평균을 구한다.

  3. 총 주행거리와 주행거리 평균을 구한다.

  4. 자동차의 정보를 출력한다.

  5. 총 배기량, 배기량 평균, 총 주행거리, 주행거리 평균을 출력한다.</code></pre>
<ul>
<li>항상 출력은 한 번에 모아서</li>
</ul>
</li>
</ul>
<ol>
<li><p>입력</p>
<pre><code class="language-python"> # 자동차의 정보를 담는 함수
 def setCarInfo(name, year, cc, color, length) :
     car_dict = {
         &#39;이름&#39; : name,
         &#39;연식&#39; : year,
         &#39;배기량&#39; : cc,
         &#39;색상&#39; : color,
         &#39;주행거리&#39; : length
     }
     return car_dict</code></pre>
<p> ※ 가급적이면 함수는 매개변수만 가지고 뭔가 처리되는 형태로 만들기</p>
<p> 여러 개를 수정할 일 없이 독립성 보장받도록 </p>
<pre><code class="language-python"> # 자동차의 정보를 담는다.
 car1 = setCarInfo(&#39;붕붕이&#39;, 2000, 500, &#39;노란색&#39;, 100000)
 car2 = setCarInfo(&#39;방구차&#39;, 1950, 200, &#39;빨간색&#39;, 200000)
 car3 = setCarInfo(&#39;아스라다&#39;, 1980, 5000000, &#39;흰색&#39;, 300000)</code></pre>
</li>
<li><pre><code class="language-python"> # 총 배기량과 배기량 평균을 구해 반환한다.
 def get_cc_info(*cars) :
     # 배기량 총합을 담을 변수
     total_cc = 0
     # 자동의 수 만큼 반복한다.
     for car in cars :
         # 배기량을 누적한다
         total_cc = total_cc + car[&#39;배기량&#39;]

     # 배기량 평균을 구한다.
     avg_cc = total_cc // len(cars)

     return total_cc, avg_cc</code></pre>
<pre><code class="language-python"> # 총 배기량과 배기량 평균을 구한다.
 total_cc, avg_cc = get_cc_info(car1, car2, car3)
 # print(total_cc, avg_cc) 중간출력 확인 후 지우거나 주석 처리</code></pre>
</li>
<li><pre><code class="language-python"> # 총 주행거리와 주행거리 평균을 구하는 함수
 def get_length_info(*cars) :
     # 총 주행거리를 담을 변수
     total_length = 0
     # 자동차의 수만큼 반복하면서 주행거리를 누적한다.
     for car in cars :
         total_length = total_length + car[&#39;주행거리&#39;]

     # 주행거리 평균을 구한다.
     avg_length = total_length // len(cars)

     return total_length, avg_length</code></pre>
<pre><code class="language-python"> # 총 주행거리와 주행거리 평균을 구한다.
 total_length, avg_length = get_length_info(car1, car2, car3)
 # print(total_length, avg_length) 마찬가지로 중간 확인</code></pre>
</li>
<li><pre><code class="language-python"> # 자동차의 정보를 출력한다.
 def show_car_info(*cars) :
     for car in cars :
         print(f&#39;이름 : {car[&quot;이름&quot;]}&#39;)
         print(f&#39;연식 : {car[&quot;연식&quot;]}&#39;)
         print(f&#39;배기량 : {car[&quot;배기량&quot;]}&#39;)
         print(f&#39;색상 : {car[&quot;색상&quot;]}&#39;)
         print(f&#39;주행거리 : {car[&quot;주행거리&quot;]}&#39;)
         print()</code></pre>
<pre><code class="language-python"> # 자동차의 정보를 출력한다.
 show_car_info(car1, car2, car3)</code></pre>
</li>
<li><pre><code class="language-python"> # 총 배기량, 배기량 평균, 총 주행거리, 주행거리 평균을 출력한다.
 def show_cc_length_info(total_cc, avg_cc, total_length, avg_length) :
     print(f&#39;총 배기량 : {total_cc}&#39;)
     print(f&#39;평균 배기량 : {avg_cc}&#39;)
     print(f&#39;총 주행거리 : {total_length}&#39;)
     print(f&#39;평균 주행거리 : {avg_length}&#39;)</code></pre>
<pre><code class="language-python"> # 총 배기량, 배기량 평균, 총 주행거리, 주행거리 평균을 출력한다.
 show_cc_length_info(total_cc, avg_cc, total_length, avg_length)</code></pre>
</li>
</ol>
</li>
</ul>
<ul>
<li>답안
<img src="https://velog.velcdn.com/images/blue_cherry/post/f261c239-a0b3-45d9-b604-9e433d6c65fe/image.png" alt="">
<img src="https://velog.velcdn.com/images/blue_cherry/post/92c05a7b-b168-4d35-b334-b68b5f306c8c/image.png" alt=""></li>
</ul>
<pre><code>이름 : 붕붕이
연식 : 2000
배기량 : 500
색상 : 노란색
주행거리 : 100000

이름 : 방구차
연식 : 1950
배기량 : 200
색상 : 빨간색
주행거리 : 200000

이름 : 아스라다
연식 : 1980
배기량 : 5000000
색상 : 흰색
주행거리 : 300000

총 배기량 : 5000700
평균 배기량 : 1666900
총 주행거리 : 600000</code></pre><ul>
<li>print<ul>
<li>sep=’ ‘</li>
<li>end=’/n’</li>
</ul>
</li>
<li>처음 보는 함수가 나온다 → shift + tab<ul>
<li>매개변수 구조 확인</li>
</ul>
</li>
</ul>
<p>※ 구글링 팁</p>
<ul>
<li>python ㅇㅇㅇ <strong>not working</strong> 으로 검색</li>
<li>Stack overvflow : 개발자 커뮤니티</li>
</ul>
<hr>
<p>객체 지향 정리 안 끝난 겸 한 번 잘라버리자</p>
<p>진짜 함수 파트랑 클래스 파트는...어떻게 할 수가 없다.
일단 이해에 최선을 다했고, 내일 일찍 일어나서 숙제 마저 해봐야겠음
일단 오늘은 2시간 잤더니 너무 피곤해...</p>
<p><del>물론 1시에 할 소리는 아니지만</del></p>
<p>아 그리고 이유는 모르겠지만 오늘 클래스 질문 많이 했더니
<img src="https://velog.velcdn.com/images/blue_cherry/post/64097d7e-a8c1-4cb8-9a45-2c2d8e606080/image.png" alt="">
GPT가 착해짐
갑자기 이모티콘을 쓰고 칭찬도 세 줄씩 하기 시작
뭐지 나 어려워서 열받은 거 들켰나?
서로 사무적이던 사이였는데 갑자기 응원하는 거 웃겼지만
오늘 큰 도움 되었으니 귀엽게 넘어가준다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[멋쟁이사자처럼 데이터분석] Dictionary, Set]]></title>
            <link>https://velog.io/@blue_cherry/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D-Dictionary-Set</link>
            <guid>https://velog.io/@blue_cherry/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D-Dictionary-Set</guid>
            <pubDate>Sun, 06 Apr 2025 12:01:09 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Notion에서 정리한 내용을 공유용으로 옮긴 내용입니다.
양식과 구성의 어색함이 있을 수 있습니다.</p>
</blockquote>
<p><em>04/04(금) 학습내용을 바탕으로, 당일이 아닌 추후 업로드하였음</em></p>
<hr>
<h1 id="딕셔너리">딕셔너리</h1>
<h3 id="자료-관리에서-리스트튜플">자료 관리에서 리스트/튜플</h3>
<ul>
<li><p>하나의 리스트/튜플 안에는 다른 타입도 넣을 수 있음</p>
<p>  [10, 11.11, True, ‘안녕하세요’] 가능</p>
</li>
<li><p>학생리스트 = [’홍길동’, 15, 100, ‘김길동’, 20, 90, ‘박길동’, 30, 80]</p>
<ul>
<li>이름, 나이, 국어 점수</li>
<li>홍길동의 값을 가져오려면 3씩 끊어서 가져온다.</li>
<li>이름 : 0부터 3씩 증가하는 순서값을 통해 가져온다.</li>
<li>나이 : 1부터 3씩 증가하는 순서값을 통해 가져온다.</li>
<li>but 수학 점수를 추가<ul>
<li>한 사람의 값 3개씩 → 4개씩으로 변경</li>
<li>이름, 나이, 등등의 코드도 전부 3씩 → 4씩 으로 전부 수정되어야 함</li>
</ul>
</li>
<li>하나가 빠지면<ul>
<li>한 사람 2개씩으로 바뀌고 전부 3씩 → 2씩</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>한 리스트/튜플에는 의미가 같은 데이터만 담을 것</strong></p>
<ul>
<li><p>0부터 1씩 증가하는 순서값 전부 마찬가지</p>
</li>
<li><p>데이터 관리에 용이해야 하며 유지, 보수 중요</p>
</li>
<li><p>[21, 39, 40, 143, 2, 40, 32, 60, 140, 5, 28, …]</p>
<p>  이면 어떤 게 키이고 어떤 게 수학 점수인지 찾기 쉽지 않음</p>
</li>
</ul>
</li>
</ul>
<h3 id="자료-관리에서-딕셔너리">자료 관리에서 딕셔너리</h3>
<ul>
<li><p>이름을 통해 데이터를 관리</p>
</li>
<li><p>어느 한 개체에 포함되어 있는 데이터를 하나의 딕셔너리에 담는다.</p>
<ul>
<li><p>학생 1명의 데이터 → 딕셔너리</p>
</li>
<li><p>전체 딕셔너리 = 학생, 을 의미하는 딕셔너리 여러 개 (의미 같음)</p>
<p>  → 이걸 리스트에 담음</p>
</li>
<li><p>첫 번째 학생의 3번째 정보를 줘, 가 아닌</p>
<p>  ‘홍길동’의 ‘수학 점수’를 줘, 라고 관리해야 편리</p>
</li>
</ul>
</li>
<li><p>리스트는 종류별로 각각 있어야 함</p>
<ul>
<li><p>중국집 데이터, 병원 데이터가 섞여서</p>
<ol>
<li>짜장면, 2. 복통, 3. 탕수육, 4. 감기 → X</li>
</ol>
</li>
<li><p>여러 리스트에서 첫 번째 것들 가져옴 → 첫 번째 사람의 딕셔너리</p>
</li>
<li><p>여러 리스트에서 두 번째 것들 → 두 번째 사람의 딕셔너리</p>
<p>→ 개발자는 리스트만 관리하면 됨</p>
</li>
</ul>
</li>
</ul>
<ul>
<li>딕셔너리는 삽입 X (중간삽입)<ul>
<li>선입선출(적인) 순서가 중요한 아이라 중간에 삽입 X</li>
<li>딕셔너리는 순서가 없다고 생각하는 게 편함. 부를 때도 이름으로 호출, 관리</li>
</ul>
</li>
</ul>
<p>※ 파이썬은 뒤에 뭔가 없을 때 <code>,</code> 을 찍어도 오류 X</p>
<h3 id="생성">생성</h3>
<pre><code class="language-python"># 딕셔너리 생성
# 비어 있는 딕셔너리가 생성된다.
# 딕셔너리는 나중에 추가할 수 있다.
d1 = dict()
print(type(d1))
print(d1)</code></pre>
<pre><code class="language-python"># 괄호를 통한 딕셔너리 생성
# 비어 있는 딕셔너리가 생성된다.
d2 = {}
print(type(d2))
print(d2)</code></pre>
<p>&lt;class &#39;dict&#39;&gt;
{}</p>
<pre><code class="language-python"># 관리하는 값을 지정하여 생성한다.
d3 = {
    &#39;v1&#39; : 100,
    &#39;v2&#39; : 11.11,
    &#39;v3&#39; : &#39;안녕하세요&#39;,
    &#39;v4&#39; : [10, 20, 30],
    &#39;v5&#39; : (10, 20, 30),
    &#39;v6&#39; : {
        &#39;a1&#39; : 100,
        &#39;a2&#39; : 200
    }
}
print(d3)</code></pre>
<p><code>{&#39;v1&#39;: 100, &#39;v2&#39;: 11.11, &#39;v3&#39;: &#39;안녕하세요&#39;, &#39;v4&#39;: [10, 20, 30], &#39;v5&#39;: (10, 20, 30), &#39;v6&#39;: {&#39;a1&#39;: 100, &#39;a2&#39;: 200}}</code></p>
<ul>
<li>생설할 때, 이름은 꼭 문자열이 아니어도 된다.</li>
</ul>
<pre><code class="language-python">d10 = {
    &#39;a1&#39; : 100,
    10 : 200,
    11.11 : 300,
    True : 400
}
print(d10[&#39;a1&#39;])
print(d10[10])
print(d10[11.11])
print(d10[True])</code></pre>
<h3 id="불러오기-가져오기">불러오기 (가져오기)</h3>
<pre><code class="language-python"># [이름] 형태로 데이터를 가져온다.
print(d3[&#39;v1&#39;])
print(d3[&#39;v2&#39;])
print(d3[&#39;v3&#39;])
print(d3[&#39;v4&#39;][0]) # &#39;v4&#39; 리스트의 순서값 0번째
print(d3[&#39;v4&#39;][1])
print(d3[&#39;v5&#39;][0])
print(d3[&#39;v5&#39;][1])
print(d3[&#39;v6&#39;][&#39;a1&#39;]) # &#39;v6&#39; 딕셔너리의 이름이 &#39;a1&#39;인 값
print(d3[&#39;v6&#39;][&#39;a2&#39;])</code></pre>
<pre><code>100
11.11
안녕하세요
10
20
10
20
100
200</code></pre><h3 id="수정추가">수정/추가</h3>
<pre><code class="language-python"># 수정
# 이름을 통해 값을 새롭게 넣어 주면 값이 수정된다.
d3[&#39;v1&#39;] = 200

# 추가
# 없는 이름으로 값을 넣어주면 추가된다.
d3[&#39;v7&#39;] = 5000</code></pre>
<pre><code>{&#39;v1&#39;: 200, &#39;v2&#39;: 11.11, &#39;v3&#39;: &#39;안녕하세요&#39;, &#39;v4&#39;: [10, 20, 30], &#39;v5&#39;: (10, 20, 30), &#39;v6&#39;: {&#39;a1&#39;: 100, &#39;a2&#39;: 200}, &#39;v7&#39;: 5000}
5000</code></pre><h3 id="삭제">삭제</h3>
<ul>
<li>pop</li>
</ul>
<pre><code class="language-python"># pop : 이름을 지정하여 이름에 해당하는 것을 전달하고 딕셔너리에서 삭제한다.
v1 = d3.pop(&#39;v1&#39;)
print(v1)
print(d3)</code></pre>
<pre><code>200
{&#39;v2&#39;: 11.11, &#39;v3&#39;: &#39;안녕하세요&#39;, &#39;v4&#39;: [10, 20, 30], &#39;v5&#39;: (10, 20, 30), &#39;v6&#39;: {&#39;a1&#39;: 100, &#39;a2&#39;: 200}, &#39;v7&#39;: 5000}</code></pre><ul>
<li><p>없는 이름 지정시 오류 발생</p>
</li>
<li><p>popitem</p>
<ul>
<li><em>순서 개념이 들어가는 요소이므로 안 쓰길 권장. 무조건 마지막 것을 알고 있다는 게 확실할 때만 사용 권장</em></li>
</ul>
</li>
</ul>
<pre><code class="language-python"># 딕셔너리는 순서가 없지만 제일 마지막에 추가된 요소를 
# 이름, 값의 쌍으로된 튜플로 반환하고 딕셔너리에서는 제거한다.
v2 = d3.popitem()
print(v2)
print(d3)</code></pre>
<pre><code>(&#39;v7&#39;, 5000)
{&#39;v2&#39;: 11.11, &#39;v3&#39;: &#39;안녕하세요&#39;, &#39;v4&#39;: [10, 20, 30], &#39;v5&#39;: (10, 20, 30), &#39;v6&#39;: {&#39;a1&#39;: 100, &#39;a2&#39;: 200}}</code></pre><ul>
<li>del</li>
</ul>
<pre><code class="language-python"># del 연산을 통해 삭제할 수 있다.
del d3[&#39;v2&#39;]
print(d3)</code></pre>
<p><code>{&#39;v3&#39;: &#39;안녕하세요&#39;, &#39;v4&#39;: [10, 20, 30], &#39;v5&#39;: (10, 20, 30), &#39;v6&#39;: {&#39;a1&#39;: 100, &#39;a2&#39;: 200}}</code></p>
<ul>
<li><p>없는 이름 지정시 오류 발생</p>
</li>
<li><p>있는지 없는지 애매할 때 “get”으로 가져오기</p>
</li>
<li><p>get</p>
</li>
</ul>
<pre><code class="language-python"># get을 통해 가져올 때 이름이 없을 경우 None 이 나온다.
v3 = d3.get(&#39;v3&#39;)
print(v3)
print(d3)

v100 = d3.get(&#39;v100&#39;)
print(v100)</code></pre>
<pre><code>안녕하세요
{&#39;v3&#39;: &#39;안녕하세요&#39;, &#39;v4&#39;: [10, 20, 30], &#39;v5&#39;: (10, 20, 30), &#39;v6&#39;: {&#39;a1&#39;: 100, &#39;a2&#39;: 200}}
None</code></pre><ul>
<li>pop처럼 제거되는 게 아니라 그대로 남아 있음</li>
</ul>
<h3 id="in">in</h3>
<ul>
<li>튜플, 리스트, 딕셔너리에서 모두 사용<ul>
<li>튜플, 리스트인 경우 주어진 값이 포함되어 있는가</li>
<li>딕셔너리인인 경우 주어진 이름으로 저장되어 있는 값이 있는가</li>
</ul>
</li>
</ul>
<pre><code class="language-python">list1 = [10, 20, 30, 40, 50]
tuple1 = 10, 20, 30, 40, 50
dict1 = {
    &#39;a1&#39; : 100,
    &#39;a2&#39; : 200,
    &#39;a3&#39; : 300
}

print(10 in list1)
print(100 in list1)
print(10 in tuple1)
print(100 in tuple1)
print(&#39;a1&#39; in dict1)
print(&#39;a100&#39; in dict1)</code></pre>
<pre><code>True
False
True
False
True
False</code></pre><p>결과는 T/F로</p>
<h3 id="딕셔너리가-가지고-있는-함수">딕셔너리가 가지고 있는 함수</h3>
<pre><code class="language-python"># 이름들을 가져온다.
name1 = dict1.keys()
# 값들을 가져온다.
value1 = dict1.values()
# (이름, 값) 형태로 되어 있는 튜플들을 가지고 있는 요소를 가져온다.
items1 = dict1.items()

print(name1)
print(value1)
print(items1)</code></pre>
<pre><code>dict_keys([&#39;a1&#39;, &#39;a2&#39;, &#39;a3&#39;])
dict_values([100, 200, 300])
dict_items([(&#39;a1&#39;, 100), (&#39;a2&#39;, 200), (&#39;a3&#39;, 300)])</code></pre><pre><code class="language-python"># for 문 사용하기
# 리스트는 값을 추출하여 변수에 담아준다
for v1 in list1 :
    print(v1)

# 튜플은 값을 추출하여 변수에 담아준다.
for v2 in tuple1 :
    print(v2)

# 딕셔너리는 이름을 추출하여 변수에 담아준다.
for v3 in dict1 :
    print(dict1[v3]) # print(v3) 하면 키 이름인 a1, a2, a3가 나옴</code></pre>
<h1 id="set">set</h1>
<ul>
<li><p>데이터를 집합으로 사용할 때 사용하는 요소</p>
</li>
<li><p><strong>중복 허용 X</strong></p>
</li>
<li><p>순서, 이름 X → 특정 데이터 지칭해서 추출하는 것 불가능</p>
</li>
<li><p>사용 용도</p>
<ul>
<li><p>집합 연산이 필요할 때</p>
</li>
<li><p>중복된 데이터를 제거할 때.</p>
<p>  단,</p>
<ul>
<li>순서가 바뀌어도 상관없을 때</li>
<li>오름차순, 내림차순이나 새로운 기준으로 어차피 다시 정렬할 때</li>
</ul>
</li>
</ul>
</li>
<li><p><code>s1 = {}</code> → 딕셔너리로 만들어짐</p>
<p>  → {10, 20, 30} 처럼 넣을 값 쉼표로 나열</p>
</li>
</ul>
<pre><code class="language-python"># set은 중복을 허용하지 않는다.
s3 = {30, 20, 30, 10, 20, 30, 30, 20, 10, 5}
print(s3)</code></pre>
<p><code>{10, 20, 5, 30}</code></p>
<pre><code class="language-python"># set은 데이터를 가져다 사용할 수 있는 방법은 다른 형태로 만들어주거나 for 문을 사용하는 것밖에는 없다.
# 이때, 순서가 어떻게 될지는 알 수 없다.
for v1 in s3 :
    print(v1)</code></pre>
<pre><code>10
20
5
30</code></pre><pre><code class="language-python"># list, tuple -&gt; set
list1 = [10, 20, 30, 10, 20, 30, 20, 10]
tuple1 = 10, 20, 30, 10, 20, 30, 20, 10

s1 = set(list1)
s2 = set(tuple1)
print(s1)
print(s2)</code></pre>
<p>{10, 20, 30}</p>
<p>{10, 20, 30}</p>
<pre><code class="language-python"># set -&gt; list, tuple
# 순서는 어떻게 될지 알 수 없다.
list2 = list(s1)
tuple2 = tuple(s1)
print(list2)
print(tuple2)</code></pre>
<p>[10, 20, 30]</p>
<p>(10, 20, 30)</p>
<hr>
<h2 id="ex">EX</h2>
<blockquote>
<p>개발할 때는
입력, 처리, 출력 부분을 나눠서 구조 잡기</p>
</blockquote>
<pre><code class="language-python"># 문제

학생 정보를 출력하는 프로그램을 만든다.

학생 정보는 다음과 같이 구성된다.

학생 한 명은 이름, 나이, 국어점수, 영어점수, 수학점수로 구성된다.

첫 번째 학생 : 홍길동, 15, 90, 91, 92
두 번째 학생 : 김길동, 18, 80, 81, 82
세 번째 학생 : 최길동, 20, 70, 71, 72

출력은 다음과 같이 한다.

모든 학생들의 정보를 모두 출력한다.

각 점수별 총점과 평균을 출력한다.
전체 총점과 평균을 출력한다.</code></pre>
<ul>
<li>구조 잡기 (입력 / 처리 / 출력)</li>
</ul>
<pre><code class="language-python">===입력===

# 각 학생의 정보를 가지고 있는 딕셔너리를 만들어준다.

# 딕셔너리를 리스트에 담는다

===처리===

# 각 점수별 총점과 평균을 구한다

# 전체 총점과 평균을 구한다.

===출력===

# 모든 학생들의 정보를 출력한다.

# 각 점수별 총점과 평균을 출력한다.

# 전체 총점과 평균을 출력한다.</code></pre>
<p><em>개인적으로 거꾸로 작업</em></p>
<ul>
<li>출력<ul>
<li>필요한 출력들</li>
</ul>
</li>
<li>처리<ul>
<li>어떻게 구현해야 할지 전략</li>
</ul>
</li>
<li>입력<ul>
<li>데이터 미리 준비되어 있다면 쓰기</li>
<li>준비된 것이 없다면 사용자에게 입력 받기</li>
</ul>
</li>
</ul>
<pre><code class="language-python"># 풀이

# 각 학생의 정보를 가지고 있는 딕셔너리를 만들어준다.
studentDict1 = {
    &#39;name&#39; : &#39;홍길동&#39;,
    &#39;age&#39; : 15,
    &#39;korean&#39; : 90,
    &#39;math&#39; : 91,
    &#39;english&#39; : 92
}

studentDict2 = {
    &#39;name&#39; : &#39;김길동&#39;,
    &#39;age&#39; : 18,
    &#39;korean&#39; : 80,
    &#39;math&#39; : 81,
    &#39;english&#39; : 82
}

studentDict3 = {
    &#39;name&#39; : &#39;최길동&#39;,
    &#39;age&#39; : 20,
    &#39;korean&#39; : 70,
    &#39;math&#39; : 71,
    &#39;english&#39; : 72
}

# 딕셔너리를 리스트에 담는다.
studentList = [studentDict1, studentDict2, studentDict3]

# 각 점수별 총점과 평균을 구한다.
koreanTotal = 0
mathTotal = 0
englishTotal = 0

for d1 in studentList :
    koreanTotal = koreanTotal + d1[&#39;korean&#39;]
    mathTotal = mathTotal + d1[&#39;math&#39;]
    englishTotal = englishTotal + d1[&#39;english&#39;]

koreanAvg = koreanTotal // len(studentList)
mathAvg = mathTotal // len(studentList)
englishAvg = englishTotal // len(studentList)

# 전체 총점과 평균을 구한다.
allTotal = koreanTotal + englishTotal + mathTotal
allAvg = allTotal // len(studentList) // 3

# 모든 학생들의 정보를 출력한다.
for s1 in studentList :
    print(f&#39;이름 : {s1[&#39;name&#39;]}&#39;)
    print(f&#39;나이 : {s1[&#39;age&#39;]}&#39;)
    print(f&#39;국어점수 : {s1[&#39;korean&#39;]}&#39;)
    print(f&#39;수학점수 : {s1[&#39;math&#39;]}&#39;)
    print(f&#39;영어점수 : {s1[&#39;english&#39;]}&#39;)
    print()

# 각 점수별 총점과 평균을 출력한다.
print(f&#39;국어 총점 : {koreanTotal}&#39;)
print(f&#39;수학 총점 : {mathTotal}&#39;)
print(f&#39;영어 총점 : {englishTotal}&#39;)
print()
print(f&#39;국어 평균 : {koreanAvg}&#39;)
print(f&#39;수학 평균 : {mathAvg}&#39;)
print(f&#39;영어 평균 : {englishAvg}&#39;)
print()

# 전체 총점과 평균을 출력한다.
print(f&#39;전체 총점 : {allTotal}&#39;)
print(f&#39;전체 평균 : {allAvg}&#39;)
print()</code></pre>
<pre><code>이름 : 홍길동
나이 : 15
국어점수 : 90
수학점수 : 91
영어점수 : 92

이름 : 김길동
나이 : 18
국어점수 : 80
수학점수 : 81
영어점수 : 82

이름 : 최길동
나이 : 20
국어점수 : 70
수학점수 : 71
영어점수 : 72

국어 총점 : 240
수학 총점 : 243
영어 총점 : 246

국어 평균 : 80
수학 평균 : 81
영어 평균 : 82

전체 총점 : 729
전체 평균 : 81</code></pre><hr>
<p>처음 파이썬 배울 때 진짜 딕셔너리 익히느라 헷갈려했던 기억이 남
지금 가볍게 배우니 별 거 아닌 거 같은데 또 나중에 다른 거랑 합쳐지면 또 어려워서 멘붕 오겠지...
복습을 일단 열심히 해가는 걸 메인으로...</p>
<h1 id="한-주-후기">한 주 후기</h1>
<p>일단 회고조 하면서 알게 된 게
다른 사람들이 강의중 로비에서 쓴 댓글의 8배 정도를 썼다는 것...
회고조 조원이 정해져서 조원들 검색해 봤는데, 다른 사람들은 각자의 댓글 페이지 검색이 3페이지 안팎인데 나는 26페이지였다
충격받아서 앞으로는 수업에 방해되지 않게 드립이나 댓글을 좀 줄여야겠다는 생각을 함...</p>
<p>그리고 확실히 간만에 8시간 수업을 들어서 그런지 체력이 못 따라오는 게 느껴짐
운동을 하든가 아무튼 체력에 신경을 써야겠다 기존처럼 복습도 하고 다른 일도 하고 하려면.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[멋쟁이사자처럼 데이터분석] string, 자료구조(list, tuple)]]></title>
            <link>https://velog.io/@blue_cherry/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D-string-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0list-tuple</link>
            <guid>https://velog.io/@blue_cherry/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D-string-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0list-tuple</guid>
            <pubDate>Sun, 06 Apr 2025 11:51:36 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Notion에서 정리한 내용을 공유용으로 옮긴 내용입니다.
양식과 구성의 어색함이 있을 수 있습니다.</p>
</blockquote>
<p><em>04/03(목) 학습내용을 바탕으로, 당일이 아닌 추후 업로드하였음</em></p>
<hr>
<h1 id="string">string</h1>
<p>문자열, 날짜를 다루는 방법은 스스로 알아 보아야 함. 중요!</p>
<ul>
<li><p>파이썬의 언어철학</p>
<ul>
<li>작성하기 쉽고, 읽기 쉬운 언어</li>
</ul>
</li>
<li><p>에스케이프 문자
\ 와 같이 작성하는 특별한 의미를 가진 문자
\n : 줄바꿈
\t : 탭
&#39; : 작은 따옴표
&quot; : 큰 따옴표
\ : \</p>
</li>
<li><p>raw string : 에스케이프 문자를 무시한다.</p>
</li>
</ul>
<pre><code class="language-python">r&#39;동해물과\n백두산이\t마르고\\닳도록&#39;</code></pre>
<p><code>동해물과\n백두산이\t마르고\\닳도록</code></p>
<ul>
<li><p><code>&#39;&#39;&#39; &#39;&#39;&#39;</code> 나 <code>&quot;&quot;&quot; &quot;&quot;&quot;</code> 를 사용하면 에스케이프 문자를 사용하지 않아도 된다.</p>
</li>
<li><p>f 문자열</p>
</li>
</ul>
<pre><code class="language-python">a1 = &#39;홍길동&#39;
a2 = 20
a3 = 185
str4 = f&#39;이름은 {a1}이고 나이는 {a2}살 입니다. {a1}의 키는 {a3}cm 입니다&#39;
print(str4)</code></pre>
<ul>
<li>문자열 내의 문자 접근</li>
</ul>
<p>str1 = &#39;abcdefg&#39;</p>
<p>print(str1[0])</p>
<ul>
<li><p>순서값</p>
<ul>
<li><p>순서값 2 부터 5-1 까지</p>
<p> print(str1[2:5])</p>
</li>
<li><p>처음 부터 5-1 까지</p>
<p>  print(str1[:5])</p>
</li>
<li><p>순서값 2 부터 끝까지</p>
<p>  print(str1[2:])</p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>문자열 + 문자열</p>
<ul>
<li><p>같은 타입끼리만 + 로 합칠 수 있음</p>
</li>
<li><p>문자열+문자열, 정수+정수</p>
</li>
<li><p>문자열 + 문자열 → 둘을 합친 새로운 문자열이 생성된다.</p>
<p>  str1 = &#39;문자열1&#39; + &#39;문자열2&#39;
  print(str1)</p>
<p>  → ‘문자열1문자열2’</p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>문자열 * 숫자</p>
<p>  → 숫자만큼 문자열을 반복한 문자열이 생성된다.</p>
<ul>
<li>str1 = &#39;문자열1&#39; * 3
print(str1)</li>
</ul>
</li>
</ul>
<p>   → ‘문자열1문자열1문자열1’</p>
<ul>
<li>글자수</li>
</ul>
<pre><code class="language-python">str1 = &#39;abcdefg&#39;
str2 = &#39;가나다라마바사&#39;

a1 = len(str1)
a2 = len(str2)

print(a1)
print(a2)</code></pre>
<p>→ 둘 다 7</p>
<ul>
<li><p>어떤 새로운 언어를 배울 때 ‘글자 수’ 개념이 있다면
한글/영어 테스트해보기 (한글은 2byte, 영어는 1byte)
대부분의 언어는 좀 낭비하더라도 한 글자가 동일한 메모리를 사용하도록 프로그래밍되어 있음</p>
</li>
<li><p>첫글자를 대문자로 변경, 뒤는 소문자로 변경한다.</p>
</li>
</ul>
<pre><code class="language-python">str1 = &#39;hello world&#39;
str2 = str1.capitalize()
print(str2)

str3 = &#39;hELLO WORLD&#39;
str4 = str3.capitalize()
print(str4)</code></pre>
<ul>
<li><strong>대소문자 변경은 꼭 앞 글자만 바꿔주는지, 나머지도 소문자로 바꿔주는지 테스트</strong></li>
</ul>
<pre><code>Hello world
Hello world</code></pre><ul>
<li>대문자/소문자로 각각 변경</li>
</ul>
<pre><code class="language-python">str1 = &#39;ABcdEF&#39;

# 대문자를 소문자로 변경
str2 = str1.lower()
print(str2)

# 소문자를 대문자로 변경
str3 = str1.upper()
print(str3)</code></pre>
<pre><code>abcdef
ABCDEF</code></pre><ul>
<li>문자열 채우기</li>
</ul>
<pre><code class="language-python">str1 = &#39;python&#39;

# 주어진 문자열을 주어진 크기로 늘려준다.
# 원본 문자열을 가운데 배치하고 나머지는 공백으로 채워준다.
# (만약 홀수면 왼쪽으로 쏠림)
str2 = str1.center(40)
print(f&#39;[{str2}]&#39;)

# 원본 문자열을 좌측에 배치하고 나머지는 공백으로 채워준다.
str3 = str1.ljust(40)
print(f&#39;[{str3}]&#39;)

# 원본 문자열을 우측에 배치하고 나머지는 공백으로 채워준다.
str4 = str1.rjust(40)
print(f&#39;[{str4}]&#39;)</code></pre>
<pre><code>[                 python                 ]
[python                                  ]
[                                  python]</code></pre><pre><code class="language-python"># 원본 문자열을 가운데 배치하고 나머지는 지정된 문자열(글자 1개짜리)로 채워 준다.
str2 = str1.center(40, &#39;_&#39;)
print(f&#39;[{str2}]&#39;)

# 원본 문자열을 좌측에 배치하고 나머지는 지정된 문자열(글자 1개짜리)로 채워 준다.
str3 = str1.ljust(40, &#39;_&#39;)
print(f&#39;[{str3}]&#39;)

# 원본 문자열을 우측에 배치하고 나머지는 지정된 문자열(글자 1개짜리)로 채워 준다.
str4 = str1.rjust(40, &#39;_&#39;)
print(f&#39;[{str4}]&#39;)</code></pre>
<pre><code>[_________________python_________________]
[python__________________________________]
[__________________________________python]</code></pre><p><del>논란 있을까봐 글자 2개 이상은 막았다고 함…
늘어나는 게 맞다 vs 칸 안에 채우는 게 맞다
ㅋㅋㅋ수학 문제 이의 생길 거 같으면 그냥 그 선지 제거해버리기 같네</del></p>
<ul>
<li>문자열 찾기</li>
</ul>
<pre><code class="language-python"># cde가 어디에 있는가
a1 = str1.find(&#39;cde&#39;)
a2 = str1.index(&#39;cde&#39;)

print(a1)
print(a2)</code></pre>
<p>→ 둘 다 2</p>
<ul>
<li>없는 문자열 찾기</li>
</ul>
<pre><code class="language-python">a3 = str1.find(&#39;zzz&#39;) # -1
print(a3)
a4 = str1.index(&#39;zzz&#39;) # 오류!
print(a4)</code></pre>
<ul>
<li>find : 문자열에 없으면 -1 반환</li>
<li>index는 문자열에 없으면 오류</li>
<li><em>find는 문자열에만 제공. 튜플 (10,20,30) 에서 find 하면 오류.</em></li>
<li><em>index는 다른 언어에서도 나는 똑같은 오류. find를 새로 파이썬에서 제공함</em></li>
</ul>
<pre><code class="language-python"># 지정된 문자열의 일부를 다른 문자열로 변경한다
# replace(&#39;이걸&#39;,&#39;이거로&#39;,개수만큼)

str1 = &#39;abcdefg&#39;
# cde 를 zzzzz로 변경한다
str2 = str1.replace(&#39;cde&#39;, &#39;zzzzz&#39;)
print(str2)

str3 = &#39;abcdefcdekkk&#39;
str4 = str3.replace(&#39;cde&#39;, &#39;zzzzz&#39;)
print(str4)

str5 = &#39;abcdefcdekkk&#39;
# 3번째 숫자를 넣어주면 그 개수만큼 변경한다
str6 = str5.replace(&#39;cde&#39;, &#39;zzzzz&#39;, 1)
print(str6)</code></pre>
<h2 id="검증검사">검증/검사</h2>
<h3 id="문자열-시작끝-검사-startwith-endwith">문자열 시작/끝 검사 (startwith, endwith)</h3>
<pre><code class="language-python">str1 = &#39;abcdefg&#39;

# 문자열이 abc로 시작하는가
a1 = str1.startswith(&#39;abc&#39;)
print(a1)

# 문자열이 zzz로 시작하는가
a2 = str1.startswith(&#39;zzz&#39;)
print(a2)</code></pre>
<pre><code>True
False</code></pre><pre><code class="language-python"># 문자열이 efg로 끝나는가
a3 = str1.endswith(&#39;efg&#39;)
print(a3)

# 문자열이 zzz로 끝나는가
a4 = str1.endswith(&#39;zzz&#39;)
print(a4)</code></pre>
<pre><code>True
False</code></pre><p><em>사용자 입력할 때 도메인 맞는지 검사할 때 사용하기 좋음</em></p>
<p><em>아니면 사용자가 ‘김’으로 시작하는가 등</em></p>
<p><em>→ pandas로 할 예정</em></p>
<h3 id="형식-검사">형식 검사</h3>
<pre><code class="language-python"># 숫자와 문자로 구성되어 있는가
str1 = &#39;abcd1234&#39;
a1 = str1.isalnum()
print(a1) # T

str2 = &#39;abcd&#39;
a2 = str2.isalnum()
print(a2) # T

str3 = &#39;1234&#39;
a3 = str3.isalnum()
print(a3) # T

str4 = &#39;abcd가나다라1234&#39;
a4 = str4.isalnum()
print(a4) # T

str5 = &#39;abcd_1234&#39;
a5 = str5.isalnum()
print(a5) # F</code></pre>
<ul>
<li>alnum : 숫자/문자면 True, 특문이면 False</li>
</ul>
<pre><code class="language-python"># 숫자로만 구성되어 있는가
str6 = &#39;123456&#39;
a6 = str6.isdigit()
print(a6) # T

# 문자로만 구성되어 있는가
str7 = &#39;abcdef&#39;
a7 = str7.isalpha()
print(a7) # T

# 소문자로만 구성되어 있는가
str8 = &#39;abcdefg&#39;
a8 = str8.islower()
print(a8) # T

# 대문자로만 구성되어 있는가
str9 = &#39;ABCDEFG&#39;
a9 = str9.isupper()
print(a9) # T</code></pre>
<hr>
<h2 id="자료-구조">자료 구조</h2>
<h3 id="자료구조란">자료구조란</h3>
<ul>
<li><p>정의</p>
<ul>
<li>데이터를 관리하는 기법</li>
<li>실제로 겪는 것들을 기반으로 만들어짐</li>
<li>보다 실생활의 것들을 쉽고 편하게 할 수 있도록</li>
</ul>
</li>
<li><p>방식</p>
<ul>
<li>무엇인지, 어떻게 쓰는지</li>
<li>구현해 보기
위가 더 중요!</li>
</ul>
</li>
<li><p>배우는 이유</p>
<ul>
<li>내부적인 동작원리 → 어떻게 쓸지 파악 쉬워짐</li>
<li>프로그래밍 능력 키우기에 좋음</li>
</ul>
</li>
<li><p>쉽게 공부하는 법 : 실생활에서 찾아보기</p>
<ul>
<li>카페 주문 무엇부터 주문받는가</li>
<li>이불을 차례차례 쌓고, 무엇을 먼저 꺼내는가
1,2,3번 순서로 넣었으면 3,2,1로 꺼내게 됨
→ Stack</li>
</ul>
</li>
<li><p>변수는 스택 구조로 되어 있음</p>
<ul>
<li>선언을 계속 하다가, 만약 깜빡하고 선언하지 않은 게 있으면 그 근처에서 선언<ul>
<li>변수 정의는 많이 사용하는 근처에서 선언. 그래야 빠르게 꺼낼 수 있음</li>
<li>why? 변수는 스택이기 때문에 하나씩 하나씩 꺼내고 그 변수를 꺼내야 함.</li>
</ul>
</li>
<li>함수<ul>
<li>메인에서 함수로 따로 떨어져 나와서 무언가 처리하다가 메인으로 다시 돌아올 수 있는 개념</li>
<li>함수 내에서 사용하는 변수 → 함수 내에서 선언</li>
</ul>
</li>
</ul>
</li>
<li><p>자료구조 공부방법</p>
<ul>
<li><em>GPT와…</em></li>
</ul>
</li>
</ul>
<h1 id="리스트-튜플">리스트, 튜플</h1>
<ul>
<li>0부터 1씩 증가하는 순서 값을 이용하여 데이터들을 관리하는 요소</li>
<li>List [ ] : 변경 가능(mutable). 수정, 삭제, 삽입, 추가 가능</li>
<li>Tuple ( ) : 변경 불가(immutable). 읽기만 가능</li>
</ul>
<p>※ 사실 파이썬에서 문자열도 순서값을 가지고 데이터를 관리하는 요소이기 때문에 비슷한 점 많음</p>
<ul>
<li><p>리스트는 추가가 가능하므로 [ ] 를 만드는 것 의미 O</p>
</li>
<li><p>수정이 없다면 튜플 사용 권장</p>
<p>  사용했을 때 나오는 값이 여러 개다 → 튜플</p>
</li>
<li><p>튜플은 추가가 안 되기 때문에 텅 빈 ( )를 만드는 것 의미 X</p>
</li>
<li><p>문자열의 +, *, 슬라이싱, len 지원</p>
</li>
<li><p>max, min 지원</p>
<ul>
<li><em>통계값을 사용할 일이 있으면 Numpy, Pandas를 사용하는 것이 좋다.</em></li>
</ul>
</li>
<li><p>튜플에 있는 값을 모두 추출하여 새로운 리스트를 생성한다.</p>
</li>
</ul>
<pre><code class="language-python">tuple1 = 10, 20, 30, 40, 50
list1 = list(tuple1)
print(list1)</code></pre>
<ul>
<li>리스트에 있는 값을 모두 추출하여 새로운 튜플을 생성한다.</li>
</ul>
<pre><code class="language-python">tuple2 = tuple(list1)
print(tuple2)</code></pre>
<ul>
<li>문자열을 리스트나 튜플로 생성 가능</li>
</ul>
<pre><code class="language-python">tuple1 = tuple(&#39;안녕하세요&#39;)
list1 = list(&#39;안녕하세요&#39;)

print(tuple1)
print(list1)</code></pre>
<pre><code>(&#39;안&#39;, &#39;녕&#39;, &#39;하&#39;, &#39;세&#39;, &#39;요&#39;)
[&#39;안&#39;, &#39;녕&#39;, &#39;하&#39;, &#39;세&#39;, &#39;요&#39;]</code></pre><ul>
<li>join : 문자열로 합치기</li>
</ul>
<pre><code class="language-python">str1 = &quot;_&quot;
# join : 지정한 튜플이나 리스트 내의 값들을 모두 추출하여 하나의 문자열로 만들어 준다.
# 이때, join을 사용한 문자열이 구분자가 된다.
str2 = str1.join(tuple1)
str3 = str1.join(list1)

print(str2)
print(str3)</code></pre>
<ul>
<li><p>길이가 0인 문자열로 사용하면 그냥 하나의 문자열로 합칠 수 있다. ( <code>str1 = ‘’</code>)</p>
</li>
<li><p>split : 문자열 나누어 리스트 만들기</p>
</li>
</ul>
<pre><code class="language-python"># 구분자를 기분으로 문자열을 나눈다.
# 결과는 리스트로 나온다.
str1 = &#39;ab cd_ef gh&#39;

tuple1 = str1.split()
tuple2 = str1.split(&#39;_&#39;)

print(tuple1)
print(tuple2)</code></pre>
<ul>
<li>위치 찾기</li>
</ul>
<pre><code class="language-python"># 위치 찾기. 없는 것을 넣으면 오류 발생
list1 = [10, 20, 30, 40, 50]
a1 = list1.index(20)
print(a1)</code></pre>
<p><code>1</code></p>
<h3 id="enumerate">enumerate</h3>
<ul>
<li>리스트, 튜플에서만 사용</li>
</ul>
<pre><code class="language-python">list1 = [10, 20, 30, 40, 50]
tuple1 = 10, 20, 30, 40, 50

# 관리하고있는 값들과 순서값의 쌍으로 구성된 요소(튜플)를 생성한다.
e1 = enumerate(list1)
e2 = enumerate(tuple1)
print(list(e1))
print(list(e2))</code></pre>
<pre><code>[(0, 10), (1, 20), (2, 30), (3, 40), (4, 50)]
[(0, 10), (1, 20), (2, 30), (3, 40), (4, 50)]</code></pre><ul>
<li><p>for문에서의 응용</p>
<ul>
<li><p>파이썬에서 몇 번째 반복인지 알기 어려울 때, enumerate를 사용할 수 있다.</p>
<pre><code class="language-python">for idx, a1 in enumerate(list1) :
  print(f&#39;{idx} : {a1}&#39;)</code></pre>
<pre><code>0 : 10
1 : 20
2 : 30
3 : 40
4 : 50</code></pre></li>
</ul>
</li>
</ul>
<h2 id="list만-있는-기능-mutable">list만 있는 기능 (mutable)</h2>
<h3 id="추가수정삽입삭제">추가/수정/삽입/삭제</h3>
<ul>
<li>tuple은 불가능</li>
</ul>
<pre><code class="language-python">list1 = []
print(list1)</code></pre>
<ul>
<li>추가 : append (한 개만)</li>
</ul>
<pre><code class="language-python"># 추가
list1.append(10)
list1.append(20)
list1.append(30)
print(list1)</code></pre>
<p><code>[10, 20, 30]</code></p>
<ul>
<li>추가 : extend (여러 개)</li>
</ul>
<pre><code class="language-python"># 다수의 값을 한번에 추가한다
# 다른 리스트나 튜플이 가지고 있는 값을 추출하여 뒤에 추가해준다.
list1.extend([40, 50, 60])
print(list1)</code></pre>
<p><code>[10, 20, 30, 40, 50, 60]</code></p>
<ul>
<li>수정 : 순서값 이용</li>
</ul>
<pre><code class="language-python"># 수정
# 순서값을 가지고 접근하여 값을 넣어준다.
list1[1] = 200
print(list1)</code></pre>
<p><code>[10, 200, 30, 40, 50, 60]</code></p>
<ul>
<li>삽입 : insert</li>
</ul>
<pre><code class="language-python"># 삽입
# 순서값 1에 해당하는 곳에 지정된 값을 삽입한다.
list1.insert(1, 90)
print(list1)

# 삽입하는 수가 순서값 1이 되도록</code></pre>
<p><code>[10, 90, 200, 30, 40, 50, 60]</code></p>
<ul>
<li>제거 : remove</li>
</ul>
<pre><code class="language-python"># 값을 지정하여 제거한다.
list1.remove(90)
print(list1)

# 처음 1개만 제거, 없는 값이면 오류</code></pre>
<p><code>[10, 200, 30, 40, 50, 60]</code></p>
<ul>
<li>제거 : del</li>
</ul>
<pre><code class="language-python"># del 연산자 : 지정한 요소를 제거하는 연산자
del list1[1]
print(list1)</code></pre>
<p>→ 순서값 1에 해당하는 값 제거</p>
<ul>
<li>제거/추출 : pop</li>
</ul>
<pre><code class="language-python"># 가장 마지막 것을 가져오고 리스트에서는 제거
a1 = list1.pop()
print(a1)
print(list1)</code></pre>
<pre><code>60
[10, 200, 30, 40, 50]</code></pre><pre><code class="language-python"># 순서값을 지정하여 가져오고 리스트에서는 제거한다.
a2 = list1.pop(2)
print(a2)
print(list1)</code></pre>
<pre><code>30
[10, 200, 40, 50]</code></pre><h3 id="순서-변경">순서 변경</h3>
<ul>
<li>정렬 : sort</li>
</ul>
<pre><code class="language-python"># 정렬
# 리스트내의 데이터를 직접 정렬 해준다.
# 오름차순 정렬
list1 = [40, 20, 10, 30, 50]
list1.sort()
print(list1)</code></pre>
<p><code>[10, 20, 30, 40, 50]</code></p>
<ul>
<li>반전 : reverse</li>
</ul>
<pre><code class="language-python"># 반전
# 순서를 반전시킨다.
list1.reverse()
print(list1)</code></pre>
<ul>
<li><p>내림차순을 만들려면 <code>list1.sort(reverse=True)</code>123</p>
</li>
<li><p>문자도 정렬 가능. why? → 유니코드</p>
</li>
</ul>
<h3 id="아스키-코드와-유니코드">아스키 코드와 유니코드</h3>
<ul>
<li><p>정수 → 이진수 정수</p>
</li>
<li><p>실수</p>
<ul>
<li>고정 소수점 : 반 잘라서 소수점 이하 자리, 소수점 왼쪽 자리</li>
<li>유동 소수점</li>
</ul>
</li>
<li><p>논리</p>
<ul>
<li>True : 1</li>
<li>False : 0</li>
</ul>
</li>
<li><p>문자</p>
<ul>
<li>알파벳, 특문에 8bit를 이용해서 붙임
a = 64
b = 65</li>
</ul>
</li>
<li><p>전구 1개 → 1bit : 전구의 최소 용량 단위
8bit → 1 byte : 사람 입장에서의 최소 용량 단위</p>
</li>
</ul>
<ul>
<li>유니코드<ul>
<li>글자마다 각각 숫자를 붙여 놓은 것</li>
<li>ASCII + 한글 + 한문 → 한국형 유니코드<ul>
<li>2 byte 단위</li>
<li>한국어 100 → 가 였다면 중국어 100 → 人</li>
<li>꿻뚫■쎝 같은 오류가 남</li>
</ul>
</li>
<li>UTF-8<ul>
<li>이것들을 다 모아서 한 번에 표현할 수 있도록 해놓은 것</li>
<li>가장 많이 쓰임</li>
</ul>
</li>
<li>UTF-16</li>
<li>학술형 유니코드 : 잘 안 쓰는 갑골 문자 등도 모아놓음</li>
</ul>
</li>
</ul>
<p>→ 따라서 숫자로 되어 있기 때문에 문자끼리 대소 비교 가능함</p>
<ul>
<li>조합형, 완성형<ul>
<li>윈도우 : 완성형 (가,나,거)</li>
<li>맥 : 조합형 (ㄱ,ㄴ,ㅏ,ㅓ)</li>
<li>따라서 맥 → 윈도우로 파일 보내면 ㅈㅏㅁㅗㅂㅜㄴㄹㅣ가 일어남</li>
</ul>
</li>
</ul>
<h2 id="-컴프리헨션comprehension"># 컴프리헨션(comprehension)</h2>
<p><strong><em>무조건 익숙해지기!</em></strong></p>
<ul>
<li>컴프리헨션 기본</li>
</ul>
<pre><code class="language-python"># list1이 가지고 있는 값에 10을 더해 list2에 담아준다.
list1 = [10, 20, 30, 40, 50]
list2 = []

for v1 in list1 :
    list2.append(v1 + 10)

print(list2)</code></pre>
<p><code>[20, 30, 40, 50, 60]</code></p>
<pre><code class="language-python"># list1이 가지고 있는 값의 수만큼 반복한다. (in list1)
# list1이 가지고 있는 값을 v1 변수에 담아 준다.(for v1)
# 새로운 리스트에 v1 + 10을 담아 준다.(v1 + 10)

list2 = [v1 + 10 for v1 in list1]
print(list2)</code></pre>
<p><code>[20, 30, 40, 50, 60]</code></p>
<p>list1 에 담기 때문에 5개를 가지고 → [  ,  ,  ,  ,  ]</p>
<p>list1에서 v1 에 하나씩 담아서 v1 으로 → 10</p>
<p>v1에 담긴 수를 v1 + 10 → 10 + 10 = 20</p>
<p>list2 = [ 20,   ,   ,   ,   ]</p>
<p>이런 식으로 list1에서 10, 20, 30, 40, 50 차례대로 가져옴</p>
<ul>
<li>구하는 값에 if - else</li>
</ul>
<pre><code class="language-python"># list3의 있는 값이 2로 나눈 나머지가 0이면
# 10을 곱해서 담고 그렇지 않으면 그대로 담아준다.
list3 = [1, 2, 3, 4, 5]
list4 = []

for v1 in list3 :
    if v1 % 2 == 0 :
        list4.append(v1 * 10)
    else :
        list4.append(v1)
print(list4)</code></pre>
<p><code>[1, 20, 3, 40, 5]</code></p>
<pre><code class="language-python"># list3이 가지고 있는 값의 개수 만큼 반복한다(in list3)
# list3이 가지고 있는 값을 v1 변수에 담아준다(for v1)
# 만약 v1을 2로 나눈 나머지가 0 이라면 (if v1 % 2 == 0) v1 * 10 을 리스트에 담아주고 (v1 * 10)
# 그게 아니면 v1을 그대로 담아준다(else v1)

list3 = [1, 2, 3, 4, 5]
list4 = [v1 * 10 if v1 % 2 == 0 else v1 for v1 in list3]
print(list4)</code></pre>
<p><code>[1, 20, 3, 40, 5]</code></p>
<p>list3 에서 v1으로 하나씩</p>
<p>1 → <code>if v1 % 2 == 0</code> 이 False이므로 1</p>
<p>2 →  <code>if v1 % 2 == 0</code> 이 True이므로 20</p>
<p>3 → False이므로 3</p>
<p>4 → True이므로 40</p>
<p>5 → False이므로 3</p>
<p>list4 = [1, 20, 3, 40, 5]</p>
<ul>
<li>담는 조건에 if</li>
</ul>
<pre><code class="language-python">list3 = [1, 2, 3, 4, 5]
list4 = []
# list3이 가지고 있는 값을 2로 나눈 나머지가 0이라면
# 10을 곱해 새로운 리스트에 담는다.
for v1 in list3 :
    if v1 % 2 == 0 :
        list4.append(v1 * 10)

print(list4)

# 그 외에는 건너뛰는 것</code></pre>
<p><code>[20, 40]</code></p>
<pre><code class="language-python">list3 = [1, 2, 3, 4, 5]
# list3이 가지고 있는 값의 수만큼 반복한다.(in list3)
# list3이 가지고 있는 값을 v1 변수에 담아 준다.(for v1)
# 이 때, v1을 2로 나눈 나머지가 0일 경우에만(v1 % 2 == 0)
# 새로운 리스트에 v1 * 10을 해서 담아 준다.(v1 * 10)
# 만약 v1 % 2 == 0의 조건에 만족하지 않는 값이라면 리스트에 담지 않는다.
list4 = [v1 * 10 for v1 in list3 if v1 % 2 == 0 ]
print(list4)</code></pre>
<p><code>[20, 40]</code></p>
<blockquote>
<ul>
<li>작성/읽기 팁<ul>
<li>역순으로!</li>
<li>작성</li>
<li>바꿀 거(list1) → 변수 설정(v1) → 새롭게 담을 거(v1+10)</li>
</ul>
</li>
</ul>
</blockquote>
<hr>
<h2 id="과제">과제</h2>
<ul>
<li>일반 / comprehension 두 가지 버전</li>
</ul>
<h3 id="문제1">문제1)</h3>
<p>리스트에 [1, 2, 3, 4, 5, 6, 7, 8, 9] 까지 담겨져 있다.</p>
<p>이를 이용해 구구단을 출력해 보아라.</p>
<pre><code class="language-python"># 일반

list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 2단부터 9단까지 반복한다.
for dan in list1[1:] : # (2부터 9까지 가져옴)
    # 1부터 9까지 반복한다.
    for number in list1 :
        # 현재 단수에 현재 숫자를 곱한다.
        result = dan * number
        # 출력한다.
        print(f&#39;{dan} X {number} = {result}&#39;)
    print() # (단과 단 사이에 줄바꿈? enter? 출력)</code></pre>
<pre><code class="language-python"># 컴프리헨션

list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 결과를 담을 리스트
resultList = []
# 9단까지 반복한다.
for dan in list1[1:] :
    # 현재 단수의 구구단 결과값을 계산하여 담아준다.
    r1 = [dan * number1 for number1 in list1]
    # 결과를 담을 리스트에 담아준다.
    resultList.append(r1)
    # ([[2,4,6,8,10,12,14,16,18],[3,6,...],...,[...,81]] 이런 상태)

# 출력한다.
dan = 2
number1 = 1

# 결과의 수 만큼 반복한다.
for result in resultList :  # ([2,4...],[3,6,...] 이거 한 리스트씩 분리해서 가져오기)
    # 현재 단의 결과로 반복한다.
    for r1 in result : # ([2,4,...,18] 안에서 2, 4, 6, ... 하나씩 가져오기)
        # 출력한다
        print(f&#39;{dan} X {number1} = {r1}&#39;)
        number1 = number1 + 1

    dan = dan + 1 # (2, 3, ..., 9까지 반복) 
    number1 = 1 # (number1 은 계속 1, 2, ..., 9여야 함)
    print()</code></pre>
<p>→ 일반 방법으로 하는 게 편함</p>
<ul>
<li>리스트를 만들기 위해 있는 것이 comprehension인데, 구구단은 출력 위주? 의 문제임</li>
</ul>
<h3 id="문제2">문제2)</h3>
<p>1부터 1000까지의 숫자 중 3의 배수이거나 7의 배수에 해당하는 숫자들의 총합을 구하여라.</p>
<pre><code class="language-python"># 일반

# 숫자를 담을 변수
number1 = 1
# 총합을 담을 변수
total = 0
# 1부터 1000까지 반복한다.
while number1 &lt;= 1000 :
    # 현재 숫자가 3의 배수인지 7의 배수인지 검사한다
    if number1 % 3 == 0 or number1 % 7 == 0 :
        # 3의 배수이거나 7의 배수라면 누적한다.
        total = total + number1

    number1 = number1 + 1

# 총합을 출력한다.
print(f&#39;총합 : {total}&#39;)</code></pre>
<pre><code class="language-python"># (내 답안_수정) 일반
list1 = []
num = 0
while num &lt; 1000 : # 1부터 1000까지
    num = num + 1 # 맨 위로. 대신 num = 0부터로 변경
    if num % 3 == 0 or num % 7 == 0 : # 3의 배수나 7의 배수일 때만
        list1.append(num) # list에 담기

# print(list1) # gpt로 개수 정답과 같은 거 확인 완료
sum(list1)</code></pre>
<pre><code class="language-python"># comprehension

# 1 ~ 1000까지의 숫자 중 3의 배수 이거나 7의 배수인 숫자를 리스트에 담아준다.
list1 = [v1 + 1 for v1 in range(1000) if (v1 + 1) % 3 == 0 or (v1 + 1) % 7 == 0]
# 리스트에 담긴 숫자들의 총합을 구한다
total = sum(list1)
# 총합을 출력한다.
print(f&#39;총합 : {total}&#39;)

# range(a,b) 없이 구현</code></pre>
<pre><code class="language-python"># (내 답안) comprehension
list1 = [v1 for v1 in range(1,1001) if v1 % 3 == 0 or v1 % 7 == 0 ]
print(sum(list1))</code></pre>
<p>→ 컴프리헨션이 훨씬 간단</p>
<h3 id="문제3">문제3)</h3>
<p>1부터 1000까지의 숫자 중에 3의 배수만 담아준다.
이때 3의 배수가 짝수라면 &#39;짝수&#39;라고 담고 홀수면 &#39;홀수&#39;라고 담는다.</p>
<pre><code class="language-python"># 숫자를 담을 리스트
list1 = []
# 1부터 1000까지 반복한다.
for v1 in range(1000) :
    # 3의 배수인지 검사한다.
    if (v1 + 1) % 3 == 0 :
        # 3의 배수가 짝수라면 짝수라는 문자열을 담아준다.
        if (v1 + 1) % 2 == 0 :
            list1.append(&#39;짝수&#39;)
        # 3의 배수가 홀수라면 홀수라는 문자열을 담아준다.
        else :
            list1.append(&#39;홀수&#39;)
# 출력한다.
print(list1)</code></pre>
<pre><code class="language-python"># list1 = [in range(1000)]
# list1 = [for v1 in range(1000)]
# list1 = [for v1 in range(1000) if (v1 + 1) % 3 == 0]
list1 = [&#39;짝수&#39; if (v1 + 1) % 2 == 0 else &#39;홀수&#39; for v1 in range(1000) if (v1 + 1) % 3 == 0]
print(list1)</code></pre>
<p>→ comprehension이 더 간단</p>
<ul>
<li>뭔가를 더해서 누적시키겠다 → 초기값 0</li>
<li>뭔가를 곱해서 누적시키겠다 → 초기값 1</li>
</ul>
<hr>
<h3 id="random">random</h3>
<ul>
<li>값 하나를 랜덤하게 추출</li>
<li>리스트, 튜플 전부 가능</li>
</ul>
<pre><code class="language-python">list1 = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

# 값 하나를 랜덤하게 추출한다.
a1 = random.choice(list1)
a2 = random.choice(list1)
a3 = random.choice(list1)

print(a1, a2, a3)</code></pre>
<p><code>30 70 30</code></p>
<pre><code class="language-python"># 리스트가 가지고 있는 값들을 랜덤하게 섞어 준다. (리스트 자체를 바꾸는 것)
random.shuffle(list1)
print(list1)</code></pre>
<p><code>[70, 80, 100, 60, 50, 30, 90, 10, 40, 20]</code></p>
<pre><code class="language-python"># 0 ~ 99 사이의 정수값 하나를 랜덤하게 추출한다.
a1 = random.randrange(100)
-&gt; 34

# a ~ b 사이의 정수값 하나를 랜덤하게 추출한다.
a2 = random.randrange(-11,-1)
-&gt; -10

# 5 ~ 30 사이이고 2씩 증가된 숫자 중에 하나를 랜덤하게 추출한다.
a3 = random.randrange(5, 31, 2)
-&gt; 15

# 0 ~ 1 보다 작은 실수 중에 랜덤하게 뽑아낸다.
a1 = random.random()
-&gt; 0.14888979525742851</code></pre>
<h3 id="seed">seed</h3>
<ul>
<li><p>항상 같은 패턴 : 고정값</p>
</li>
<li><p>변화되는 패턴 : 현재 시간</p>
</li>
<li><p>데이터 명세서</p>
<ul>
<li>데이터 분석을 위해서는 데이터분석/통계 + 도메인 지식 필요</li>
<li>이 배경 지식을 쌓기 위해 그 산업/분야의 전문가 초빙해서 데이터 명세서 제작</li>
</ul>
</li>
</ul>
<h3 id="unpack-분해">unpack (분해)</h3>
<ul>
<li><p>a1, a2, a3 = 10, 20, 30</p>
<p>  10, 20, 30 → (10, 20, 30) (튜플) 이고</p>
<p>  좌우 개수가 같으면</p>
<p>  튜플의 각 값을 변수마다 일대일 대응해줌</p>
</li>
</ul>
<h2 id="range">Range</h2>
<pre><code class="language-python"># 0 ~ 20-1 까지 1씩 증가하는 값을 관리하는 요소
r1 = range(20)

print(f&#39;시작값 : {r1.start}&#39;)
print(f&#39;종료값 : {r1.stop}&#39;)
print(f&#39;증감값 : {r1.step}&#39;)
print(r1)</code></pre>
<pre><code>시작값 : 0
종료값 : 20
증감값 : 1
range(0, 20)</code></pre><ul>
<li><p>실제로 관리하는 값을 확인해보고 싶다면 리스트나 튜플로 다시 생성하여 출력</p>
<ul>
<li>print(list(r1))</li>
<li>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]</li>
</ul>
</li>
<li><p>3 ~ 27-1 까지 1씩 증가하는 값을 가진 range 생성</p>
<ul>
<li>range(3, 27)</li>
<li>[3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26]</li>
</ul>
</li>
<li><p>3 ~ 27-1 까지 2씩 증가하는 값을 가진 range 생성</p>
<ul>
<li>range(3, 27, 2)</li>
<li>[3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25]</li>
</ul>
</li>
<li><p>30 ~ 8 + 1 까지 1씩 감소</p>
<ul>
<li>print(list(r4))</li>
<li>[30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9]</li>
</ul>
</li>
</ul>
<hr>
<h1 id="후기">후기</h1>
<p>분량 많다...
컴프리헨션은 그 전에 딱히 익힌 적이 없어서 어색 그 자체였다 진짜
자주 쓰나요 질문도 슬쩍 했는데 엄청 많이 쓴다고 <em>강조</em> <strong>강조</strong> <strong><em>강조</em></strong>를 하셔서 울면서 익히려고 함
확실히 슬슬 내용이 어려워짐 따라가기 조금씩 버겁
그래도 아직 평타 이상은 가는 거 같긴 한데 이게 내가 미리 배워놨으니 따라가는 거지
새로 배우는 건 뒤쳐질 수도 있겠단 생각이 들어...</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[멋쟁이사자처럼 데이터분석] 제어문]]></title>
            <link>https://velog.io/@blue_cherry/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D-%EC%A0%9C%EC%96%B4%EB%AC%B8</link>
            <guid>https://velog.io/@blue_cherry/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D-%EC%A0%9C%EC%96%B4%EB%AC%B8</guid>
            <pubDate>Sun, 06 Apr 2025 11:30:24 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Notion에서 정리한 내용을 공유용으로 옮긴 내용입니다.
양식과 구성의 어색함이 있을 수 있습니다.</p>
</blockquote>
<p><em>04/02(수) 학습내용을 바탕으로, 당일이 아닌 추후 업로드하였음</em></p>
<hr>
<p>주피터 사용 방법 ↓</p>
<h3 id="restart-kernel-and-run-all-cells">Restart Kernel and Run All Cells</h3>
<ul>
<li><p>초기화 후 모든 셀 다시 실행</p>
</li>
<li><p>처음 나오는 화면은 실행된 것이 아니라, 그냥 이전 것이 보이는 작업내역</p>
<p>  따라서 어제 쓴 <code>a1=100</code> 을 오늘 바로 코드에 사용할 수 없음</p>
</li>
<li><p>그냥 적용하면 not defined로 뜸 → 새로 실행해 주기</p>
</li>
</ul>
<h1 id="제어문">제어문</h1>
<ul>
<li>코드의 흐름은 순행적인데 그 흐름을 제어하는 것이 → 제어문</li>
<li>파이썬은 3가지의 제어문만 존재 (switch 없음)</li>
</ul>
<h3 id="if">if</h3>
<ul>
<li>결과가 T,F인 식 들어감</li>
<li>결과가 T면 동작</li>
<li>결과가 F면 동작 X</li>
</ul>
<h3 id="while">while</h3>
<ul>
<li>결과가 T,F인 식 들어감 → ☆</li>
<li>결과가 T면 아래 내용 수행 후 다시 ☆로 돌아감</li>
<li>결과가 F면 동작 X</li>
</ul>
<h3 id="for">for</h3>
<ul>
<li>데이터를 관리하는 요소 반드시 필요</li>
</ul>
<h1 id="if-문">if 문</h1>
<h2 id="else">else</h2>
<ul>
<li>if 문의 False인 경우 수행되는 부분</li>
<li>if는 T든 F든 바로 실행됨</li>
</ul>
<pre><code class="language-python"># else
# if 문의 조건식의 결과가 False인 경우 수행되는 부분
if a1 == 100 :
    print(&quot;a1은 100입니다&quot;) # 실행 O
else :
    print(&quot;a1은 100이 아닙니다&quot;) # 실행 X

if a1 != 100 :
    print(&quot;a1은 100이 아닙니다&quot;) # 실행 X
else :
    print(&quot;a1은 100입니다&quot;) # 실행 O</code></pre>
<pre><code>a1은 100입니다
a1은 100입니다</code></pre><h2 id="elif">elif</h2>
<ul>
<li><p>조건이 여러 개일 때</p>
<ul>
<li><p>조건이 2개 (ex. 성별)
if - else 로 가능</p>
</li>
<li><p>조건이 여러 개 (ex. 연령대)
elif로 사용</p>
</li>
</ul>
</li>
<li><p>True인 것만 수행되고 아래는 실행되지 않음</p>
<ul>
<li><p>if 문은 위에서 아래로 내려오면서 조건식을 계산함</p>
</li>
<li><p>True인 것을 만나면 그 부분 수행</p>
</li>
<li><p>if문 전체 수행 끝</p>
<p>※  문법 검사는 코드 수행 전 따로 하기 때문에 문법은 맞아야 함</p>
</li>
</ul>
</li>
</ul>
<p>※ switch case 문</p>
<ul>
<li><p>if문은 처음부터 차례차례 실행
100개 중 90번째가 T면 첫 번째부터 90개의 elif를 실행 후 결과 도출</p>
</li>
<li><p>이걸 건너뛰고 그 위치만 바로 찾을 수 있게 해주는 게 switch</p>
</li>
<li><p>but 파이썬에서는 이 부분을 없앰</p>
</li>
</ul>
<p>※ 슈퍼 컴퓨터</p>
<ul>
<li><p>1988에 슈퍼 컴퓨터 처음 들여옴</p>
</li>
<li><p>측정 기준</p>
<ul>
<li><p>1+1을 얼마나 빠르게</p>
</li>
<li><p>1+1을 1초에 얼마나 많이</p>
<p>→ 전력 공급량을 생각하지 않고 측정하는 방법</p>
</li>
<li><p>전력량을 고려하여 측정하는 방법</p>
<ul>
<li>전력량 스트레스 테스트?</li>
</ul>
</li>
<li><p>요즘은 속도가 거의 차이를 느끼지 못할 정도</p>
<p>  (ns 단위의 차이)</p>
<p>  → 사용자가 편한 쪽으로</p>
<p>  → 파이썬 : 개발자의 공부량을 줄이고 다 빼버림</p>
<p>  cf) 코틀린</p>
<ul>
<li>최근에 만들어진 언어</li>
<li>공부량 오히려 늘어남</li>
<li>but 생산성 좋음 → JAVA에서 코틀린으로 바뀌는 추세</li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="반복문">반복문</h1>
<h2 id="while-1">while</h2>
<ul>
<li>True인 경우 구문 실행하고 다시 돌아옴</li>
</ul>
<pre><code class="language-python">While (조건식) :
    구문 1
else :
    구문 2</code></pre>
<p><strong>but</strong> else는 무의미. 그냥 밖에 쓰면 됨</p>
<pre><code class="language-python">while (조건식) :
    구문 1
    구문 2
구문 3
구문 4</code></pre>
<ul>
<li>while은 F가 되지 않으면 영원히 돌아감 → <strong>무조건 False 필요</strong></li>
<li>중단 시키는 방법 : Interrupt Kernel</li>
</ul>
<h2 id="for-in">for in</h2>
<ul>
<li>range(n)
: 0부터 n-1까지 반복 (n개 반복)</li>
</ul>
<p><em>반복 번째</em> 에 해당하는 데이터가 변수에 들어감</p>
<ul>
<li><p>for v1 range(10)
0,1,2,3,4,5,6,7,8,9까지 들어감</p>
<ul>
<li><p>0이 v1에 들어감
구문 실행</p>
</li>
<li><p>1이 v1에 들어감
구문 실행
…</p>
</li>
<li><p>마지막인 9가 v1에 들어감
구문 실행</p>
</li>
</ul>
</li>
<li><p>range 대신 (10,20,30)</p>
<pre><code class="language-python">  for i in (10,20,30) :
      print(i)</code></pre>
<pre><code class="language-python">  10
  20
  30</code></pre>
<ul>
<li><p>10이 들어감, 반복
20이 들어감, 반복
30이 들어감, 반복</p>
</li>
<li><p>관리하는 데이터의 반복 번째에 있는 데이터가 변수에 들어감
→ 구문 실행</p>
</li>
</ul>
</li>
</ul>
<blockquote>
<ul>
<li><strong>설계 능력</strong>을 늘리는 연습
 코딩을 실무에서는 구현할 일이 없음 그냥 갖다 씀</li>
</ul>
</blockquote>
<ul>
<li>절대 코드 외우지 X
외우면 절대 다른 유형 문제 못 품</li>
<li>단기간에 코딩 테스트 봐야 한다면 암기 어쩔 수 없음
but 무조건 다시 설계하는 연습할 것
※ 주석 더 중요해짐</li>
</ul>
<ul>
<li><strong>while :</strong> 이 조건을 가지고 반복할 거야. / 끝나는 범위가 지정</li>
<li><strong>for</strong> : 몇 번을 반복해야 하지? / 여기 있는 데이터로 반복해야지</li>
</ul>
<h3 id="ex">EX</h3>
<ul>
<li>주석 필수로 달기!
한글로 설계 먼저 하고, 그 후 코드 작성하기</li>
</ul>
<h3 id="ex-1-1부터-3씩-증가시킨-숫자를-총-20개-출력">Ex 1) 1부터 3씩 증가시킨 숫자를 총 20개 출력</h3>
<p>원래는 <code>a = a + 3</code> 과 <code>print(a)</code> 자리가 반대였는데, 4부터 출력되길래 순서 변경</p>
<pre><code class="language-python"># 학습
a = 1
for _ in range(20) :
    print(a)
    a = a + 3</code></pre>
<p>이렇게 하면 for 밖에 <code>print(a)</code> 했을 때 61 출력됨</p>
<p>but 출력은 정상 작동</p>
<p><del>→ 다른 변수를 사용하면 됨. for 밖에서 a를 안 쓰면 되지</del></p>
<pre><code class="language-python"># [정답]
a1 = 1
# 1을 출력한다.
print(a1)

# 19번을 반복한다
for _ in range(19) :
    # 3을 증가시킨다
    a1 = a1 + 3
    # 출력한다
    print(a1)</code></pre>
<h3 id="ex-2-1부터-100까지의-숫자-중-3의-배수를-모두-출력">Ex 2) 1부터 100까지의 숫자 중 3의 배수를 모두 출력</h3>
<pre><code class="language-python"># [정답1]
# 1부터 100까지 반복한다.
for v1 in range(100) :
    # 3의 배수인지 확인한다.
    if (v1 + 1) % 3 == 0 :
        # 출력한다.
        print(v1 + 1)</code></pre>
<pre><code class="language-python"># [정답2]
# 1부터 시작하므로 1을 가지고 있는 변수를 선언한다.
a1 = 1
# 100까지 반복한다.
while a1 &lt;= 100 :
    # 현재 숫자가 3의 배수인지 검사한다.
    if a1 % 3 == 0 :
        # 만약 3의 배수이면 출력한다.
        print(a1)
    # 1을 증가시킨다.
    a1 = a1 + 1</code></pre>
<pre><code class="language-python"># [정답3]
a1 = 3
while a1 &lt;= 100 : # 내 풀이는 여기서 &lt;= 대신 &lt; 로 작성ㅠ 제대로 보자!
    # 출력한다.
    print(a1)
    # 3을 증가시킨다.
    a1 = a1 + 3</code></pre>
<pre><code class="language-python"># &lt;실행 중간&gt;
# 숫자를 입력 받는다.
number1 = input(&#39;숫자를 입력해 주세요 :&#39;)
number2 = int(number1)
# print(number2)
# 1부터 입력 받은 숫자까지의 총합을 구한다.
# 출력한다.</code></pre>
<p><code># print(number2)</code>       이 부분 보면 주석 되어 있음.</p>
<ul>
<li>한 데까지 잘 작동되는지 확인하는 습관 들이기
그리고 주석 처리
 습관화되어야 나중에 리버깅?하기도 쉬움</li>
</ul>
<h2 id="break--continue">break / continue</h2>
<ul>
<li><p>단독으로 쓰이지 않고 if - break, if - continue로 씀</p>
</li>
<li><p>break, continue가 쓰이지 않아도 충분히 구현 가능 (break는 필요할 수 있음)</p>
</li>
<li><p>왜 쓰는가? 데이터의 결함이 없게끔 하기 위해 사용 → <strong>데이터 무결성</strong> 보장</p>
</li>
<li><p><strong>break</strong></p>
<ul>
<li>True라고 하더라도 break 만나면 아래 구문 무시하고 중단</li>
<li>외부의 요인에 의해 중단해야 하는 경우 사용<ul>
<li>0이 나올 때까지 진행하는데, 언제 0이 들어갈지 모르는 경우</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>continue</strong></p>
<ul>
<li>끝까지 안 갔더라도, 뒤에 True인 내용이 있더라도 다음 반복 (while 위치로 올라가서) 실행</li>
<li>밑이 더 있더라도 특정 조건이면 바로 반복되게</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>※ 절대 하면 안 되는 행위</strong></p>
</blockquote>
<ul>
<li>선택적 통계의 적용<ul>
<li>내가 세운 가설이 맞다는 걸 증명하기 위해서 나에게 유리한 것만 봄</li>
</ul>
</li>
<li>다방면 분석, 다양한 시각</li>
<li>내가 세운 가설이 틀렸다, 라는 걸 가설검증
→ 내가 세운 가설이 맞다는 걸 주장하는 확실한 방법!</li>
</ul>
<ul>
<li>데이터 처리 단계</li>
</ul>
<ol>
<li>데이터 수집</li>
<li>데이터 메모리에 저장</li>
<li>데이터 무결성 검사</li>
<li>처리 및 변환</li>
<li>분석 및 해석</li>
<li>출력 및 시각화</li>
<li>저장 및 배포</li>
</ol>
<ul>
<li>데이터 무결성 검사를 위해 while - break 문 사용</li>
</ul>
<pre><code class="language-python"># (학습) 데이터 결함 검사 예시 1
a1 = 0
while a1 &lt;= 100 :
    a1 = a1 + 1
    if a1 % 3 == 0 :
        print(a1)</code></pre>
<pre><code class="language-python"># (학습) 데이터 결함 검사 예시 2
a1 = 0
while a1 &lt;= 100 :
    a1 = a1 + 1
    if a1 % 3 != 0 :
        continue
    print(a1)</code></pre>
<hr>
<aside>
💡

<p>※ 데이터에 접근하는 자세</p>
<ul>
<li><p>공공데이터포털</p>
</li>
<li><p>신한카드 API 같은 것들 제공</p>
</li>
<li><p>서울시, 지방, 대학 등등 관심있게 알아두기</p>
</li>
<li><p>병원 진료기록 어플</p>
</li>
<li><p>데이터를 보고 이 데이터를 가지고 기업에서 어떤 이득을 취할까 생각해 보기</p>
<ul>
<li><p>비용 절감, 이득 극대화, 재고 절감 등등</p>
<p>→ 처방전 사진 찍으면 제휴병원 할인 : 보험 인수거절에 쓰임</p>
<p>→ 만보기 걸음 체크 : 운동 - 건강 연관지어 보험회사에서 사용</p>
</li>
</ul>
</li>
</ul>
</aside>

<aside>
💡

<ul>
<li><p>포트폴리오 작성시</p>
<p>  비즈니스 모델이 무엇인가?</p>
<p>  어떤 비즈니스 모델을 가져갈 수 있는가?</p>
<p>  (수입, 비용 절감 등등)</p>
<p>  생각해 보기</p>
</li>
<li><p>특정 회사에 포트폴리오 넣을 때 그 회사와 관련된 데이터 수집, 데이터 분석해서 넣기</p>
</li>
</ul>
<p>※ AI-hub</p>
<p>다양한 분야들/형태들의 공부하기 좋은 데이터 많이 제공</p>
<p>→ 틈틈이 데이터 한 번씩 보기</p>
<p>→ 데이터 보는 시각 확장, 인사이트 뜨이게 하기</p>
<ul>
<li><p>검색 팁</p>
<ul>
<li><p>000(기업 이름) “개발자 센터”</p>
<p>  open API 제공하는 경우 많음</p>
</li>
<li><p>000(지역 이름) “공공데이터”</p>
</aside>

</li>
</ul>
</li>
</ul>
<hr>
<h2 id="과제---0402">과제 - 04.02</h2>
<ul>
<li>1부터 1000까지 숫자 중 소수를 모두 출력한다.</li>
</ul>
<pre><code class="language-python"># 1부터 1000까지 반복한다.
number1 = 1

while number1 &lt;= 1000 :
    # 2부터 현재 숫자 - 1까지 반복하며 나머지를 구해본다.
    number2 = 2

    # 소수인지의 여부를 판단하기 위한 변수
    isPrimeNumber = True

    while number2 &lt; number1 :
        # 만약 하나라도 나누어 떨어지게 된다면 소수가 아니므로 다음 반복으로 넘어간다
        if number1 % number2 == 0 :
            isPrimeNumber = False
            break

        number2 = number2 + 1
    # 만약 나누어 떨어지는 숫자를 만나지 못했다면 소수이므로 출력한다
    if number1 != 1 and isPrimeNumber == True :
        print(number1)

    number1 = number1 + 1</code></pre>
<hr>
<h1 id="후기">후기</h1>
<p><strong>설명 들으면서 느끼는 수학과의 공통점</strong></p>
<ol>
<li><p>처음 헷갈리면 일단 하나씩 다 해보고 반복되는 부분 찾으라고 하심</p>
<p> → 축차대입법. 하나씩 해보면서 규칙 찾는 방법</p>
</li>
<li><p>외우기만 하면 안 되고 스스로 설계하는 과정 필요</p>
<p> → 수학도 단순 공식 암기에서 끝나거나 문제를 외우는 것이 아니라 개념에 대한 이해 필요</p>
<p> 수시 대비는 어쩔 수 없이 외우더라도 그 후 반복하여 익히기</p>
</li>
</ol>
<p><strong>내가 설계하는 것보다 다른 사람이 만든 코드 이해하는 게 확실히 더 어렵다…</strong></p>
<p>소수 알고 있는 개념이고 알고리즘 방식 알고 있어도 약간 차이가 있을 때 아 이걸 여기서 넣었구나, 이 개념 이렇게 했구나가 확실히 내가 구현하는 것보다 느림</p>
<p>주석이 진짜 필필수…남 보여줄 거면 자세할수록 좋다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[멋쟁이사자처럼 데이터분석] 주피터 사용법, 파이썬 기초]]></title>
            <link>https://velog.io/@blue_cherry/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D-%EC%9E%84%EC%8B%9C%EC%A0%80%EC%9E%A5</link>
            <guid>https://velog.io/@blue_cherry/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D-%EC%9E%84%EC%8B%9C%EC%A0%80%EC%9E%A5</guid>
            <pubDate>Sun, 06 Apr 2025 11:00:33 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Notion에서 정리한 내용을 공유용으로 옮긴 내용입니다.
양식과 구성의 어색함이 있을 수 있습니다.</p>
</blockquote>
<p><em>04/01(화) 학습내용을 바탕으로, 당일이 아닌 추후 업로드하였음</em></p>
<hr>
<h3 id="python-장점">python 장점</h3>
<p>(강사님 개인취향ㅎㅎ)</p>
<ul>
<li>쉬움<ul>
<li>3일이면 다 배울 수 있다.</li>
</ul>
</li>
<li>일관성<ul>
<li>파이썬에서 오류가 난다 → 다른 곳에서도 똑같이 오류 발생</li>
<li>오동작한다면 다른 문법에서도 오동작함</li>
</ul>
</li>
<li>개방형 언어<ul>
<li>다른 사람들이 만들어 놓은 라이브러리가 많다</li>
<li>배포가 용이</li>
</ul>
</li>
</ul>
<h1 id="주피터-노트북-사용-방법">주피터 노트북 사용 방법</h1>
<ul>
<li><p>귀여운 경로 트러블</p>
<ul>
<li><p>처음에 열었을 때 보통 경로가 써 있는 곳에</p>
<p>  /</p>
<p>  만 있는 거임</p>
<p>  오류인가 했는데 알고 보니 처음은 /로 나오고 그 뒤로 경로가 붙는 것.</p>
<p>  나는 처음 열리는 폴더에서 바로 작업하게 해 놔서 저게 끝인 거였다 :)</p>
</li>
<li><p>** 그 창을 닫지 마... **</p>
<p>그 다음 문제. 주피터는 열렸는데, NEW ipynb 안 열리는 문제 발생.</p>
<p>당황해서 막 workspace 옮겨보고 하다가</p>
<p>프롬프트 창을 닫으면 안 된다는 것을 처음으로 알았다!ㅋㅋㅋ</p>
<p> 바로바로 닫는 성격인 나 (안 그럼 자동채점은…뭐가 열렸는지 글씨가 안 보일 정도로 꽉 차는걸…안 쓰는 거 다 닫아놔야 함…)</p>
<p> 줌/웨일/zep/카톡/디코/실행하는 폴더 등등 이미 표시줄 꽉 차서 프롬프트 닫았는데 그게 원인이었다</p>
<p> 매우 다행 lolol</p>
<p> 그 와중에 또 거슬리는 거 싫어서 가상 데스크톱 만들어서 거기에 zep 이랑 프롬프트랑 줌 안 쓰는 창 다 넣어놓음</p>
<p> 앞으로도 이렇게 쓰지 않을까 싶다ㅎㅎ</p>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/blue_cherry/post/10ae26f1-f543-4cff-b69c-55d57f06de4e/image.png" alt=""></p>
<ul>
<li><p>cell : 위 사진의 나누어진 한 칸</p>
</li>
<li><p>버튼 : 위/아래로 이동, 위/아래로 삽입, 삭제</p>
</li>
<li><p>command mode : 밖을 클릭해서 회색으로 된 상태</p>
<p>  edit mode : 안을 클릭해서 흰색으로 되어 있고 커서 들어간 상태</p>
</li>
<li><p>code/markdown/raw 모드로 변경 가능</p>
<ul>
<li>code mode : 코드 작성 / 왼쪽에 [ ]</li>
<li>markdown : 주석 / 왼쪽에 [ ] 가 없음</li>
</ul>
</li>
</ul>
<p><del>아 영문 작성창은 예쁜데 실제 업로드 글씨체가 너무 안 예뻐!!!</del></p>
<p>  💡</p>
<blockquote>
<h3 id="데이터-분석--ai-메모리-관리">데이터 분석 / AI 메모리 관리</h3>
</blockquote>
<ul>
<li>kernel - Restart Kernel and Run All Cells : 전부 다 초기화하고 다시 실행</li>
<li>주피터 닫고 다시 실행</li>
<li>Running - <strong>X</strong> 누르기 또는 오른쪽 <strong>Shut Down All</strong></li>
<li>이전 프로젝트는 무조건 SHUTDOWN 시키기
  보통 데이터 단위가 어마어마하기 때문에 (테라인 경우도 다수) 메모리 부족을 겪는 경우가 많음</li>
</ul>
<hr>
<h3 id="주석">주석</h3>
<ul>
<li><p>실제 주석은 #뿐.</p>
</li>
<li><p>여러 줄 주석으로 쓰는 “”” 나 ‘’’ 는 실제로는 주석이 아니라 사실 문자열</p>
</li>
<li><p>데이터 메모리를 차지한다는 얘기 (주석의 def는 기본적으로 skip 하고 건너뛰어야 주석)</p>
</li>
<li><p>주피터는 맨 밑의 값이 실행됨</p>
<pre><code class="language-python">  100
   200</code></pre>
<p>  <code>200</code></p>
</li>
</ul>
<p>따라서 주피터에서</p>
<pre><code class="language-python">    &quot;&quot;&quot;
    동해물과 백두산이
    마르고 닳도록
    &quot;&quot;&quot;</code></pre>
<p>   이것만 쓰면
    <code>&#39;\n동해물과 백두산이\n마르고 닳도록\n&#39;</code>  출력됨</p>
<p>   뒤에 보통 코드와 print() 가 나오니 실행이 안 되는 것</p>
<pre><code class="language-python">    a1 = 10
    print(10)
    300</code></pre>
<p>   <code>10</code>
    <code>300</code></p>
<hr>
<p><em>일부 제외하고 정리</em></p>
<h2 id="식별자">식별자</h2>
<ul>
<li>이름/identifier</li>
<li>규칙 ← 지키지 않으면 문제가 발생<ul>
<li>첫 글자는 영문 대소문자/한글/_ 가능 # 숫자가 안 됨!</li>
<li>이후 영문 대소문자/한글/숫자/_ 가능</li>
</ul>
</li>
</ul>
<h3 id="표기-기법">표기 기법</h3>
<ul>
<li><p>카멜 표기 기법 : koreanTotalAverage # 맨 앞 소문자</p>
</li>
<li><p>파스칼 표기 기법 : KoreanTotalAverage # 맨 앞 대문자</p>
</li>
<li><p>스네이크 표기 기법 : korean_total_average</p>
</li>
<li><p>변수 : 카멜</p>
</li>
<li><p>함수 : 카멜</p>
</li>
<li><p>클래스 : 파스칼</p>
</li>
<li><p>타입 : 파스칼 (나무위키피셜)</p>
</li>
<li><p>상수 : 모든 글자를 대문자로, 스네이크</p>
</li>
</ul>
<blockquote>
<h3 id="복습-방식"><strong>복습 방식</strong></h3>
</blockquote>
<ul>
<li>예제 가져와서 읽어보기</li>
<li>새로운 파일 만들기</li>
<li>코드를 보고 이해한 순서 <strong>한글</strong>로 주석 적기</li>
<li>주석 보고 파이썬 코드로 변환하기</li>
<li>주석 지우기</li>
<li>반복하기</li>
</ul>
<blockquote>
<p>→ 작업의 순서를 설계할 수 있는가가 중요
→ 많이 읽고 눈으로 익혀 보기
다른 사람 코딩을 볼 때도 주석 작성해 보기
→ 절대 코드부터 나가지 말 것!
실무에서는 다이어그램 기획서, 설계 문서를 보고 코딩을 하게 되고,
경력이 쌓이면 내가 설계를 하게 됨
 코딩 문법은 AI가 알려 주지만, 순서 설계 능력은 키워야 함!</p>
</blockquote>
<hr>
<ul>
<li><p>컴퓨터 장치</p>
<ul>
<li>CPU<ul>
<li>저장된 코드 가져다 씀</li>
<li>속도 매우 빠름</li>
</ul>
</li>
<li>HDD, SDD (저장장치)<ul>
<li>속도 매우 느림</li>
<li>저장된 데이터를 CPU가 필요할 때부터 옮기기 시작하면 느림/비효율적</li>
</ul>
</li>
<li>중간 창고인 RAM에 저장<ul>
<li>단위용량당 가격 비쌈</li>
<li>빠를수록 비싸짐</li>
<li>전기 공급 중단되면 데이터 삭제됨</li>
</ul>
</li>
</ul>
</li>
<li><p>프로그램 동작시</p>
<ul>
<li><p>RAM에 저장</p>
</li>
<li><p>저장된 데이터 처리</p>
</li>
<li><p>처리된 결과 출력</p>
<p>※ 저장-처리-출력-저장-처리-출력 X</p>
<p>한 번에 저장, 한 번에 처리, 한 번에 출력</p>
</li>
</ul>
</li>
</ul>
<h3 id="ram">RAM</h3>
<ul>
<li>RAM은 1byte 단위로 나누어져 있고, 필요하다면 벽을 뚫어서 넓게 사용하는 것 가능</li>
<li>메모리의 주소값이 존재 (0,1,2,…) : 1byte마다 0,1,2 이런 식으로 주소값이 있음</li>
<li>하나를 저장하면 그 자리에는 저장 X. 같은 위치에 저장하려 하면 덮어씌워짐</li>
<li>RAM에서 필요한 것<ul>
<li>위치 : 이름 지정. 그럼 VM이 알아서 판단하여 크기 파악해서 위치 정하고 기억.</li>
<li>크기 : 파이썬은 정해져 있음.</li>
<li>용도 : 개발자 입장에서는 정해져 있음.</li>
</ul>
</li>
<li>따라서 이름만 정하면 됨. (보통은 이름,타입이지만 파이썬은 타입 필요 X)</li>
</ul>
<h2 id="리터럴">리터럴</h2>
<pre><code class="language-python">print(&#39;정수 :&#39;, 100)
print(&#39;실수 :&#39;, 11.11)
print(&#39;문자열 :&#39;, &#39;하하하&#39;)
print(&#39;참 :&#39;, True)
print(&#39;거짓 :&#39;, False)
print(&#39;지수 :&#39;, 2e5)
print(&#39;복소수 :&#39;, 10 + 8j)
print(&#39;세자리 마다 표시 :&#39;, 123_456_789)
print(&#39;없음 :&#39;, None)</code></pre>
<ul>
<li><p>2e5 : $2×10^5$</p>
</li>
<li><p>세자리마다 _를 써서 구분해도 그냥 정수로 표시.</p>
<ul>
<li><p>맨 앞, 뒤는 불가능
print(_123) # 오류 발생
print(123_) # 오류 발생
<del>아 역슬래시로 강제 기울임 마크다운 막을 수 있네
위에 _123 표시 때문에 강제로 폰트 기울어짐...ㅋㅋㅋ</del></p>
</li>
<li><p>정수 부분에만 가능
print(123_456.789)  # 가능 (정수 부분에만 _ 있음)
  print(123._456)      # 오류 발생 (_가 소수점 뒤에 있음)</p>
</li>
<li><p>123_<em>456 (\</em> 연달아 두 개 이상)은 안 됨</p>
</li>
</ul>
</li>
</ul>
<pre><code class="language-python"># type을 쓰면 값의 타입을 파악할 수 있다
print(type(100))
print(type(11.11))
print(type(&#39;하하하&#39;))
print(type(True))
print(type(False))
print(type(2e10))
print(type(10 + 8j))
print(type(123_456_789))
print(type(None))</code></pre>
<p>&lt;class &#39;int&#39;&gt;
&lt;class &#39;float&#39;&gt; → 실수
&lt;class &#39;str&#39;&gt;
&lt;class &#39;bool&#39;&gt; → 불리안
&lt;class &#39;bool&#39;&gt;
&lt;class &#39;float&#39;&gt;
&lt;class &#39;complex&#39;&gt;
&lt;class &#39;int&#39;&gt;
&lt;class &#39;NoneType&#39;&gt;</p>
<h2 id="변수">변수</h2>
<pre><code class="language-python"># 파이썬은 변수의 선언과 동시에 저장할 값을 지정해준다.
# = : 대입연산자. 오른쪽에 있는 값을 왼쪽의 변수에 저장하는 작업을 수행한다.
a1 = 10
a2 = 11.11
a3 = &#39;안녕하세요&#39;</code></pre>
<pre><code class="language-python"># 여러 변수에 같은 값을 저장하고자 한다면...
a5 = a6 = a7 = 100
print(a5)
print(a6)
print(a7)</code></pre>
<pre><code class="language-python"># 각 변수에 저장될 값을 각각 다를 경우 다음과 같이 하는 것도 가능하다.
# 여기에는 tuple 이라는 것과 관련된 비밀이 숨어 있다.
a8, a9, a10 = 100, 200, 300
print(a8)
print(a9)
print(a10)</code></pre>
<ul>
<li>파이썬에서는 쉼표(<code>,</code>)로 구분된 값들이 자동으로 튜플로 간주됨</li>
<li><code>(a8, a9, a10) = (100, 200, 300)</code> 과 <code>a8, a9, a10 = 100, 200, 300</code> 은 동일</li>
<li>a8, a9, a10 = 100, 200, 300
(a8, a9, a10) = 100, 200, 300
a8, a9, a10 = (100, 200, 300)
전부 다 가능.</li>
</ul>
<ul>
<li><p>파이썬 3.6 부터 변수에 자료형을 명시할 수 있다. (int, bool 같은 데이터의 타입)
변수를 정의할 때 자료형을 명시하면 값을 지정하지 않아도 된다.
단 변수를 사용하기 전에 반드시 값을 저장해야 한다.</p>
</li>
<li><p>변수에 자료형을 붙여 주는 이유</p>
</li>
</ul>
<ol>
<li>변수를 선언할 때 최초의 값을 지정해주고 싶지 않을 때 -&gt; 그냥 값을 0 같은 값을 넣어주면 된다.</li>
<li>변수의 타입을 명시적으로 표현하고 싶을때 -&gt; 다른 타입의 값을 저장할 수 있기 때문에 별 의미가 없다.</li>
</ol>
<pre><code class="language-python">
a11:int

a11 = 100
print(a11)

a11 = 11.11
print(a11) # (출력하면 그냥 오류 없이 출력돼서 의미가 없음.)</code></pre>
<ul>
<li>최초의 값을 지정해주고 싶지 않을 때<ol>
<li>함수 중간에 값이 결정될 때 → 초기값 0 등으로 설정</li>
<li>반복문에서 특정 조건이면 출력되는 변수 → 초기값 0, -1 등으로 설정</li>
<li>클래스의 인스턴스 변수 → 생성자 <code>__init__()</code>  사용</li>
<li>여러 경우 중 특정 조건이 만족될 때 값이 정해지는 경우 (근데 미리 선언하고 싶음) → “Invalid” 같은 걸 대신 넣어서 오류시 출력되도록 함</li>
</ol>
</li>
</ul>
<hr>
<h1 id="연산자">연산자</h1>
<h3 id="산술-연산자">산술 연산자</h3>
<ul>
<li><ul>
<li>: 더하기</li>
</ul>
</li>
<li><ul>
<li>: 빼기</li>
</ul>
</li>
<li><ul>
<li>: 곱하기</li>
</ul>
</li>
<li>/ : 나누기. 결과가 실수</li>
<li>// : 나누기. 결과가 정수 (몫)</li>
<li>% : 나머지</li>
<li>** : 거듭제곱 → 2^3</li>
</ul>
<h3 id="비교-연산자">비교 연산자</h3>
<ul>
<li>좌측의 값이 우측값과 비교하여 어떻다, 라는 연산을 수행한다.</li>
<li>결과는 True나 False로 나온다.</li>
<li>&quot;==&quot; : 좌측의 값이 우측의 값과 같은가</li>
<li>&quot;!=&quot; : 좌측의 값이 우측의 값과 다른가</li>
<li>&quot;&gt;&quot; : 좌측의 값이 우측의 값보다 큰가</li>
<li>&quot;&lt;&quot; : 좌측의 값이 우측의 값보다 작은가</li>
<li>&quot;&gt;=&quot; : 좌측의 값이 우측의 값보다 크거나 같은가</li>
<li>&quot;&lt;=&quot; : 좌측의 값이 우측의 값보다 작거나 같은가</li>
</ul>
<h3 id="증감-연산자대입-연산자">증감 연산자(대입 연산자)</h3>
<ul>
<li>++, -- : 변수에 저장되어 있는 값을 1 증가시키거나 1 감소시키는 연산자이다. 파이썬은 지원하지 않는다.</li>
<li>+=, -=, <em>=, /=, //=, %=, *</em>= 연산자를 사용할 수 있다.</li>
</ul>
<p>취향에 안 맞으면 쓰지 않아도 됨</p>
<h3 id="논리-연산자">논리 연산자</h3>
<ul>
<li>연산자 좌측과 우측에는 참, 거짓이 결과인 연산식이 존재해야 한다.</li>
<li>and : 좌측과 우측이 하나라도 False면 최종 결과는 False가 된다.</li>
<li>or : 좌측과 우측이 하나라도 True면 최종 결과는 True가 된다.</li>
<li>not : 우측의 결과가 True면 False로, False면 True로 바꿔준다.</li>
</ul>
<pre><code class="language-python">v1 = 10
v2 = 20
print(not v1 &lt; 5)
print(not v1 &gt; 5)</code></pre>
<pre><code>True
False</code></pre><p>10&lt;5 가 False이므로 → True</p>
<p>10&gt;5가 True이므로 → False</p>
<hr>
<p>당연히 vscode로 할 거라 생각했는데 주피터라는 새로운 환경에서 적응하느라 어색한 감이 더 크다.</p>
<p>초반이라 주피터 가지고 놀기에 좀 더 몰입한 듯...</p>
<p>그리고 새로운 걸 배우기 시작하면 왠지 당연하게 단축키부터 외우게 된다.</p>
<p>한글로 문서 편집, 검수할 당시 진짜 온갖 단축키에 매크로 다 달고 살아서 그런가 효율적이고 빠르지 않으면 못 견디게 되어버림.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[주피터 노트북 실행 경로 변경]]></title>
            <link>https://velog.io/@blue_cherry/%EC%A3%BC%ED%94%BC%ED%84%B0-%EB%85%B8%ED%8A%B8%EB%B6%81-%EC%8B%A4%ED%96%89-%EA%B2%BD%EB%A1%9C-%EB%B3%80%EA%B2%BD</link>
            <guid>https://velog.io/@blue_cherry/%EC%A3%BC%ED%94%BC%ED%84%B0-%EB%85%B8%ED%8A%B8%EB%B6%81-%EC%8B%A4%ED%96%89-%EA%B2%BD%EB%A1%9C-%EB%B3%80%EA%B2%BD</guid>
            <pubDate>Sun, 06 Apr 2025 08:57:44 GMT</pubDate>
            <description><![CDATA[<p><del>시키지 않은 짓을 했다가 나의 난리 여행 시작</del></p>
<p><em>강의 내용이 아닌 혼자 난리친 내용입니다.</em></p>
<p><em>검색으로 들어오신 분들. 큰 도움이 안 될 수 있습니다.</em></p>
<hr>
<p>주피터는 설치는 굉장히 쉽다.</p>
<p>정확히는 아나콘다 설치가 쉽다.</p>
<p>다만...그 주피터가 열리는 위치가 맘에 안 드는 사람이 분명...있을 것이다.</p>
<p>쓰지도 않는 사용자 폴더 뭐냐고</p>
<p>강사님께서는 Desktop에 workspace 폴더 위치시키라고 하셨지만…</p>
<p>D 드라이브에 모든 걸 쑤셔넣고 배경화면엔 최소한의 폴더와 귀여운 애옹이만 있어야 하는 나</p>
<p>용서할 수 없었다.</p>
<p><img src="https://velog.velcdn.com/images/blue_cherry/post/8b255574-6cbf-4b94-b8c3-b50ca5064fc7/image.png" alt=""></p>
<p>우리 애옹이 지켜</p>
<hr>
<h3 id="jupyter-notebook-실행방법">jupyter notebook 실행방법</h3>
<ul>
<li>anaconda navigator → jupyter notebook</li>
<li>anaconda prompt → jupyter notebook</li>
<li>프롬프트에서 ‘인터넷 주소 부분’ 컨트롤+클릭 or 복붙</li>
<li>(윈도우) jupyter notebook 아이콘 클릭</li>
</ul>
<p>나는 이 중에서 주피터 노트북 바로 클릭하는 방법을 주로 이용했고, 따라서 이 아이콘의 &quot;시작 위치&quot;를 변경해 보기로 함</p>
<h2 id="변경-시작">변경 시작</h2>
<h3 id="1-속성-시작-위치-변경">1. 속성-시작 위치 변경</h3>
<p> 윈도우 기준 시작 메뉴에 뜨는 Jupyter Notebook 아이콘 눌러 실행하는 방식이 제일 간단했기 때문에 파일 위치 열어서 시작 위치 변경</p>
<pre><code>- _config.py 수정하는 방법도 같이 나왔는데, 그냥 아이콘만 건드리고 싶었음
- ‘부트캠프’ 폴더를 바탕 화면으로 옮겨 놨기 때문에 먼저 D 드라이브 다른 폴더로 시도

- “시작 위치”에 %USERPROFILE% 대신 D:\Study\파이썬 삽입 (아래가 속성창)
    ![](https://velog.velcdn.com/images/blue_cherry/post/bf2b667e-cb2a-4815-9b98-ffaa5a6be8cc/image.png)

    **→ 그대로 유저 창에서 시작 ㅜ**

- “대상”이
C:\Users\Administrator\anaconda3\python.exe C:\Users\Administrator\anaconda3\[cwp.py](http://cwp.py/) C:\Users\Administrator\anaconda3 C:\Users\Administrator\anaconda3\python.exe C:\Users\Administrator\anaconda3\Scripts\[jupyter-notebook-script.py](http://jupyter-notebook-script.py/) %USERPROFILE%
로 되어 있음. 대상 수정
- C:\Users\Administrator\anaconda3\python.exe C:\Users\Administrator\anaconda3\[cwp.py](http://cwp.py/) C:\Users\Administrator\anaconda3 C:\Users\Administrator\anaconda3\python.exe C:\Users\Administrator\anaconda3\Scripts\[jupyter-notebook-script.py](http://jupyter-notebook-script.py/) &quot;D:\Study\파이썬&quot;

    **→ 정상 작동!**</code></pre><h3 id="2-이제-바탕화면의-부트캠프폴더-다시-d드라이브에-넣고-부트캠프로-폴더-변경">2. 이제 바탕화면의 “부트캠프”폴더 다시 D드라이브에 넣고, 부트캠프로 폴더 변경</h3>
<p><img src="https://velog.velcdn.com/images/blue_cherry/post/04676c46-11be-455e-b9c3-8a717811fe02/image.png" alt=""></p>
<ul>
<li><p>“대상” 부분이 분명 원래 수정이 됐는데, *<em>갑자기 회색으로 막힘. *</em>왜…? 
프롬프트가 뜨긴 뜨는데, 주피터는 열리지 않음…</p>
</li>
<li><p>관리자 권한으로 실행해 보고, 권한 줬다 뺐다 해보고, 이것저것 바꿔도 안 됨</p>
</li>
</ul>
<h3 id="3-이것-저것-시도">3. 이것 저것 시도</h3>
<ul>
<li>시작 위치 되돌려 보기<pre><code>  → 실패</code></pre></li>
</ul>
<p><strong>다른 주피터 실행 방법들은 정상 작동되는지 확인</strong></p>
<ul>
<li><p>CMD에서 실행
→ jupyter notebook 입력</p>
<blockquote>
<p>&#39;jupyter&#39;은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다.</p>
</blockquote>
<ul>
<li>Anaconda 프롬프트에서 시도</li>
</ul>
</li>
</ul>
<p>  → 정상적으로 실행됨</p>
<ul>
<li><p>프롬프트 시작 위치 변경</p>
<p>→ 정상 작동</p>
</li>
</ul>
<p><strong>어쨌든 이 방법이 되긴 되는 것. 꼬인 것뿐…</strong></p>
<p> 프롬프트로 매번 열기에는 ‘jupyter notebook’ 이거 쳐야 해서 너무 귀찮음</p>
<pre><code>- Anaconda Navigator

    → 정상 실행. but USER 파일에서 시작됨

- where jupyter로 경로 찾아서 다시 바로가기 경로를 수정

    → 클릭했는데 마찬가지로 잠깐 열렸다가 바로 닫히는 현상</code></pre><h3 id="4-성공">4. 성공</h3>
<ul>
<li>원본 위치? 에 가서 jupyter-notebook.exe 누르니까 정상 실행</li>
<li>저 exe에 대해서 새 바로가기 생성</li>
<li>&quot;C:\Users\사용자명\Anaconda3\Scripts\jupyter-notebook.exe&quot; --notebook-dir=D:\Study\부트캠프\workspace\01_Python</li>
</ul>
<p> 이렇게 지정해서 새로 만들고, 아이콘 png?도 원래 주피터 아이콘 이미지 찾아서 설정</p>
<ul>
<li><p>새로 시작 위치에 고정..</p>
<p>  못 쓰게 되어 버려진…이전 아이콘 🤣</p>
<p>  <img src="https://velog.velcdn.com/images/blue_cherry/post/e74d2a3a-c28b-4259-a0e5-207f5e8c8a2f/image.png" alt=""></p>
</li>
</ul>
<pre><code>어쨌든 바탕화면에서 D 드라이브로 폴더 위치도 옮겼고, 실행도 한 번에 바로 되니 만족하며 쓰기로…
** :) HAPPY ENDING!**</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[멋쟁이사자처럼 데이터분석] 파이썬 개요, 개발환경 구축]]></title>
            <link>https://velog.io/@blue_cherry/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EC%9A%94-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95</link>
            <guid>https://velog.io/@blue_cherry/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B6%84%EC%84%9D-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EC%9A%94-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95</guid>
            <pubDate>Sun, 06 Apr 2025 08:33:23 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Notion에서 정리한 내용을 공유용으로 옮긴 내용입니다.
양식과 구성의 어색함이 있을 수 있습니다.</p>
</blockquote>
<p><em>03/31(월) 학습내용을 바탕으로, 당일이 아닌 추후 업로드하였음</em></p>
<p>OT를 소요시간 착각으로 앞부분만 듣고
다음 일정을 위해 차를 타러 급하게 가느라 첫날 눈치를 좀 봤다...
그리고 하필 강사님이 자리 비우지 말아라 하시면서 출석 어쩌구 얘기를 꽤 하셨음ㅋㅋㅋ아 찔려</p>
<p>그래도 처음 시작하는 과목인 파이썬은 기존에 유튜브로 공부를 좀 했던 파트라 조금 손쉽게 들을 수 있어 다행이었다. <del>(응 백준 브론즈)</del></p>
<p>목표는 진짜 꾸준히 출석하기</p>
<hr>
<h1 id="python-개요">Python 개요</h1>
<h3 id="프로그래밍-언어의-발전">프로그래밍 언어의 발전</h3>
<ul>
<li>프로그래밍 언어의 시초<ul>
<li>포트란 : 수학 계산 최적화</li>
<li>Algol : 최초의 프로그래밍 언어. 포트란에 대항하여 만들어짐 = A 언어</li>
<li>B 언어 = Bell 언어</li>
<li>그 후 C 언어 → C++ → C#
<del>++에 ++이 아래로 더 붙어서 # 모양. 아이디어 미쳤</del></li>
</ul>
</li>
<li>C 언어<ul>
<li>OS를 만들기 위해서 만든 언어</li>
</ul>
</li>
<li>OS 종류<ul>
<li>유닉스 : 최초의 OS - 슈퍼,워크스테이션 / IOS 등</li>
<li>리눅스 : 라이트 유닉스 - 웹서버/안드로이드에서 사용</li>
<li>Window</li>
</ul>
</li>
</ul>
<h3 id="플랫폼">플랫폼</h3>
<ul>
<li><p>플랫폼이란?</p>
<ul>
<li><p>ex) 배민</p>
<p>  → 고객과 식당과 배달원을 연결해줌
  but 그냥 연결하는 것이 아니라 각각을 위한 어플을 만들어서 그 어플에 맞춰 주문/배달/음식 제공</p>
</li>
<li><p>즉, 이미 만들어진 곳에서 들어와서 돌아가는 것</p>
</li>
<li><p>규칙, 규격에 맞춰서 작업하면 언제든 사람들이 더 들어오고 확장할 수 있음</p>
<p>  <del>이래서 초반에 플랫폼 시장에서 잘 만들어 놓으면 독과점이 쉬워지는…</del></p>
</li>
<li><p>기차들을 &#39;플랫폼&#39;에 맞춰서 만들었기 때문에 승객이 KTX를 타든 1호선을 타든 타고 내릴 수 있음</p>
</li>
</ul>
</li>
</ul>
<h2 id="독립성">독립성</h2>
<h3 id="개념">개념</h3>
<ul>
<li>‘플랫폼 독립적’에서 플랫폼은 &#39;OS&#39;를 말함</li>
<li>독립적 ↔ 종속적</li>
<li>만약 Window에서 만들어서 Window에서만 돌아간다면 → 플랫폼에 종속적</li>
</ul>
<h3 id="독립성종속성-비교">독립성/종속성 비교</h3>
<p><strong>플랫폼에 독립적이냐 종속적이냐를 잘 알고 있어야 함</strong></p>
<ul>
<li><p>독립적인 소프트웨어</p>
<ul>
<li><p>느림, 메모리 많음</p>
</li>
<li><p>개발자가 만든 코드를 윈도우/맥/리눅스 모두에서 실행 가능</p>
</li>
<li><p>결과물이 실행 파일로 나오는 것이 아님.</p>
<p>  바이트 코드나 스크립트 형태로 도출되며, 인터프리터나 가상 머신을 통해 실행 (by GPT)</p>
</li>
<li><p>JAVA, Python : 플랫폼 독립적</p>
</li>
</ul>
</li>
<li><p>종속적인 소프트웨어</p>
<ul>
<li><p>장점 : 메모리 덜 사용, 처리속도 빠름</p>
<p>  OS에서만 되게 만들면, 그냥 그 OS에서 지원하는 기능?을 갖다 쓰면 되기 때문에 실행파일로 결과물 도출</p>
</li>
</ul>
</li>
</ul>
<pre><code>    실행파일 용량이 적고, 속도가 빠름

    그 OS에 최적화되면 메모리, 처리속도에 여유가 있으므로, 그래픽에 더 투자할 수 있음

- 단점 : 각각 OS에 맞춰서 개발자가 여러 개를 만들어야 함
- C 언어 계열 : 플랫폼 종속적
- 게임은 주로 종속적 ← 속도가 매우 중요</code></pre><h3 id="독립성의-이해비유">독립성의 이해/비유</h3>
<p>ex) 라틴어 책을 읽고 싶다면 취할 수 있는 방법</p>
<ul>
<li>여기서 &quot;출판사 = 개발자&quot;</li>
</ul>
<ol>
<li><p>한국 버전 번역서 읽기 = 플랫폼에 종속적</p>
<ul>
<li><p>출판사 → 한국 번역서 출간, 중국 번역서 출간, 일본 번역서 출간…</p>
<ul>
<li><p>출판사 : 나라별로 여러 개 각각 판매. 한 번역서는 그 나라에서만 가능</p>
</li>
<li><p>어느 나라에서 많이 읽힐지 고려하여 출간</p>
</li>
</ul>
</li>
</ul>
</li>
</ol>
<pre><code>    -    많은 돈, 많은 시간

    - 독자 : 쉽게 읽을 수 있음. 자신에게 편한 언어. 독자 친화적

 → 개발자가 여러 OS로 만들기와 동일

  - 어느 나라(플랫폼)에서 많이 쓰일지 고려하여 개발

  - 많은 비용/시간 소요

  - 개발사의 어려움</code></pre><ul>
<li><p>번역가가 읽어주기 = 플랫폼에 독립적</p>
<ul>
<li><p>출판사는 라틴어로 된 책만 출간</p>
</li>
<li><p>라틴어를 한국어로 실시간으로 통역하는 사람 고용</p>
<p>  라틴어를 일본어로 실시간으로 통역하는 사람 고용</p>
<p>  …</p>
<p>  → 라틴어로 된 책을 사면 → 그 나라의 통역가 보내서 읽어줌</p>
</li>
<li><p>책은 1번만 쓰임</p>
<p>  통역가 미리 대기시키면 됨</p>
</li>
<li><p>초기 투자/비용만 들이면 됨</p>
</li>
<li><p>매번 실시간으로 한 명 한 명 배당하므로 메모리 많이 사용, 처리속도 느림</p>
</li>
<li><p>but 프로그래밍 개발에 주류로 쓰임. Why?</p>
<ul>
<li><strong>하드웨어의 발전 → 속도 차이 현저히 감소</strong></li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="파이썬">파이썬</h2>
<ul>
<li>플랫폼에 독립적<ul>
<li>OS에 맞는 언어 형태로 번역해 줌</li>
<li>VM(python virtual machine) : 인터프리터 내장 → 파이썬 코드를 win/mac 등등으로 번역해줌</li>
</ul>
</li>
<li>어떤 코드를 만들어도 그 OS에 맞춰서 동작함 (윈도우용 파이썬/맥용 파이썬을 설치한다면)</li>
<li>GPL 라이센스 : 수정/배포에 자유로움</li>
<li>개방형 언어 : 여러 개발자가 다같이 발전시킬 수 있음</li>
<li>수치 연산 빠르게 가능 : Torch - Numpy<ul>
<li>AI/ML에서 학습/추론이 중요</li>
<li>추론은 금방 가능</li>
<li>but 학습에는 많은 시간이 소요<ul>
<li>대규모 연산은 시간이 오래 걸림</li>
<li>Numpy → 빠른 배열 연산 가능</li>
<li>계산 단축을 위해 GPU 연산 필요 → Torch : GPU 연산 지원</li>
<li>파이썬에 이미 PyTorch 내장, Numpy와 변환도 쉬움</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h1 id="개발도구">개발도구</h1>
<h3 id="방식">방식</h3>
<ul>
<li><p>일반 코딩 방식 : 실행하면 쭉 실행
컴퓨터에서 동작하는 프로그램 만들 때 용이
웹서버, 데몬, 사용자가 사용하는 컴퓨터용 프로그램 등</p>
</li>
<li><p>노트북 방식 : 원하는 부분 원할 때 실행
실행 결과가 바로바로 코드 아래에 삽입
데이터 분석 등등</p>
</li>
</ul>
<p><em>→ 수업에서는 노트북 방식 사용
vscode로 해보긴 하고 그 후 아나콘다 이용</em></p>
<h3 id="종류">종류</h3>
<ul>
<li>VS Code : 마이크로소프트 개발. 다양한 개발 분야 지원. 가벼움<ul>
<li>단점
플러그인 많음
모르면 쓰기 힘듦
프로젝트 폴더 관리의 호불호 <del><em>(강사님의 불호ㅎㅎ)</em></del></li>
</ul>
</li>
<li>PyCharm : Jet Brains 개발. 파이썬용 개발 도구<ul>
<li>단점 : 무거움. 기능이 많아서 용량이 큼</li>
</ul>
</li>
<li>jupyter : notebook 방식, 웹브라우저 사용. (데이터 분야에서 많이 사용)<ul>
<li>단점 : ai 어시스턴스 없음</li>
</ul>
</li>
</ul>
<h1 id="개발환경-구축">개발환경 구축</h1>
<h2 id="1-python-설치">1. python 설치</h2>
<ul>
<li>python.org</li>
<li>다운로드</li>
<li>설치시 &#39;반드시&#39; <strong>add python x.x to PATH</strong> 체크</li>
</ul>
<h2 id="2-vscode-설치">2. vscode 설치</h2>
<p>그냥 설치-쭉 하고</p>
<p>Extention에서 python 설치</p>
<h2 id="3-아나콘다-설치">3. 아나콘다 설치</h2>
<ul>
<li>anaconda 사이트</li>
<li>Free Download → Skip 후 OS 맞춰 설치</li>
<li>업데이트 하면 느리므로 하지 말자!</li>
</ul>
<h3 id="jupyter-notebook-실행방법">jupyter notebook 실행방법</h3>
<ul>
<li>anaconda navigator → jupyter notebook</li>
<li>anaconda prompt → jupyter notebook</li>
<li>프롬프트에서 ‘인터넷 주소 부분’ 컨트롤+클릭 or 복붙</li>
</ul>
<h2 id="4-주피터-노트북-사용">4. 주피터 노트북 사용</h2>
<ul>
<li><p>PDF 만드는 법</p>
<ol>
<li>Save as 에서 HTML 로 변환</li>
<li>HTML 켜서 인쇄-PDF로 저장</li>
</ol>
</li>
<li><p>만약 ipynb 너무 길어서 안 열리면 txt로 떠서 빼서 저장하기</p>
<p>  너무 많이 출력하면 그럴 수 있음</p>
</li>
<li><p>안드로이드 뷰어 : ipynb viewer pro (200원)</p>
</li>
</ul>
<hr>
<h3 id="기타--빅데이터-관련-추천">기타 : 빅데이터 관련 추천</h3>
<p>강사님이 봤으면 좋겠다고 추천해 주신 목록들</p>
<ul>
<li><p>Morgan AI로 만든 예고</p>
</li>
<li><p>시사기획 창, 빅데이터 세상을 바꾸다
빅데이터, 비지니스를 바꾸다</p>
</li>
<li><p>스타트업</p>
<p>  마녀(드라마)</p>
</li>
</ul>
<hr>
<p>아 벨로그 어렵네...양식 엉망이다 진짜</p>
<p>공부 후기라기에는 오늘은 개발환경 구축이 메인이었던 느낌이다
역시 제일 어려운 건 설치...</p>
<p>이게 제일 어렵고 제일 귀찮아
그래도 같이 공유해주는 사람이 있으니까 다들 편하게 하실 수 있었던 듯
<del>(부럽)</del></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[잠깐. Velog 폴더 개념이 없어...?]]></title>
            <link>https://velog.io/@blue_cherry/%EC%9E%A0%EA%B9%90.-Velog-%ED%8F%B4%EB%8D%94-%EA%B0%9C%EB%85%90%EC%9D%B4-%EC%97%86%EC%96%B4</link>
            <guid>https://velog.io/@blue_cherry/%EC%9E%A0%EA%B9%90.-Velog-%ED%8F%B4%EB%8D%94-%EA%B0%9C%EB%85%90%EC%9D%B4-%EC%97%86%EC%96%B4</guid>
            <pubDate>Wed, 02 Apr 2025 11:22:49 GMT</pubDate>
            <description><![CDATA[<p>벌써 좀 당황스러워...
일단 알아가는 글쓰기</p>
<blockquote>
<p>보통 공부를 노션에 정리하는 편인데
부트캠프에서 챌린지를 해서 어쩔 수 없이 공유용 블로그? 개설</p>
</blockquote>
<p>글씨체는 바꿀 수 없군요. 고딕이라 봐드리겠습니다.
근데 내가 쓸 때는 0 lI| 개발자들 쓰는 폰트인데
(consolas인지 D2coding인지도 모름...난 개발자가 아닌걸)
오른쪽 view? 에는 다른 글씨네. 어떻게 적용되는 거지</p>
<h1 id="제목">제목</h1>
<h2 id="제목-1">제목</h2>
<h3 id="제목-2">제목</h3>
<h4 id="제목-3">제목</h4>
<h5 id="제목-4">제목</h5>
<h6 id="제목-5">제목</h6>
<p>####### 제목
오 뭐야 다 지원되네???</p>
<ul>
<li>괜찮은데...?
&#39;실험&#39;
&quot;실험&quot;
<code>실험</code>
<code>&quot;&quot;&quot;오오&quot;&quot;&quot;</code></li>
</ul>
<p>일단 노션에서 벨로그로 옮겼을 때 최대한 많이 잘 옮겨지길 바라며...
그러고 보니 색도 없군요. 배경으로 떡칠하면 안 되겠네.
미래의 나를 위해 볼드로 최대한 강조해 보는 걸로</p>
<p>일단 중간 중간 알려주는 임시 저장은 맘에 든다. 개발자의 트라우마를 자극하지 않으려 최선을 다하고 있구나 벨로그.</p>
]]></description>
        </item>
    </channel>
</rss>