취업준비

백석대학교 KDT 부트캠프 3기 - 파이썬 기본문법 | 취업준비

Keep going AI 2025. 12. 24. 14:24

0. 가상환경 설정

 1) conda create -n proj1 python=3.11

 2) conda activate proj1

 3) 라이브러리 에서 cmd창 열고 code . 입력하기

 

 

 

1. 편의점 재고 관리

inv = {}

prod = input('상품명을 입력하세요 : ')
while prod.strip() !="":
    cnt = int(input())
    stock = inv.get(prod,0)
    stock +=cnt
    inv[prod]= stock
   
    prod = input('상품명을 입력하세요 : ')

for k,v in inv.items():
    print(k,v)

 

 

 

2. 딕셔너리 매개변수 

# 딕셔너리형 매개변수
def f6(**dic):
    print(locals())
    for i,v in dic.items():
        print(i,v)
   
f6(a=1,b=2,c=3)

 

 

 

3. package 활용

3- 1) 

# mymain.py 파일 
import mymod as ma
print(ma.add(3,4))  # 7

 

# mymod.py  파일 
def add(a,b):
    return a+b

 

 

3- 2) 

# mymain.py 파일 
from mypackage import *
print(mymod.add(3,4))  # 7

 

# mypackage 이 전체 파일
# mymode_div.py 파일 
def div(a,b):
    return a/b
 
# mymode_mult.py 파일 
def mult(a,b):
    return a*b
 
# mymode_sub.py 파일 
def sub(a,b):
    return a-b
 
# mymode_add.py 파일 
def add(a,b):
    return a+b
 

 

 

3- 3)  tutil 예제 

 

 

turtle_exam.zip
0.01MB

 

 

# 그림을 그리는 목적 보다는 팀원 각자의 패키지를 만들고 그것을 하나의 화면에 보여주는 방식을 위주로 하였다
## __init__.py 파일 
__all__ = ['turtle_jun',  'turtle_j', 'turtle_yu']
 

 

 

 

 

3- 4) class

# 메서드여서 self 가 들어감
class car:
    def __init__(self,abrand,acolor,amodel):
        self.brand= abrand
        self.color=acolor
        self.model=amodel
 
    def turn_on(self):
        print(self.brand,self.color,self.model,'strarted')
    def turn_off(self):
        print('stopped')
   
    def __str__(self):
        return f' brand : {self.brand}, colod: {self.color}, model : { self.model} '    
       
h1= car('현대', '검정','그랜져')

h1.turn_on()
h1.turn_off()


h2=car('기아','하얀색','k3')

h2.turn_on()
h2.turn_off()

 

 

 

 

 

3- 5) 상속

class mom:
    def __init__(self):
        print('엄마함수')
    def cook(self):
        print('요리를 합니다')
       
class dad:
    def __init__(self):
        print('아빠함수')
    def work(self):
        print('일을 합니다')

       
# 상속      
class me(mom,dad):
    def __init__(self):
        super().__init__()
    pass
 
me= me()
me.cook()
me.work()

 

 

 

3- 6) zip 함수

letter = ['a','b','c','d']
numbers= [1,2,3,4]

for x,y in zip(letter,numbers):
    print(x,y)
   
d= dict(zip(letter, numbers))
print(d)
print(type(d))

 

 

  3- 7) map 함수

a= [1,2,3]
b=[4,5,6]

c= list(map(lambda a,b : a+b, a,b))
c

 

 

3- 8) 스레드

 : 여러가지 일을 동시에 수행하도록 하는 것으로 하나의 목표를 가진 프로그램을 수행할 때, 독립적으로 운영되는 작업

# 홍길동 5가지 일, 0.5초 휴식
# 김길동 8가지 일, 1.2초 휴식
# 최길동 10가지 일 , 1.5초 휴식
import threading
import time

def func(name,sec,delay):
    print('쓰레드 시작')
    for i in range(sec):
        time.sleep(delay)
       
        print(name, '---> ' ,i+1, '번째 일하고있어')
    print(name, '종료')
       

th1= threading.Thread(target=func, args=('홍길동',5,0.5))
th1.start()


th2= threading.Thread(target=func, args=('김길동',8,1.2))
th2.start()

th3= threading.Thread(target=func, args=('최길동',10,1.5))
th3.start()

 

 

3- 9) 데코레이터

