Pandas 기본개념에 대해 수업을 한 5주차 첫날 

기본 개념 쉽다고 얕봤다가 뒤에서 호되게 당하기 싫어서 

미리 정리하면서 기억하려고 선수침 ㅎ 

부캠 5주차가 되면 본인만의 루틴이 생기고

공부 습관이 생기나 보다 ! 

# pandas가 안깔려있따 or 세팅을 다시 해야한다 하시는 분들 
%pip install pandas
import pandas as pd
import numpy as np
# 하나의 컬럼으로 구성된 1차원 데이터 셋 

data = [100,200,300,400,500] 

se = pd.Series(data)
type(se)  /// pandas.core.series.Series

 

se.values /// array([100, 200, 300, 400, 500], dtype=int64)

se[0] /// 100

se[0:3] 

'''
0    100
1    200
2    300
dtype: int64
''' 

se.name = 'NUM' 

'''
0    100
1    200
2    300
3    400
4    500
Name: Num, dtype: int64
'''

 

데이터를 끌고오면 해야할 것들 

1. 데이터 찍어보기 

2. .info()

3. .describe()

4. . 컬럼명  = [' 컬럼명' ] / 두개 이상 들고 올때 리스트로 묶어주기 [   [   ' 컬럼명1', ' 컬럼명2 '   ]  ] 

5.  집합함수 aggregation -

 - .mean (numeric_only = True) : 숫자 데이터만 계산해달라고 하는거

- . max(),      , min()

-  sum() 

 

수업때 사용했던 데이터관련해서는 저작권 이슈로 못올려서 

비슷한 데이터 들고와서 비슷하게 질문도 만들어보고 

그렇게 안만드러지면 어떻게든 질문 찾아내기..... 

 

 

이렇게 불러와주고 

 

나름 호기롭게 강사님이 알려주신거에 한발짝 더 나아가고 싶어서 히트맵 그렸다가 당황함

그러면 그 당황스러웠던 히트맵 공개합니다.....

 

상관관계 가득한 것들만 뽑아서 그리는거 까지 배우고 돌아오겠습니다 .... ! 

이렇게 했더니 1시간 45분 걸렸구요....

눈이 뽀사지기 직전이라 그럼 이만 .....ㅎㅎ 

 

 

🔹 크롤링할때 고정적으로 가져가야 하는 코드

from selenium import webdriver

browser = webdriver.Chrome()
keyword = input('찾고자하는 논문 주제를 입력하세요요')

url = f'https://www.dbpia.co.kr/search/topSearch?searchOption=all&query={keyword}'
# 여기에 keyword 넣으면 내가 키워드 입력한 곳으로 감 
url = '' 이렇게 넣어도됨 

browser.get(url)

🔹 헷갈리던 용어 정리 !

구문의미예시
find_element 하나만 찾음 (처음 하나만 반환) browser.find_element(By.CLASS_NAME, 'title')
find_elements 여러 개를 리스트로 반환 browser.find_elements(By.CLASS_NAME, 'title')
.text element 안의 텍스트 추출 title.text
.get_attribute('href') 링크 등 속성 값 추출 a_tag.get_attribute('href')

🔹 “구조 안의 구조” ? 

HTML 문서는 계층적 구조로 되어 있어요.
예를 들어, 하나의 논문(thesisCard) 안에 제목, 저자, 발행일 등 여러 정보가 포함되어 있죠.

 

#1번 강사님 코드 들고옴 
#구조안의 구조
container = browser.find_element(By.ID, ' ')

제목 = container.find_element(By.CLASS_NAME, ' ').text
카테고리 = container.find_element(By.CLASS_NAME, ' ').text

정보컨테이너 = container.find_element(By.CLASS_NAME, ' ')
발행일 = 정보컨테이너.find_elements(By.CLASS_NAME, ' ')[0].text
저자 = 정보컨테이너.find_elements(By.CLASS_NAME, ' ')[1].text
이용수 = 정보컨테이너.find_element(By.CLASS_NAME, ' ').text

링크 = container.find_element(By.CLASS_NAME,' ').get_attribute('href')

제목, 카테고리, 발행일 ,저자, 이용수, 링크

 

여기서 핵심은:

  • 전체를 감싸는 큰 틀이 있음: id="paper-cards-section"
  • 그 안에 논문이 하나씩 묶여 있음: class="thesisCard"
  • 그 안에 제목, 저자, 발행일 등 정보가 있음 

✅ 핵심 요약

구문용도반환값
browser.find_element(...) 단일 요소 WebElement
browser.find_elements(...) 여러 요소 [WebElement, WebElement, ...] (리스트)
element.text 텍스트 내용 추출 문자열 (str)
element.get_attribute('href') 속성 추출 문자열 (str)

 

#페이지 이동하는 코드 
import time
data_list = []
for i in range(1,10):
    url = f'{i}'
    print(url)
    browser.get(url)
    time.sleep(3) 
    
    parent = browser.find_element(By.ID, ' ') # ID는 고유값
    containers = parent.find_elements(By.CLASS_NAME, ' ')
    
    for container in containers:
        try:
            제목 = container.find_element(By.CLASS_NAME, ' ').text
            카테고리 = container.find_element(By.CLASS_NAME, ' ').text
            
            정보컨테이너 = container.find_element(By.CLASS_NAME, ' ')
            발행일 = 정보컨테이너.find_elements(By.CLASS_NAME, ' ')[0].text
            저자 = 정보컨테이너.find_elements(By.CLASS_NAME, ' ')[1].text
            이용수 = 정보컨테이너.find_element(By.CLASS_NAME, ' ').text
            링크 = container.find_element(By.CLASS_NAME, '').get_attribute('href')
        
            data_list.append({
                '제목':제목,
                '카테고리':카테고리,
                '발행일':발행일,
                '저자':저자,
                '이용수':이용수,
                '링크':링크
            })
        except Exception as e:
            print('오류 로그 : ', e)
            pass

 

 

parent는 무엇인가요?

parent = browser.find_element(By.ID, 'paper-cards-section')
  • 이 코드는 HTML 문서에서 id="paper-cards-section"인 요소 하나를 찾아서 parent라는 변수에 저장하는 거예요.
  • 즉, 모든 논문 카드(thesisCard) 들을 감싸고 있는 부모 박스(div) 를 가져오는 거죠.

🧠 전체 흐름 정리

1. 🗂 저장할 빈 리스트 만들기

data_list = []
  • 논문 데이터를 하나씩 딕셔너리로 저장하고, 그 딕셔너리들을 리스트에 모아서 DataFrame으로 만들기 위해 사용해요.

2. 🔁 페이지 반복 (예: 1페이지부터 9페이지까지)

for page in range(1, 10): # 페이지 이동 코드
  • 여러 페이지의 논문을 수집하려고 for page 반복문을 사용해서 페이지 이동을 자동화해요.
  • 이 안에서 매번 새로 parent, containers를 잡고, 그 페이지에서만 데이터를 수집해요.

3. 🧱 부모 컨테이너 가져오기

parent = browser.find_element(By.ID, ' ')
현재 페이지 안에서 **모든 논문 카드(thesisCard)**를 감싸고 있는 박스를 가져와요.
HTML 구조 안에서 이걸 기준으로 검색 범위를 좁힐 수 있어요.
 

4. 📦 논문 카드들 가져오기

containers = parent.find_elements(By.CLASS_NAME, 'thesisCard')
  • parent 내부에 있는 개별 논문 박스를 리스트 형태로 가져와요.
  • 이후 반복문으로 하나씩 접근할 수 있게 돼요.

5. 🔁 각 논문에서 정보 추출

for container in containers:
	try: 
        제목 = ...
        카테고리 = ... 
        정보컨테이너 = ... 
        발행일 = ...
        저자 = ... 
        이용수 = ... 
        링크 = ... 
    
    	data_list.append({...})
    except Exception as e:
    print('오류 로그 :',e )
    pass
  • 각 논문 컨테이너에서 필요한 정보(제목, 카테고리, 발행일, 저자, 이용수, 링크)를 뽑고
  • 하나의 딕셔너리로 만들어 data_list에 추가해요.

5. 📊 최종 결과를 데이터프레임으로

 
import pandas as pd 
df = pd.DataFrame(data_list)
df.to_csv('저장할이름.csv',Encoding='utf-8-sig',index=False)

✅ 요약하면

페이지 반복 → 부모 컨테이너 → 논문 카드들 반복 → 정보 추출 → 리스트에 저장 → 데이터프레임 만들기 -> CSV파일 저장 
이 구조가 스크래핑의 기본적인 골격 ! 

 

 

 

 

 

 

 

 

 

오늘은 여러 가지 데이터를 가지고 데이터 가공부터 전처리, 분석까지 진행해 보았는데요 ! 

공통적으로 시행되는 단계들을 정리해보았어요 

colab환경에서 분석을 해보았습니다 ! 

 

단계 오늘의 데이터 분석 진행 과정 정리 🚀

 

 

  1. 데이터 마운트하기
    • 구글 드라이브나 외부 데이터를 Colab에 연결하여 불러옵니다.
  2. head() 함수로 데이터 살펴보기
    • 데이터의 첫 몇 줄을 확인하여 구조와 내용을 파악합니다.
    • 컬럼별 의미도 함께 확인해 봅니다.
  3. 분석 질문 만들기
    • 데이터를 통해 답하고 싶은 질문을 정리합니다.
  4. 데이터 전처리하기
    • 분석에 사용할 컬럼만 남깁니다.
    • 필요한 경우, 분리된 데이터를 merge() 함수로 합칩니다.
    • 중복된 컬럼이나 행이 있다면 drop() 함수로 정리합니다.
    • 질문에 맞춰 새로운 컬럼을 생성합니다.
    • 데이터 타입을 적절히 변환합니다.
      예) ID는 고유 값이니 문자열(str)로, 날짜 데이터는 pd.to_datetime()을 이용해 날짜 형식으로 변환
    • info() 함수로 데이터 타입이 잘 변환됐는지 확인합니다.
    • 결측치가 있는지 info()나 isnull()로 확인 후, dropna()로 제거합니다.
    • 전처리 후 head() 함수로 최종 데이터 형태를 다시 확인합니다.
    • 3번에 만들었던 질문에서 필요한 데이터가 있다면  기존컬럼들을 이용하여 새로운 컬럼 만들기
    • ex. id와 같은 값은 고유한 값으로 str로 바꿔주기 / date는 날짜 형식이기 때문에 날짜로 바꿔주기 
    •  이때 pandas에서 날짜로 바꿔주는 함수는 to_datetime
    •  데이터 타입 변경할건 변경하기

 

data['release_date'] = pd.to_datetime(data['release_date'], format='%Y-%m-%d') #년-월-일이였으니까 포맷을 맞춰서

 

  • 대신 요로캐 포맷은 맞춰줘야함 
  •  info() 함수를 통해 데이터 타입 잘 변환되었는지 확인하기 
  •  한번더 info()함수를 불러와 결측치 확인하기 
  •  dropna()함수를 통해서 결측치 제거하기 
  • 데이터 가공을 다했으면 head()함수로 전처리 준비가 완료되었는지 확인하기 

5. 분석 및 시각화

  • plotly 라이브러리 등의 시각화 도구로 그래프를 그려 분석 결과를 시각화합니다.
import plotly.express as px /// plotly 불러오는 방법

 

#plotly line data 불러오는 방법 
fig = px.line(data_frame=your_dataframe, x="x_column_name", y="y_column_name")
fig.show() 
///주의할점이 dataframe이 아니라 data_frame 인거 체크하기
# 1. title(영화 제목)별로 revenue(수익)를 그룹화하여 합계를 계산하고, 결과를 데이터프레임 형태로 정리
top = data.groupby('title')['revenue'].sum().reset_index()
/// .sum()이 아니라 mean() 도 가능함

# 2. 수익 기준으로 내림차순 정렬해서 가장 수익이 높은 순서대로 정렬
top = top.sort_values('revenue', ascending=False)

# 3. 상위 10개의 영화만 추출 (흥행 수익 TOP 10)
top = top.head(10)

# 4. Plotly의 bar 차트 생성
fig = px.bar(
    data_frame=top,           # 시각화에 사용할 데이터프레임
    x='title',                # x축에는 영화 제목을 표시
    y='revenue',              # y축에는 영화 수익을 표시
    title="흥행 수익 TOP 10 영화",  # 차트 제목
    color_discrete_sequence=['#C7CEEA']  # 막대 색상 지정 (연보라색 계열)
)

# 5. 그래프 출력 (Jupyter Notebook에서는 자동으로 웹 뷰어가 열림)
fig.show()

 

💡 보너스 팁 
groupby().sum()은 그룹별 합계를 낼 때 자주 쓰이는 대표적인 집계 함수입니다.

reset_index()를 써야 결과가 일반적인 데이터프레임 형태로 바뀌고, 이후 시각화에 쉽게 쓸 수 있어요.

sort_values()로 정렬하면 막대가 높은 순서로 나와서 가독성이 좋아집니다.

color_discrete_sequence는 색을 직접 지정할 수 있는 옵션이며, 리스트 형태로 전달합니다. (색 여러 개 넣으면 범례에 따라 다르게 색칠돼요)

plotly.express는 인터랙티브한 시각화를 손쉽게 만들 수 있어서 matplotlib보다 보기 좋은 결과물이 나오는 경우가 많아요.

 

 

title_dic = {'budget':'예산', 'vote_count':'투표수'}  # 컬럼명을 한글로 매핑한 딕셔너리

# 'budget'(예산), 'vote_count'(투표수)를 기준으로 각각 TOP10 막대그래프를 그릴 거예요
for y in ['budget', 'vote_count']:  
    # 1. 'title' 기준으로 그룹화 후, 해당 컬럼(y)의 합계를 구함
    # 2. 인덱스를 초기화해 데이터프레임 형태로 만들고
    # 3. y 값 기준 내림차순 정렬 후 상위 10개 항목 추출
    top = data.groupby('title')[[y]].sum().reset_index().sort_values(y, ascending=False).head(10)

    # 4. plotly로 막대그래프 생성
    fig = px.bar(
        data_frame=top,              # 그래프에 쓸 데이터프레임
        x='title',                   # x축에는 영화 제목
        y=y,                         # y축에는 현재 반복 중인 항목 (예산 or 투표수)
        title=f"{title_dic[y]} TOP 10 영화",  # 제목은 딕셔너리에서 가져온 한글로 표시
        color_discrete_sequence=['#AFCBFF']   # 막대 색상 지정 (연한 파란색 계열)
    )

    # 5. 그래프 출력
    fig.show()

 

 

top_director =
    data                            # 원본 데이터프레임
    .groupby(['director'])          # 감독(director)별로 그룹을 짓고
    ['revenue'].sum()              # 각 감독의 총 흥행 수익을 합산한 뒤
    .reset_index()                 # 결과를 표 형태로 보기 좋게 인덱스 초기화하고
    .sort_values('revenue', ascending=False)  # 수익 기준으로 내림차순 정렬해서
    .head(10)                      # 상위 10명의 감독만 추출해서

 

 