## 튜플형 : **name,
## 딕셔너리형 : **kwargs
def my_deco(func):
    def wrapper(*name,**kwargs):
        print('안녕하세요')
        func(*name,**kwargs)
        print('만나서 반갑습니다')
    return wrapper

@my_deco
def say_name(name,age):
    print(f'{name}님 , {age}')
   
@my_deco  
def say_name1(name,age):
    print(f'{name}님 ,{age}')

say_name('홍길동',30)
say_name1('김철수',14)

 

 

 

 

4. 웹 크롤링

4- 1) 

import requests
print(response.status_code)  # HTTP 상태 코드 출력, 200
print(response.text)         # 응답 본문 출력
print(response.json())       # JSON 응답을 파싱하여 출력

 

 

 

 4- 2) qrcode 만들기

https://pypi.org/project/qrcode

 

qrcode

QR Code image generator

pypi.org

 

import qrcode
img = qrcode.make('https://www.naver.com')
type(img)  # qrcode.image.pil.PilImage
img.save("some_file.png")

 

 

 

 4- 3) html 기본문법

<html lang="ko">
<head>
        <meta charset="UTF-8">
        <title>CSS 예제</title>
</head>
<body>
    <h1>Hello CSS</h1>
        <div id="subject">선택자</div>
        <div class ="contents">선택자를 어떻게 작성하느냐에 따라
            <span>다른 </span> <b>요소가 반환</b></span>됩니다
        </div>
        <div>CSS 선택자는 다양한 곳에서 <b>활용</b>됩니다.</div>
</body>
</html>

 

 - soup.select(css 선택자)
 - class 는 .select('.클래스')
  - subject(id) 는 .select('#아이디')
  - soup.select_one(css 선택자)
  - 직계 : div > b

 

https://charimlab.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9B%B9%ED%81%AC%EB%A1%A4%EB%A7%8106

 

[파이썬: 웹크롤링] #06 html/CSS 선택자로 테이터 추출하기 with Select & Find

[왕초보 웹크롤링 무작정 따라하기] 파이썬 반복문(for문), .select(), .find(), html 추출, 태그 추출, 선택자 추출, 필터링. #06 html/CSS 선택자로 테이터 추출하기 select()와 find() 메소드 (바로가기 click) fin

charimlab.tistory.com

 

 

 

  4-4 ) 네이버 환율정보 스크래핑

 

https://finance.naver.com/marketindex/

 

https://finance.naver.com/marketindex/

환전 고시 환율 2025.12.29 17:18 하나은행 기준 고시회차 358회

finance.naver.com

 

 

 

 

import requests
from bs4 import BeautifulSoup
# 환율 정보를 제공하는 URL
# a태그.usd div.head_info > span.value

market_index = requests.get(url)
print(market_index)

soup = BeautifulSoup(market_index.content, "html.parser")
price = soup.select_one("a.head.usd div.head_info > span.value")

print(price)
print("usd/krw=", price.text)

 

 

 

 

 

  4- 5) 날씨 정보 크롤링

# 페이지가 열리고 3초를 기달린 후 수집
import requests
from bs4 import BeautifulSoup
from selenium.webdriver import Chrome
import time
 
 
driver = Chrome()
driver.get(url)

time.sleep(3)

weather= driver.find_element(by='css selector', value='span.tmp')
print(weather.text)

 

   * value 는 F12 -> 출력할 요소의 오른쪽 마우스 클릭 -> copy selector 

 

 

 

https://karuru1007.tistory.com/entry/Selenium-CSS-SelectorCSS-%EC%85%80%EB%A0%89%ED%84%B0%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EC%9B%B9-%ED%8E%98%EC%9D%B4%EC%A7%80-%EC%9A%94%EC%86%8C-%EC%B0%BE%EA%B8%B0

 

[ Selenium ] CSS Selector(CSS 셀렉터)를 사용하여 웹 페이지 요소 찾기

웹페이지를 크롤링 또는 스크래핑할 때 요소를 찾는 방법 중 하나인CSS Selector(CSS 셀렉터)를 사용하는 방법입니다. Selenium 라이브러리를 사용하여CSS 셀렉터를 사용하는 방법의 예를 들어보겠습

karuru1007.tistory.com

 

 

https://wikidocs.net/91474

 

 

 

 4- 6)  웹브라우저 자동화

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
import os


file_path= os.getcwd() + '/base2.html'


options= Options()

options.add_experimental_option('detach',True)