#plotly에서 boxplot 만드는 방법 
fig = px.box(data_frame = data, y = '', x = 'revenue', hover_name = '')
#data_frame = 데이터 넣고 , y='',x = '' , hover_name='title'
fig.show()

 

#누적막대그래프 
fig = px.bar(data_frame= 하고자하는 데이터, x="", y="", color='main_genre', color_discrete_sequence=px.colors.qualitative.Light24_r)
fig.show()

 

 

pd.pivot_table(data=data.query('조건'), index='', columns=' ', values=' ', aggfunc=sum, fill_value=0, margins=True) 

pd.pivot_table(
    data=data.query('조건'),          # 1. 피벗테이블을 만들 데이터, 조건에 맞는 행만 선택
    index='',                        # 2. 행 인덱스로 사용할 컬럼명 (피벗테이블의 행 기준)
    columns=' ',                     # 3. 열로 펼칠 컬럼명 (피벗테이블의 열 기준)
    values=' ',                     # 4. 집계할 값이 들어있는 컬럼명
    aggfunc=sum,                    # 5. 값을 집계할 함수 (예: sum, mean, count 등)
    fill_value=0,                   # 6. 결측값(NaN)을 0으로 채움
    margins=True                   # 7. 행과 열의 합계(총합)를 추가해줌 (전체 합계)
)

 

위치설명예시

data= 피벗테이블 만들 대상 데이터프레임, 필요한 행만 걸러서 사용 data.query('year==2023')
index= 피벗테이블에서 행 방향 기준이 될 컬럼명 'director', 'region'
columns= 피벗테이블에서 열 방향으로 펼칠 컬럼명 'genre', 'month'
values= 집계하려는 대상 컬럼명 (숫자 데이터) 'revenue', 'sales'
aggfunc= 집계함수, 값을 어떻게 요약할지 정함 sum, mean, count
fill_value= 집계 결과에 결측값이 있을 때 대신 채워줄 값 0 (결측값을 0으로 처리)
margins= 행과 열의 합계(총합)를 포함할지 여부 (True/False) True

 

 

#분석에 사용할 컬럼들 불러오고 .corr() 하면 상관관계가 분석됨
data[['col1','col2','col3','col4']].corr()

 

#상관분석 결과를 시각화한 히트맵
fig = px.imshow(data[['col1','col2','col3','col4']].corr(), text_auto='.2f', color_continuous_scale='Purp')
fig.show()
# text_auto='.2f 소수점 둘째자리까지
#대각선은 자기자신과의 상관관계로 1로 나오는거임

 

 

#trendline이 포함된 scatterplot 
for x in ['col1', 'col2', 'col3']:  # 1. col1, col2, col3 각각을 x축 변수로 사용해서 반복
    fig = px.scatter(               # 2. 산점도 그래프 생성
        data_frame=data,            # 3. 그래프에 사용할 데이터프레임 지정
        x=x,                       # 4. x축 값으로 현재 반복 중인 col1, col2, col3 중 하나
        y='col4',                  # 5. y축 값은 col4
        hover_name='title',        # 6. 점 위에 마우스 올리면 title 컬럼 값이 보임
        size='col4',               # 7. 점 크기를 col4 값에 비례해서 조절
        color='revenue',           # 8. 점 색깔을 revenue 값에 따라 다르게 표현
        color_continuous_scale=px.colors.sequential.Sunsetdark,  # 9. 점 색깔은 어두운 선셋 색상 그라데이션
        width=700,                 # 10. 그래프 가로 크기 700 픽셀
        height=600,                # 11. 그래프 세로 크기 600 픽셀
        trendline='ols'            # 12. x, y 데이터에 대해 선형 회귀 추세선을 그림
    )
    fig.show()                     # 13. 그래프 화면에 표시

 

 

#bubble chart 
data = data.sort_values('col1', ascending=False).head( )
# 'col1' 기준으로 내림차순 정렬 후 상위 일부 행만 선택 (head() 안에 숫자 넣으면 그 개수만큼 가져옴

fig = px.scatter(
    data_frame=data,                  # 2. 그래프에 사용할 데이터프레임 지정
    x=' ',                           # 3. x축에 사용할 컬럼명 (여기에 실제 컬럼명 넣어야 함)
    y=' ',                           # 4. y축에 사용할 컬럼명 (여기에 실제 컬럼명 넣어야 함)
    hover_name='title',              # 5. 마우스 올리면 영화 제목(title) 보여줌
    size='col1',                  # 6. 버블 크기는 'col1' 값에 비례
    color='main_genre',              # 7. 버블 색상은 'main_genre'별로 구분
    color_discrete_sequence=px.colors.qualitative.Light24,  # 8. 색상 팔레트는 Light24로 지정
    width=700,                      # 9. 그래프 가로 크기 700픽셀
    height=600                      # 10. 그래프 세로 크기 600픽셀
)

fig.show()

 

 

 


🎨 그래프 색상 정리

top = data.groupby('title')['revenue'].sum().reset_index().sort_values('revenue', ascending=False).head(10)
fig = px.bar(
    data_frame=top,
    x='title',
    y='revenue',
    title="흥행 수익 TOP 10 영화",
    color_discrete_sequence=['#C7CEEA']  # 막대 색상
)

# 배경색 설정은 따로!
fig.update_layout(
    paper_bgcolor='white',      # 전체 배경
    plot_bgcolor='white',       # 그래프 영역 배경
    yaxis=dict(
        showgrid=True,
        gridcolor='lightgray'
    )
)

fig.show()


#그 외의 취향이던 막대 색상
# pastel = ['#FFB5E8', '#FF9CEE', '#B28DFF', '#DCD3FF', '#AFCBFF', '#B5EAD7', '#C7CEEA']

 

✨  복습하면서 헷갈리던 것들 

 

 

✅ 정리:

title_dic = {'budget':'예산', 'vote_count':'투표수'

딕셔너리를 쓴 이유

이유설명
보기 좋은 한글 제목으로 바꾸기 위해 plotly title에 사용할 때 직관적 제목을 만들 수 있음
반복문에서 조건별 처리할 때 유용 y 값에 따라 title을 자동으로 다르게 생성 가능
향후 컬럼이 늘어나도 확장성 확보 딕셔너리만 추가하면 코드 전체 수정 없이 반복 가능

🔍 왜 title_dic = {'budget': '예산', 'vote_count': '투표수'}처럼 딕셔너리로 묶었을까?

1. 반복문에서 컬럼명을 바꿔서 출력하기 위함

  • for y in ['budget', 'vote_count']: 이렇게 반복하면서
  • 그래프 title에 한글 제목을 넣고 싶잖아요?

그래서 아래처럼 쓸 수 있게 만든 거예요:

title=f"{title_dic[y]} TOP 10 영화"
# y가 'budget'이면 → "예산 TOP 10 영화"
# y가 'vote_count'면 → "투표수 TOP 10 영화"

✅ groupby()는 언제 사용하나요?

groupby()는 데이터를 특정 기준(컬럼 값)에 따라 묶고, 묶인 각 그룹에 대해 합계, 평균, 개수 등의 집계(aggregation) 연산을 하고 싶을 때 사용합니다.

 

✅ 요약

함수역할
groupby() 특정 기준으로 그룹 묶기 + 집계 연산
reset_index() 그룹 결과의 인덱스를 일반 컬럼으로 변환해서 보기 좋게 만들기

 

///Q : dropna()함수로 결측치 제거하는데 inplace=True는 왜 사용해? 이게 무슨의미야? 
data.dropna(inplace=True)
///✅ inplace=True의 의미
///"결측치를 제거한 결과를 원본 데이터프레임 data에 바로 반영해줘!" 라는 뜻입니다.

✅ inplace=True의 장단점

🔹 장점

  1. 메모리 효율성
    • 새로운 복사본을 만들지 않아서 메모리 사용량이 적어요.
    • 특히 데이터가 매우 클 때 유리해요.
  2. 코드 간결
    • 별도의 변수 없이 한 줄로 처리할 수 있어서 깔끔해 보여요.

🔸 단점

  1. 원본 데이터가 바뀜
    • 한 번 바뀌면 되돌리기 어렵거나 불가능해요 (undo 불가).
    • 실수로 중요한 데이터를 날릴 위험이 있음.
  2. 코드의 가독성과 추적성 감소
    • df = df.dropna()처럼 할당하는 방식은 변화를 명확하게 보여줌.
    • inplace=True는 묵시적으로 변경되므로 디버깅이나 추적이 어려울 수 있어요.
  3. 일부 함수에서는 inplace 옵션이 없어졌거나 사라질 예정
    • 최신 판다스 버전에서는 inplace=True가 비추천(deprecated) 되는 방향으로 가고 있어요.

🚀 처음 보는 함수 정리

ast.literal_eval()은 문자열(String)을 실제 파이썬 객체처럼 안전하게 변환해주는 함수예요.
보통 문자열로 저장된 리스트나 딕셔너리 등을 진짜 리스트나 딕셔너리 객체로 바꿀 때 사용합니다.

import ast

result = ast.literal_eval('[1, 2, 3]')
print(result)        # [1, 2, 3]
print(type(result))  # <class 'list'>

📌 언제 쓰나?

  • CSV, Excel, JSON 등에서 "[1, 2, 3]", "{'a': 1}" 같은 문자열 형태의 자료구조가 저장되어 있을 때,
  • eval() 대신 안전하게 문자열을 파싱하고 싶을 때 사용합니다
ast.literal_eval("{'name': 'Alice', 'age': 25}")
# => {'name': 'Alice', 'age': 25}

ast.literal_eval("('x', 1, True)")
# => ('x', 1, True)

첫 파이썬 강의는 2년 전.

편입하고 나서 문득, "혹시 내가 선생님이 하고 싶었던 게 아니라, 단순히 경험이 부족했던 건 아닐까?" 라는 물음표를 스스로에게 던졌던 날이 있었어요.

우리과와 복수전공을 가장 많이 하는 세 학과의 공통점을 찾아보니, 다들 컴퓨터공학 관련 분야더라고요.

그런데 우리 학교는 컴공으로 뭉뚱그려 있지 않고,
정보보안 / 소프트웨어공학 / 데이터사이언스 세 학과로 나뉘어져 있어서…

현실적인 고민 끝에, 정보보안과 소공은 도저히 엄두가 안 났고 😅

결국 DS학과에서 들을 수 있는 수업 2개를 수강해본 뒤,
바로 다가오는 방학에 컴퓨터 학원 등록!

그날, 처음으로 파이썬을 배웠어요 🐍

그때는 정말 "이게 뭔가?" 싶었는데,
지금은 그래도 제어문이 무섭진 않은 단계까지 왔습니다...! (자유자재로 쓴다고는 아직 못해요 ㅎ)

But!
곧 자유자재로 핸들링할 날이 머지 않았으니

👉 앞으로의 성장기, 많은 관심 부탁드립니다 💻❤️


1. 조건문 (if)

특정 조건을 검사하여 그 조건에 따라 다른 코드를 실행하도록 하는 구문

if, elif, else 키워드를 사용하여 조건문을 작성

프로그램의 흐름을 제어 

 

1. 기본 구조

if 조건:
    실행할 코드
elif 조건:
    실행할 코드
else:
    실행할 코드

2. 작동 원리

  • if: 조건이 참이면 해당 블록 실행.
  • elif: 위 조건이 모두 거짓일 때 새로운 조건을 검사.
  • else: 모든 조건이 거짓일 때 실행.

(2) 조건문 예제

1. 기본 사용법

x = 10

if x > 5:
    print("x는 5보다 큽니다.")  # 출력됨
elif x == 5:
    print("x는 5입니다.")
else:
    print("x는 5보다 작습니다.") // x는 5보다 큽니다.

 

2. 중첩 조건문

#RuleBase라고 함 
x = 13

if x > 10:
    if x % 2 == 0: ## 나머지가 0인거 = 짝수인지 확인하려고 
        print("x는 10보다 크고 짝수입니다.")
    else:
        print("x는 10보다 크고 홀수입니다.")
else:
    print("x는 10 이하입니다.") // x는 10보다 크고 홀수입니다.

 

3. 조건문

age = 26
is_student = False

if age < 18 or is_student:
    print("할인이 적용됩니다.")  # 출력됨
else:
    print("할인이 적용되지 않습니다.") //할인이 적용되지 않습니다.

 

(3) 조건문과 자주 사용되는 함수

1. input()

사용자로부터 입력을 받아 조건을 검사할 때 자주 사용됩니다.

 

age = int(input("나이를 입력하세요: "))

if age >= 18:
    print("성인입니다.")
else:
    print("미성년자입니다.")

 

2. len()

문자열이나 리스트의 길이(크)를 조건으로 사용할 수 있습니다.

#다른 예. 리뷰가 50글자 이상인것만 
password = "abc12345"

if len(password) >= 6:
    print("비밀번호가 유효합니다.")
else:
    print("비밀번호는 최소 6자 이상이어야 합니다.")

 

 


(4) 비교연산자

조건문에 값을 비교할 때 사용

표현파이썬 코드

a와 b가 같다 a == b
a와 b가 같지 않다 a != b
a가 b보다 작다 a < b
a가 b보다 작거나 같다 a <= b
a가 b보다 크다 a > b
a가 b보다 크거나 같다 a >= b

 

 

a = 1
b = 3

print(a == b)  # False
print(a != b)  # True

print(a < b)   # True
print(a <= b)  # True

print(a > b)   # False
print(a >= b)  # False

 

(5) and, or 연산자

만약에 조건이 2가지 이상인 경우에는?

money = 50000
bus = False #비행기표가 없는거임 

# if money >= 50000 and bus:
#     print("비행기를 타세요.")
# elif money >= 100000 or bus:
#     print("고속버스를 타세요.")


if money>= 50000:
    if bus == True:
        print('고속버스를 타세요')
    elif bus == False:
        print('기차를 타세요')
else:
    print("걸어가세요")

 

2. 반복문 (for, while)

: 반복되는 행위를 할 때 사용

# 단 두 줄로 해결이 가능
for i in range(10):
    print("meanji is 9월 취뽀", i) 
 
 
 '''
meanji is 9월 취뽀 0
meanji is 9월 취뽀 1
meanji is 9월 취뽀 2
meanji is 9월 취뽀 3
meanji is 9월 취뽀 4
meanji is 9월 취뽀 5
meanji is 9월 취뽀 6
meanji is 9월 취뽀 7
meanji is 9월 취뽀 8
meanji is 9월 취뽀 9
'''

-> 이런 예 사용하면 되게 자기애 강해보이는데  저는 말하는 힘을 믿어요 ✨ 

for문의 기본 형태

for 변수 in 리스트(또는 튜플, 문자열):
    실행할 문장1

 

(1) for 반복문

for 반복문은 시퀀스(리스트, 문자열, 튜플 등)의 각 요소를 순차적으로 가져와 작업을 수행합니다.

for 변수 in 시퀀스:
    실행할 코드

 

리스트

fruits = ["apple", "banana", "cherry"]

for fruit in fruits:
    print(fruit)
    
    if fruit  == 'banana':
        print('원숭이')
        
'''
apple
banana
원숭이
cherry
'''

 

range()

for i in range(5): # 숫자(0부터 5미만)
    print(i)

# for i in range() 이거를 기계적으로 외워자자 
''' 
0
1
2
3
4
'''

 

문자열

text = "meanji 취뽀 9월"
for char in text:
    print(char) 
    
''' 
m
e
a
n
j
i
 
취
뽀
 
9
월

'''

 

(2) while 반복문

  • while 문은 조건이 참(True)인 동안 코드를 반복 실행합니다.
  • while 조건: 실행할 코드
num = 0
while num < 5:
#while True:
    #print('실행') # 무한루프에 빠지게 됨 why? 항상 참이니까 

    num = num + 1 
    print('num 값: ', num) #num가 5가 되는 순간 멈춤 
#while문을 사용할때 조건의 관리가 꼭 필요함 

''' 
num 값:  1
num 값:  2
num 값:  3
num 값:  4
num 값:  5
'''

 

num = 0
while num < 5:
#while True:
    #print('실행') # 무한루프에 빠지게 됨 why? 항상 참이니까 
    print('num 값: ', num) 
    num = num + 1 
#이렇게 순서를 바꾸면 01234가 됨  
'''
num 값:  0
num 값:  1
num 값:  2
num 값:  3
num 값:  4
''' 

for i in range(5):
    print(i) 

#이게 바로 위에 코드와 같음 
'''
0
1
2
3
4
'''

 

count = 10
while count < 3: 
    print('이코드는 실행되지 않습니다.') # 아예 실행되지 않음

 

(3) 반복문에서 자주 사용되는 키워드

1. break

  • break는 반복문을 즉시 종료합니다.
for i in range(5):
    if i == 3:
        break # 멈춰서 4가 표현이 안되고 
    print(i)
    
    
'''
0
1
2
'''

 

 

for i in range(5):
    if i == 3:
        continue # i=3을 만났을때 여기서 멈춰라는 뜻으로 3에서 넘어가니까 4로 표현되는거임 
    print(i) 
    
''' 
0
1
2
4
'''

 

2. continue

  • continue는 현재 반복을 건너뛰고, 다음 반복으로 넘어갑니다. 
for i in range(6):
    if i == 3:
        continue
    print(i)
    
''' 
0
1
2
4
5
'''

3. pass

  • pass는 아무 작업도 하지 않고 반복문을 유지합니다.
for i in range(5):
    if i == 3:
        pass # todo: 여기서부터
    print(i) 
    
''' 
0
1
2
3
4
'''

 

(4) 반복문에서 자주 사용되는 함수

1. range(start, stop, step)

  • 숫자 범위를 생성하며, 시작값(start), 끝값(stop), 증가값(step)을 지정할 수 있습니다.
for i in range(1, 10, 2):
    print(i)
''' 
1
3
5
7
9
'''

 

2. enumerate() - 열거하다, 나열하다

  • 리스트나 문자열을 순회하며 인덱스와 값을 동시에 가져옵니다.
fruits = ["apple", "banana", "cherry"]

for fruit in fruits:
    print(fruit)
    
 ''' 
 apple
banana
cherry
'''

# 이방식도 많이 사용함 기억해두기 
fruits = ["apple", "banana", "cherry"]

for index, fruit in enumerate(fruits): # 몇번째에 들어있는 데이터인지 확인가능함
    print(index, fruit)
    
'''
0 apple
1 banana
2 cherry
'''

 

3. zip()

  • 여러 시퀀스를 동시에 순회합니다. 

 

names = ["meanji", "Zoa", "쩡유"]
ages = [26, 25, 27]

for name, age in zip(names, ages):
    print(f"{name} is {age} years old.")
 
 ''' 
 meanji is 26 years old.
Zoa is 25 years old.
쩡유 is 27 years old.
'''

 

 


4. reversed()

  • 리스트나 문자열을 역순으로 순회합니다. 
  •  
for char in reversed([1,100,3,80,5]): #순서를 보장하는 것이 아님, 단순히 뒤집어주는거임
    print(char)
    
''' 
5
80
3
100
1
''' 

for char in sorted (reversed([1,100,3,80,5])): #순서를 보장하는 것이 아님, 단순히 뒤집어주는거임
    print(char)
    
''' 
1
3
5
80
100
''' 
for char in [1,2,3,4,5][::-1]: #reversed 와 동일한거임 
    print(char)

''' 
5
4
3
2
1
'''

 

# 강사님 Divide and Conquer
# 1. 1부터 20까지 나타내자
# 2. 조건을 통해 짝수만 걸러내자 

for i in range(1,21):
    if i % 2 == 0: 
        print('짝수 : ', i ) 

=> 수업 때 강사님이 알려주신 Divide and Conquer!
며칠 전 정처기 필기 공부할 때도 나왔던 개념이라 두 흐름이 딱 맞아떨어지는 순간, 소소한 재미 포인트임  ♠

 

 

 

파이썬 리스트형 자료형

1. 리스트형 소개

리스트는 여러 개의 데이터를 하나의 변수에 저장할 수 있는 자료형입니다.

**대괄호[ ]**를 사용하여 생성하며, 서로 다른 자료형도 저장할 수 있습니다.

 

# 빈 리스트 생성
empty_list = []

# 값이 있는 리스트 생성
fruits = ["apple", "banana", "cherry"]
numbers = [1, 2, 3, 4, 5]
mixed = [1, "apple", 3.14, [2, 4, 6], {}]

print(fruits)   # ['apple', 'banana', 'cherry']
print(numbers)  # [1, 2, 3, 4, 5]
print(mixed)    # [1, 'apple', 3.14, [2, 4, 6]]

(2) 리스트 인덱싱과 슬라이싱

  • 인덱싱: 특정 위치의 값을 가져옴 (0부터 시작).
  • 슬라이싱: 리스트의 일부를 잘라냄.
# 리스트 인덱싱
fruits = ["apple", "banana", "cherry", "mango"]
print(fruits[0])  # apple
print(fruits[-1]) # mango (뒤에서 첫 번째)
data = [0,1,2,3,4,5]

data[0:3] # 0<= data < 3

 

(3) 리스트의 주요 메서드

값 추가

  • append(value): 리스트의 끝에 값을 추가합니다.
  • insert(index, value): 특정 위치에 값을 삽입합니다.
# append 예제
fruits = ["apple", "banana"]
fruits.append("cherry")
fruits.append("방토마토")
print(fruits)  # ['apple', 'banana', 'cherry', '방토마토']

# insert 예제 - 특정한 위치에 값을 넣고 싶을 때
fruits.insert(1, "orange")
print(fruits)  # ['apple', 'orange', 'banana', 'cherry']
fruits.insert(0, "스토로베리") #0번째 즉, 제일 첫번째에 스트로베리를 넣어라 
print(fruits)
//['스토로베리', 'orange', 'apple', 'orange', 'banana', 'cherry', '방토마토']
//['스토로베리', '스토로베리', 'orange', 'apple', 'orange', 'banana', 'cherry', '방토마토']

 

 


값 제거

  • remove(value): 지정된 값을 제거합니다.
  • pop(index): 지정된 인덱스의 값을 제거하고 반환합니다. (인덱스를 생략하면 마지막 값을 제거)
  • clear(): 리스트의 모든 값을 제거합니다.
# remove 예제
fruits = ["apple", "banana", "cherry", "mango"]
fruits.remove("banana")
print(fruits)  # ['apple', 'cherry', 'mango']

 

# pop 예제
last_fruit = fruits.pop() # 뽑
print(f'pop()를 통해서 뽑아낸 값 : {last_fruit}')

print(fruits) 
// pop()를 통해서 뽑아낸 값 : apple
//[]

 

값 검색

  • index(value): 특정 값의 인덱스를 반환합니다.
  • count(value): 특정 값이 리스트에 몇 번 등장하는지 반환합니다.
fruits = ["apple", "banana", "cherry", "apple"]

# index 예제
print(fruits.index("apple"))  # 0 (첫 번째 'apple'의 위치)

# count 예제
print(fruits.count("apple"))  # 2

 

리스트 정렬

  • sort(): 리스트를 오름차순으로 정렬 (기본값).
  • reverse(): 리스트를 뒤집음.
numbers = [3, 1, 4, 2]

# sort 예제
numbers.sort()
print(numbers)  # [1, 2, 3, 4]

# reverse 예제
numbers.reverse()
print(numbers)  # [4, 3, 2, 1]

 

리스트 복사

  • copy(): 리스트를 복사합니다.
  • 리스트 데이터 타입은 복사를 할 때 메모리도 함께 복사됩니다.

-> 여기서 사담을 조금 해보자면 제가 BDA 학회할때도 강사님이 원본 데이터를 그대로 사용하면 나중에 잘못해서 복구하려고 하면 사고다라면서 무조건 데이터를 복사해서 사용하라는 말을 자주들었었는데 복사는 copy() 기억하기 

 

data = [1, 2, 3]

new_data = data
new_data.append(4) 
#new data에 4를 추가헀는데 data도 왜 4가 추가냐냐
# 리스트 타입은 메모리도 함게 복사가 되기 때문에 .copy()함수를 쓰는거임 
print(new_data, data) 
// [1, 2, 3, 4] [1, 2, 3, 4]

 

data = [1, 2, 3]
new_data = data.copy()

new_data.append(4)

print(data)  # [1, 2, 3]
print(new_data)    # [1, 2, 3, 4]

# 얕은 복사
# 깊은 복사 ...

 

4. 딕셔너리형 (Dict)

Dict → 사전

  • { 단어 : 뜻 }의 형태

중괄호 안에 키(key)와 벨류(value)로 구성되어 있는 형태

데이터의 빠른 검색, 추가, 삭제를 지원

{Key1:Value1, Key2:Value2, Key3:Value3, ...}

 

(1) 딕셔너리의 주요 특징

  1. 키-값 쌍으로 구성:
    • 데이터는 고유한 키와 값의 쌍으로 저장됩니다.
    • 예: {"name": "Alice", "age": 25}
  2. 키는 고유:
    • 키는 중복될 수 없습니다.
  3. 변경 가능 (Mutable):
    • 딕셔너리는 생성 후 수정, 추가, 삭제가 가능합니다.

(2) 딕셔너리 생성 및 기본 사용법

딕셔너리 생성

# 빈 딕셔너리 생성
empty_dict = {}

type(empty_dict) //dict 

# 값이 있는 딕셔너리 생성
person = {"name": "Alice", "age": 25, "city": "New York"}

print(person)  # {'name': 'Alice', 'age': 25, 'city': 'New York'}

 

⚠️ 주의! 파이썬에서 딕셔너리는 {} 중괄호로 감싸야 해요! 

 

딕셔너리 키로 값 접근 

person = {"name": "meanji", "age": 26, "city": "Seoul"}

# 키로 값 가져오기
print(person["name"])  #key값을 물어보면 value값을 가져옴 
print(person["age"])   

person['Seoul'] = 'Busan'
person['job'] = 'homeprotector'
person

//meanji
//26
//{'name': 'meanji',
// 'age': 26,
//'city': 'Seoul',
//'Seoul': 'Busan',
//'job': 'homeprotector'}

 

딕셔너리 값 추가 및 수정

#값 추가
person = {"name": "Alice", "age": 25}

# 값 추가
person["city"] = "New York"
print(person)  # {'name': 'Alice', 'age': 25, 'city': 'New York'}

# 값 수정
person["age"] = 33
print(person)  # {'name': 'Alice', 'age': 33, 'city': 'New York'}

 

 

딕셔너리 값 삭제

person = {"name": "Alice", "age": 25, "city": "New York"}

# 특정 키 삭제 (del: 예약어) 
del person["city"]
print(person)  # {'name': 'Alice', 'age': 25}

# 모든 키-값 삭제
person.clear() #기존에 있던 data는 다 날아가고 빈 딕셔너리가 출력됨 
print(person)  # {}

 

# Q. content에 들어있는 메세지 내용을 추출해주세요. 

# openai API response 예시
data = {
  "id": "chatcmpl-abc123",
  "object": "chat.completion",
  "created": 1677858242,
  "model": "gpt-4-1106-preview",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "안녕하세요! 무엇을 도와드릴까요?"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 10,
    "completion_tokens": 10,
    "total_tokens": 20
  }
}

 