driver= Chrome(options=options)
driver.get(file_path)


# 아이디와 비밀번호 적기
loginForm= driver.find_element(by='id',value='loginForm')
username= driver.find_element(by='name',value='username')
password= driver.find_element(by='name',value='password')

username.send_keys('aaa')
password.send_keys('aaa')


# 링크 클릭하기
link= driver.find_element(by='link text',value='파이썬전문가그룹')
link.click()


# 링크 클릭하기 전으로 돌아오기
driver.back()


driver.close()

 

 

   4- 7) 웹 브라우저에서 해당하는 키워드 찾기

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
import os




options= Options()


driver= Chrome(options=options)
driver.get(file_path)


# 검색창에 pycon 입력하기
input= driver.find_element(by='id',value='id-search-field')
input.send_keys('pycon')


# 엔터 하기
from selenium.webdriver.common.keys import Keys
input.send_keys(Keys.RETURN)

# 1초 기달림
driver.implicitly_wait(1)

## results 를 리스트로 만들기
## value : content > div > section > form > ul > li:nth-child(1) > h3 > a
## value : from li h3 >a
lsts= driver.find_elements(by='css selector',value='form > ul > li:nth-child(1) > h3 > a')


for i in lsts:
    print(i.text)
   
   
driver.back()
driver.close()

 

 

 

 

  4- 8) 이미지 저장

# 영화 이미지 가져오기
from bs4 import BeautifulSoup
import requests
import re
from PIL import Image
from io import BytesIO
import  os

movie= requests.get(url)


# images 파일이 없으면 생성하기
img_dir= 'images'
if not os.path.exists(img_dir):
    os.makedirs(img_dir)
   

# 제외하는 정규화표현
pattern= r'[<>:"?/\\*|,!]'


# status_code 확인 및 제목 추출 과 이미지 추출
if movie.status_code==200:
    soup= BeautifulSoup(movie.content, 'html.parser')
    title_list= soup.select('.movieBox-list .movie-title h3 a')
    img_list= soup.select('.movieBox-list .movieBox-item img')
    print(len(title_list),title_list)
   
    for title, img in zip(title_list,img_list):
        img_src= img.get('src')
        img_respones= requests.get('https://www.moviechart.co.kr' + img_src)
        img= Image.open(BytesIO(img_respones.content))
        img_filename= re.sub(pattern,'',title.text)
        img.save(os.path.join(img_dir, img_filename + '.png'))
        print(f'저장완료 : {img_filename}.png' )
   
else:
    print("영화 자료를 읽어오지 못했습니다")

 

 

 

 

 

5. 시각화

ratio = [32,45,12,23]

labels = ['apple','banana','cherry','orange']
color= ['red','yellow','pink','orange']
exp = [0, 0.10, 0, 0]
plt.pie(ratio,labels=labels, autopct='%.1f%%',colors=color, shadow=True,
        explode= exp);

 

 

 

6. 데이터 불러오기

 

https://data.kma.go.kr/mypage/member/updateMyInfo.do?pgmNo=76

 

기상자료개방포털

전세계 170여개국 8,700여지점의 기상관측 데이터를 제공합니다.

data.kma.go.kr

 

import matplotlib.pyplot as plt
import pandas as pd
 
# 데이터 전처리
df = pd.read_csv('날짜데이터.csv', encoding='cp949', skiprows=7 )
df['날짜']= df['날짜'].str.replace('\t',' ')
df1['연도']= df1['날짜'].str[:5]
 

# 데이터 시각화
plt.rc('font', family='Malgun Gothic')
plt.rcParams['axes.unicode_minus'] = False

plt.plot(df1['연도'],df1['평균'], color='orange', label='평균')
plt.plot(df1['연도'],df1['최저'], color='blue', label='최저')
plt.plot(df1['연도'],df1['최고'], color='red', label='최고')
plt.legend()
plt.xticks(rotation=90)
plt.title('기온 파악')
plt.show()

 

 

 

날짜데이터.csv
0.29MB

* 날짜데이터.csv 을 df 로 지정

 

 

 

 

7. 파이썬과 sqlite 연동

 

https://sqlitestudio.pl/

 

SQLiteStudio

Yet another bugfix release. Most notably it solves problem with entering edit mode in data grid view - a problem introduced in 3.4.18.

sqlitestudio.pl

 

 

https://dbeaver.io/download/

 

Download | DBeaver Community