# Q. content에 들어있는 메세지 내용을 추출해주세요.
data
print(data['choices']) #맨마지막에 대괄호가 있는걸 보니 choices는 리스트인거임 
print(data['choices'][0]) # 이렇게하면 맨 마지막에 대괄호가 빠져 나오면서 딕셔너리가 됨 
print(data['choices'][0]['message'])
print(data['choices'][0]['message']['content'])

'''
[{'index': 0, 'message': {'role': 'assistant', 'content': '안녕하세요! 무엇을 도와드릴까요?'}, 'finish_reason': 'stop'}]
{'index': 0, 'message': {'role': 'assistant', 'content': '안녕하세요! 무엇을 도와드릴까요?'}, 'finish_reason': 'stop'}
{'role': 'assistant', 'content': '안녕하세요! 무엇을 도와드릴까요?'}
안녕하세요! 무엇을 도와드릴까요?
'''

 

(3) 딕셔너리의 주요 메서드

1. keys(), values(), items()

person = {"name": "Alice", "age": 25, "city": "New York"}

print(person.keys())   # dict_keys(['name', 'age', 'city']) # 키값만 모다주는거

print(person.values()) # dict_values(['Alice', 25, 'New York']) #value 값만 모다주는거 

print(person.items())  # 키와 값이 함께 들어오는거