Download DBeaver Community 25.3.1 Released on December 21st 2025 (Milestones). It is free and open source (license). Also you can get it from the GitHub mirror. System requirements. DBeaver PRO 25.3 Released on December 8th, 2025 PRO version website: dbeav

dbeaver.io

 

 

import sqlite3

# db 연결
conn= sqlite3.connect('./myDB.db')

# db cusor 생성
cusor= conn.cursor()

# db 테이블 만들기
# 테이블이 없으면 phonebook생성
# name, phone , addr 컬럼이 text파일 형태
# "C:\python\myDB.db" : mydb 경로
cusor.execute('''create table if not  exists phonebook(name text ,phone text ,addr text)''')
cusor.execute('''create index if not  exists phonebook_idx on phonebook(name)''')



# 데이터 입력
def insert_data(name, phone, addr):
    cusor.execute("INSERT INTO phonebook (name, phone, addr) VALUES (?, ?, ?)", (name, phone, addr))
    conn.commit()    


# 데이터 업데이트
def update_data(name, phone, addr):
    cusor.execute("UPDATE phonebook SET phone = ?, addr = ? WHERE name = ?", (phone, addr, name))
    conn.commit()


# 데이터 삭제
# 튜플타입을 하기위해 name, 으로 사용
def delete_data(name):
    cusor.execute("DELETE FROM phonebook WHERE name = ?", (name,))
    conn.commit()


# 특정 데이터 검색하기
# 튜플타입을 하기위해 name, 으로 사용
def search_data(name):
    cusor.execute("SELECT * FROM phonebook WHERE name = ?", (name,))
    rows = cusor.fetchall()
    for row in rows:
       print(f'이름 : {row[0]}, 전화번호: {row[1]}, 주소 : {row[2]} ')


# 전체 데이터 보여주기
def display_all():
    cusor.execute("SELECT * FROM phonebook")
    rows = cusor.fetchall()
    for row in rows:
       print(f'이름 : {row[0]}, 전화번호: {row[1]}, 주소 : {row[2]} ')


def main():
    while True:
        print("1: 데이터 입력")
        print("2: 데이터 수정")
        print("3: 데이터 삭제")
        print("4: 데이터 검색")
        print("5: 데이터 보기")
        print("6: 종료")
        choice = input("선택하세요 : ")
        match(choice):
            case '1':
                name = input("입력할 성명: ")
                phone = input("입력할 전화번호: ")
                addr = input("입력할 주소: ")
                insert_data(name, phone, addr)
            case '2':
                name = input("수정할 성명 : ")
                phone = input("수정할 전화번호: ")
                addr = input("수정할 주소: ")
                update_data(name, phone, addr)
            case '3':
                name = input("삭제할 이름을 입력하세요: ")
                delete_data(name)
            case '4':
                name = input("검색할 이름을 입력하세요: ")
                search_data(name)
            case  '5':
                display_all()
            case '6':
                break
            case _:
                print("1~6까지의 숫자를 입력하세요")

if __name__ == '__main__':
    main()

# DB Connection 닫기
conn.close()

 

데이터 확인할려면 Data 클릭 후 refresh

 

 

  ## 설치한 라이브러리를 requirements.txt 로 저장

pip freeze > requirements.txt

 

 

 

8. FastAPI

### restful API 설명

get: 조회,요청
post : 생성
put(path) : 일부수정 
delete : 삭제 

 

8- 1) 

# 경로매개변수 : URL 경로의 일부를 변수처럼 만들어서 사용자마다 다른 값을 받을수있게함
# url에  /uesrs/홍길동/pwd/1234 입력
from typing import Dict, List
from fastapi import FastAPI,Query
 
@app.get('/uesrs/{user_id}/pwd/{password}') # user_id : 변수
def read_user(user_id,password):
    return {'사용자 id는 ':user_id ,'비밀번호는': password}

 

 

 

 8 - 2) 

# 쿼리매개변수 : 경로 뒤에 ?기호를 붙이고 키워드=value 형태로 전달되는 매개변수 {1번키워드 & 2번키워드}
# url 에 /items/?name=홍길동&age=17 입력
# url에  /items/?name=홍길동&age=15 입력
from typing import Dict, List
from fastapi import FastAPI,Query
 
@app.get('/items/')
def read_item(name:str='이름',age:int=10):
    return {'name':name, 'age':age}

 

/items/?name=홍길동&age=17
/items/?name=홍길동

 

 