2. get()

  • 예외처리가 적용된 함수
person = {"name": "Alice", "age": 25}
person['city'] //KeyError  

print(person.get("city", "값없음")) //값없음

 

3. update()

person = {"name": "Alice", "age": 25}
person.update({"city": "New York", "age": 26})

print(person)  # {'name': 'Alice', 'age': 26, 'city': 'New York'}

 

4. pop()

person = {"name": "Alice", "age": 25}
age = person.pop("age") 

print(age)     # 25
print(person)  # {'name': 'Alice'}

 

 

문제 8: 아래의 dict 데이터 중에서 youtube 주소를 불러오세요.
data = {
  "id": "COURSE001",
  "title": "Python for Beginners",
  "category": ["Programming", "Python", "Beginner"],
  "instructor": [{
    "id": "INSTR001",
    "name": "Jane Kim",
    "email": "jane.kim@devedu.com",
    "profile": {
      "bio": "10년 경력의 파이썬 전문 강사",
      "social": [{
        "youtube": "https://www.youtube.com/@AI%EC%95%8C%EB%A0%A4%EC%A3%BC%EB%8A%94%EB%82%A8%EC%9E%90-%EB%8D%B0%EB%B8%8C%EB%82%A8",
        "linkedin": "https://linkedin.com/in/janekim"
      }]
    }
  }]
}

 

data = {
  "id": "COURSE001",
  "title": "Python for Beginners",
  "category": ["Programming", "Python", "Beginner"],
  "instructor": [{
    "id": "INSTR001",
    "name": "Jane Kim",
    "email": "jane.kim@devedu.com",
    "profile": {
      "bio": "10년 경력의 파이썬 전문 강사",
      "social": [{
        "youtube": "https://www.youtube.com/@AI%EC%95%8C%EB%A0%A4%EC%A3%BC%EB%8A%94%EB%82%A8%EC%9E%90-%EB%8D%B0%EB%B8%8C%EB%82%A8",
        "linkedin": "https://linkedin.com/in/janekim"
          }]
    }
  }]
}

/// data['instructor'][0]['profile']['social'][0]['youtube'] 
/// 'https://www.youtube.com/@AI%EC%95%8C%EB%A0%A4%EC%A3%BC%EB%8A%94%EB%82%A8%EC%9E%90-%EB%8D%B0%EB%B8%8C%EB%82%A8'

 

 

5. 튜플형 (Tuple)

불변(Immutable) 데이터 타입으로, 여러 값을 순서대로 저장할 수 있는 자료 구조

리스트형[ ]과 거의 비슷하고, () 괄호로 생성.

리스트와 비슷하지만 생성 후 수정, 추가, 삭제가 불가능합니다.

t = ()
t = ("a", "b", "c", "d", "e")
t = ("Hello", "Python")
t = (1, 2, 3, ("a", "b"))

 

(1) 튜플의 주요 특징

  1. 순서 유지 (Ordered):
    • 튜플은 저장된 순서를 유지하며, 인덱스를 통해 각 요소에 접근할 수 있습니다.
  2. 불변 (Immutable):
    • 튜플의 요소는 한 번 생성되면 변경할 수 없습니다.
  3. 중복 허용:
    • 동일한 값을 여러 번 포함할 수 있습니다.
  4. 다양한 자료형 저장 가능:
    • 숫자, 문자열, 리스트 등 다양한 자료형을 저장할 수 있습니다.


(2) 튜플 생성 및 기본 사용법

튜플 생성

# 빈 튜플 생성
empty_tuple = ()

# 값이 있는 튜플 생성
fruits = ("apple", "banana", "cherry")
numbers = (1, 2, 3, 4, 5)
mixed = (1, "hello", 3.14, [2, 4, 6], {"key":"value"})

print(fruits)   # ('apple', 'banana', 'cherry')
print(numbers)  # (1, 2, 3, 4, 5)
print(mixed)    # (1, 'hello', 3.14, [2, 4, 6])

 


튜플 인덱싱과 슬라이싱

fruits = ("apple", "banana", "cherry", "date")

# 인덱싱
print(fruits[0])   # apple
print(fruits[-1])  # date

# 슬라이싱
print(fruits[1:3])  # ('banana', 'cherry')
print(fruits[:2])   # ('apple', 'banana')
print(fruits[::-1]) # ('date', 'cherry', 'banana', 'apple')

 

튜플은 불변

튜플은 불변이므로 수정, 추가, 삭제가 불가능합니다. => 중요한 데이터를 보호하기 위해 이런 기능이 만들어진거임

 

fruits = ("apple", "banana", "cherry")
# fruits[0] = "orange"  # TypeError: 'tuple' object does not support item assignment

튜플 요소 반복

튜플의 요소를 순회하면서 작업할 수 있습니다.

fruits = ("apple", "banana", "cherry")

for fruit in fruits:
    print(fruit)

 

(3) 튜플의 주요 메서드

1. count()

  • 특정 값이 튜플에 몇 번 등장하는지 반환합니다.
numbers = (1, 2, 3, 2, 4, 2)
print(numbers.count(2))  # 3

 

 


2. index()

  • 특정 값의 첫 번째 위치(인덱스)를 반환합니다.
numbers = (1, 2, 3, 2, 4, 2)
print(numbers.index(2))  # 1


3. 튜플 언패킹 (unpacking)

튜플의 요소를 여러 변수에 할당할 수 있습니다.

 

person = ("Alice", 25, "New York")
name, age, city = person # ("Alice", 25, "New York")

print(name)  # Alice
print(age)   # 25
print(city)  # New York

 

 

4. 튜플 결합과 반복

튜플은 결합하거나 반복할 수 있습니다.

# 튜플 결합
tuple1 = (1, 2, 3)
tuple2 = (4, 5, 6)
combined = tuple1 + tuple2
print(combined)  # (1, 2, 3, 4, 5, 6)

# 튜플 반복
repeated = tuple1 * 3
print(repeated)  # (1, 2, 3, 1, 2, 3, 1, 2, 3)

 

 

📌 자료형 구분! 헷갈리지 말자!

🔹 리스트는 [] 대괄호

➡️ 순서가 있고, 값 변경 가능 (mutable)
➡️ 여러 자료를 한 줄에 묶어 처리할 때 자주 사용!

⚠️ 저번 포스팅에서 배운 리스트 기억나죠? 대괄호 꼭 기억하기!

🔸 **딕셔너리(Dictionary)**는 {} 중괄호

➡️ Key: Value 쌍으로 구성
➡️ 값에 빠르게 접근하고 싶을 때 유용!

⚠️ 이번 포스팅 포인트!
딕셔너리는 중괄호 {}로 감싸고, **key와 value는 콜론 :**으로 연결해요! 

🔹  **튜플(Tuple)**은 () 소괄호

➡️ 순서가 있고, 값 변경 불가 (immutable)
➡️ 변하지 않는 데이터를 묶어서 관리할 때 사용!

⚠️ 리스트와 헷갈리지 않게 주의!
튜플은 소괄호 (), 수정할 수 없다는 점 꼭 기억하기!

안녕하세요! @mean_so 입니다 😊

바로 전주에 패스트캠퍼스 BDA 19기 파이썬 강의가 개강했어요!

뭐랄까… 커피도 아메리카노를 잘하는 집이 다른 음료도 맛있듯,
코딩도 기초를 잘 다져야 다른 분야도 수월하게 배울 수 있다고 생각하거든요.

그래서 이번 강의처럼 기초부터 다시 배울 수 있는 시간이
정말 기대되었답니다 

그럼 바로 오늘의 정리, 시작해볼게요!

 

1. 숫자형 (Number) 
파이썬에서 숫자형(Number) 데이터 타입은 숫자 데이터를 표현하기 위해 사용됩니다.

주요 타입은 다음과 같습니다:

- 정수 (int): 소수점 없는 숫자
- 실수 (float): 소수점을 포함한 숫자

1+'1' # 앞에는 숫자고 뒤에는 문자이기 때문에 오류가 나는거임 
# data type을 철저하게 구분하자

 

 

(1) 정수형 (Integer, int)

정수형은 소수점이 없는 숫자를 저장합니다. 양수, 음수, 0 모두 가능합니다.

특징

  • 크기의 제한 없음 (메모리가 허용하는 한 큰 수 표현 가능)
  • 일반적인 수학 연산 가능
# 사칙 연산이 가능

a = 3
b = 5

print(a + b)  # 5
print(a - 2)  # 1
print(a * 2)  # 6
print(a / 3)  # 1