* 동기 코드 vs 비동기 코드

 (1) 동기 코드

@app.get("/sync")
def sync_task():
    result = db_query()  # 여기서 3초 걸린다면, 서버는 3초간 멍하니 멈춤
    return {"result": result}

 

 (2) 비동기 코드 

@app.get("/async")
async def async_task():
    result = await db_query()  # 기다리는 동안 다른 사용자의 요청을 처리함
    return {"result": result}

 

 

  

8- 3) 

from fastapi import FastAPI
app= FastAPI()

# 딕셔너리
todo_data ={ 1: {'id':1 , 'task' : '아침먹기', 'done' : True } ,
             2: {'id':2 , 'task' : '점심먹기', 'done' : True } ,
             3: {'id':3 , 'task' : '저녁먹기', 'done' : True }
            }


# 조회하기
# root 를 만들지 않아서 not found 나옴
# url에 todos/ 입력
@app.get('/todos/')
def get_data():
    return list(todo_data.values())
 
 
#  desc를 하여 내림차순으로 정렬하기
@app.get('/todos1/')
def get_data1(order : str = 'acs'):
    ret= list(todo_data.values())
    if order =='desc':
        return ret[::-1]
    return ret
 
 
#  1번을 입력하면 아침먹기, 2번을 입력하면 점심먹기, 3번을 입력하면 저녁먹기 출력
@app.get('/todos/{todo_id}')
def get_data_by_id(todo_id:int):
    return todo_data.get(todo_id, {})
 
 
 
# 데이터 넣기
from pydantic import BaseModel
class TodoItem(BaseModel):
    id : int
    task : str
    done : bool
   

@app.post('/todos/')
def create_data(request:TodoItem):
    todo_data[request.id]=request.model_dump()
    return todo_data[request.id]
   
   
   
# 업데이트
@app.patch('/todos/{todo_id}')
def update_data(todo_id : int, request:TodoItem):
    if todo_id in todo_data:
        todo_data[todo_id].update(request.model_dump())
        return todo_data[todo_id]
    return {}


# 삭제
@app.delete('/todos/{todo_id}')
def delete_data(todo_id : int):
    todo_data.pop(todo_id,None)
    return todo_data

 

 

/docs

 

 

 

3번 입력

 

 

 

 

 

 

8-4)

# HTML 연결하기
# templates 폴더생성

from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates

app = FastAPI()
templates = Jinja2Templates(directory="templates")

#루트 경로를 의미 브라우저에서 http://127.0.0.1:8000/로 접근할 때 실행되는 함수
@app.get("/", response_class=HTMLResponse)
def read_root(request: Request):
    return templates.TemplateResponse(
              "index.html", # index.html 파일은 다른 파일로 변경가능
              {"request": request, "message": "Hello, World!"})
   

 

 

# HTML 연결하기
#  temlates/index.html
<!DOCTYPE html>
<html>
<head>
    <title>FastAPI with HTML</title>
</head>
<body>
    <h1>{{ message }}</h1>
</body>
</html>

 

 

 

9. Open AI

9-1)  

 

# API 키 가져오기

https://platform.openai.com/docs/overview

 

# .env 파일에서 API key 저장
OPENAI_API_KEY=' '

 

# openai api 키 출력
from dotenv import load_dotenv
import os

load_dotenv(override=True)
api_key= os.getenv('OPENAI_API_KEY')
print(api_key)

 

 

# system- 역할부여
# user- 질문
# assistant - 답변(gpt가 한 답변)
from openai import OpenAI
client = OpenAI()
response= client.chat.completions.create(
    model='gpt-4o-mini',
    messages=[
        {'role': 'user', 'content': '바나나는 무슨 색깔이야?'}
    ]
)

print(response.choices[0].message.content)

 

 

 

from openai import OpenAI
client = OpenAI()
response= client.chat.completions.create(
    model='gpt-4o-mini',
    messages=[
        {'role': 'user', 'content': '봄에 대해 알려줘'}
    ]
)

print(response.choices[0].message.content)

 

 

9-2)  openai를 활용하여 이미지 만들기

response = client.images.generate(
    model = 'dall-e-3',
    prompt = '겨울, 우주, 마녀, 판탄지, 코어, 생물, 초현실적인, 밝고 귀여운 이미지를 그려줘',
    size = '1024x1024',
    quality='standard',
    n=1
)
print(response.data[0].url)