# 셀 실행: Shift + Enter
# 또는 왼쪽 위의 세모버튼 클릭

 

(2) 실수형 (Float)

실수형은 소수점을 포함한 숫자를 표현합니다.

특징

  • 소수점 아래를 표현
  • 정수와의 연산도 지원
x = 3.14
y = -0.99

x + y # <class 'float'>

 

 

(3) 숫자형 간 변환

숫자형 데이터 타입은 서로 변환 가능합니다.

# 실수를 정수로 변환
c = 3.14
d = int(c)
print(d)  # 3 (소수점 아래가 버려짐)

d
float(d) # 이 d를 다시 실수형태로 변환하면 3.0으로 나옴

 


(4) 숫자형 연산

파이썬은 다양한 연산자를 통해 숫자 데이터를 다룰 수 있습니다.

연산자설명예시결과

 

+ 더하기 5 + 3 8
- 빼기 5 - 3 2
* 곱하기 5 * 3 15
/ 나누기 5 / 2 2.5
// 5 // 2 2
% 나머지 5 % 2 1
** 제곱 2 ** 3 8(2^3)

 

# 기본 연산
x = 10
y = 3

print(x + y)   # 13
print(x - y)   # 7
print(x * y)   # 30
print(x / y)   # 3.333..

# 몫과 나머지
print(x // y)  # 3 (몫)
print(x % y)   # 1 (나머지) 

print(2 ** 3)  # 8

 

 

# 저희 19기가 수업시간에 자주했던 질문들도 모아봤어요 

# type(x)랑 print(type(x))랑 어떻게 차이가 나나요?

#print(): 괄호 안의 변수의 결과를 보여줌 
print(type(1)) # 파이썬이 알려주는거 
print(type(1.0)) #float  # print() 함수를 이용해주면 결과값을 모두 알려줌

 


문자형 (String)

문자형(String)은 문자의 집합으로 이루어진 데이터 타입입니다.

텍스트 데이터를 다룰 때 사용되며, 작은 따옴표(') 또는 큰 따옴표(")로 묶어서 표현합니다.

 


(1) 문자형 기본 사용법

문자형 생성

# 작은 따옴표와 큰 따옴표 모두 사용 가능
text1 = 'Hello'
text2 = "World"

text1, text2  # Hello World

 

저는 주로 큰 따옴표하려면 shift 키를 누르는게 번거로워서 

작은 따옴표를 많이 사용하고 있어요 ! 

 

문자열 결합

문자열을 결합하려면 + 연산자를 사용합니다.

greeting = "Hello, "
name = "meanji!"
message = greeting + name
print(message) # Hello, meanji!

 

(2) 문자열 인덱싱과 슬라이싱

파이썬에서 문자열을 부분적으로 접근하거나 조작할 수 있게 해주는 방법

 

text = "Hello World!"
print(text[0])   # H
print(text[-1])  # ! (뒤에서 첫 번째)

 

 


✂️ 슬라이싱: "글자 조각내기"

  • 문자열에서 여러 글자를 잘라서 가져오는 방법
  • 문법: 문자열[시작:끝] → 끝은 포함하지 않음 
# text = "Hello World!"

text[:] #'Hello World! ' 전체 
text[:6] #'Hello ' 
text[6:] #'World! ' #이렇게 앞과 뒤는 끝까지 앞까지로 앞뒤가 비어있어도 됨

 

✅ 1. 파일 확장자 추출

  • 마지막 3글자만 추출해서 확장자 가져오기 
filename = "report.pdf"
filename[6:] // '.pdf' 

filename = "report.pdf"
filename[-3:] // 'pdf'

 

 

#✅ 2. 주민등록번호 뒷자리 마스킹

ssn='000714-4002019'
#앞부분(8글자)만 남기고 나머지는 *로 처리

ssn[0:8] + '*'*6

 

✅ 3. 문자열에서 특정 구간 추출 (날짜 형식)

date = "20250408"
#year, month, day 
year=date[:4]
month=date[4:6]
day=date[6:] #[-2:] 이렇게하는 방법도 잇음

 


✅ 4. URL에서 도메인 이름 추출

url = "https://www.example.com"

print(url.find('https'))
print(url.find('example'))
print(len(url))

 

 

(3) 문자열 함수

문자열 길이 확인, 대소문자 변환, 문자열 검색, 문자열 교체, 문자열 분리와 결합, 공백 제거, 문자열 포함 여부 등 다양한 문자열 관련 함수들을 사용할 수 있습니다.

 

문자열 길이 확인: len()

문자열의 길이를 반환합니다.

 

name = 'meanji'

len(name) // 6

 

 

대소문자 변환

  • upper(): 문자열을 대문자로 변환
  • lower(): 문자열을 소문자로 변환

 

text = "hello WORLD"
print(text.upper())       # HELLO WORLD
print(text.lower())       # hello world

name = 'meanji'

print(name.capitalize()) #첫글자를 대문자로 바꿔줌

 


문자열 교체: replace()

특정 부분 문자열을 다른 문자열로 교체합니다.

 

text = "I like Python"
new_text = text.replace("Python", "meanji")
print(new_text)  //I like meanji

 

 

문자열 분리

  • split(delimiter): 특정 구분자를 기준으로 문자열을 나눔
# split 예제
text = "apple,banana,cherry"
fruits = text.split(",")  # 리스트로 반환
print(fruits)  # ['apple', 'banana', 'cherry']

 

⚠️ 주의! 파이썬에서 리스트는 [] 대괄호로 감싸야 해요!

# 올바른 예시
my_list = [1, 2, 3, 4]

# 잘못된 예시 ❌ (소괄호는 튜플, 중괄호는 딕셔너리/집합)
my_tuple = (1, 2, 3)   # 튜플
my_dict = {1: 'a'}     # 딕셔너리
my_set  = {1, 2, 3}    # 집합

리스트는 순서가 있고, 값 변경이 가능합니다! (가장 많이 쓰이는 자료형 중 하나예요)

 

뒤에서 자료형이 나올때마다 알려줄테지만 

처음 파이썬배울때 괄호 대괄호 소괄호 중괄호 너무 헷갈렸고 지금도 자신없지만..... 

기억하기 리스트 대괄호 

문자열 포함 여부: in, not in

특정 문자열이 포함되어 있는지 확인합니다.

 

data = "(주)화주유소, 주식회사 화주유소"

"(주)" in data or "주식회사" in data 
#or조건을 사용해서 (주) 포함되거나 주식회사라고 포함된다면 이건 주식회사라고 하는거


(4) 문자열 포맷팅

파이썬에서는 문자열을 동적으로 구성하기 위한 다양한 포맷팅 방법을 제공합니다.

name = 'meanji'
age = '26'
message = 'My name is {} and I am {} years old.'.format(name,age)
print(message)
#이게 중괄호가 많이 나오면 실수하기 쉽기 때문에 f-string을 사용하면 구조가 문자열 포맷팅보다 안정적임

 

name = 'meanji'
age = '26'
message = f'My name is {name} and I am {age} years old.'
print(message)
# 카카오 알림메시지를 보낼때 f-string을 많이 사용함

 

name = "김민지만지망디"
event = '쌍쌍바모임'
date = "5월 16일(금) 오후 2시"

message = "{}님, '{}'에 신청이 완료되었습니다.\n📅 일시: {}".format(name, event, date)
print(message)

//김민지만지망디님, '쌍쌍바모임'에 신청이 완료되었습니다.
//📅 일시: 5월 16일(금) 오후 2시

 

 

+ Recent posts