In [4]:
# 메모화(메모이제이션)를 활용한 피보나치 수열 교재 301p
def fb(n, memo={}):
if n in memo:
return memo[n]
if n <= 1:
return n
memo[n] = fb(n-1,memo) + fb(n-2,memo)
return memo[n]
print(fb(50))
12586269025
파일 다루기¶
In [14]:
# 파일이 없으면 파일을 새로만듬
f = open("새파일.txt",'w')
f.close()
In [15]:
# 해당경로에 파일만들기
f = open("C:/xampp/새파일.txt", 'w')
f.close()
In [86]:
#f = open("새파일.txt",'w', encoding='utf-8') # encoding을 utf-8로 설정 안하면 기본적으로 ansi 파일로 저장되어 노트북에서 열리지 않음
# 파일안에 입력하기(w) 기존 내용을 무시하고 새로운 내용을 넣음 따라서 내용을 입력하면 전체내용이 바뀜
f = open("새파일.txt",'w', encoding='euc-kr') # 이게 encoding 기본 값임 . 이렇게 설정되어야 window에서 파일이 열림.
for i in range(11,21):
#data = "%d번째 줄입니다.\n" % i
data = f"{i}번째 줄입니다.^^\n"
f.write(data) # .write()를 사용하여 파일안에 입력하기
f.close()
In [78]:
# .readline()
# 파일 내용 읽기(r)
f = open("새파일.txt",'r')
line = f.readline() # 파일 내용중 첫번째줄 가져오기
print(line)
line = f.readline() # 똑같이 호출되면 그다음 줄을 가져옴
print(line)
f.close()
11번째 줄입니다.^^ 12번째 줄입니다.^^
In [62]:
# while문을 사용하여 파일 안에 내용 전부 가져오기
f = open("새파일.txt",'r')
line = f.readline() # 다음 줄부터 가져오기
while True: # 모든 line 가져오기
line = f.readline()
if not line: break
print(line, end="")
f.close()
12번째 줄입니다.^^ 13번째 줄입니다.^^ 14번째 줄입니다.^^ 15번째 줄입니다.^^ 16번째 줄입니다.^^ 17번째 줄입니다.^^ 18번째 줄입니다.^^ 19번째 줄입니다.^^멋있다 20번째 줄입니다.^^우와
In [88]:
# 객체로 파일 읽기
f = open("새파일.txt",'r')
for line in f:
print(line,end="")
f.close()
11번째 줄입니다.^^ 12번째 줄입니다.^^ 13번째 줄입니다.^^ 14번째 줄입니다.^^ 15번째 줄입니다.^^ 16번째 줄입니다.^^ 17번째 줄입니다.^^ 18번째 줄입니다.^^ 19번째 줄입니다.^^ 20번째 줄입니다.^^
In [60]:
# .readlines()
# 파일 안에 내용들 줄을 묶어서 리스트로 가져옴
f = open("새파일.txt",'r')
lines = f.readlines()
print(lines)
f.close()
['11번째 줄입니다.^^\n', '12번째 줄입니다.^^\n', '13번째 줄입니다.^^\n', '14번째 줄입니다.^^\n', '15번째 줄입니다.^^\n', '16번째 줄입니다.^^\n', '17번째 줄입니다.^^\n', '18번째 줄입니다.^^\n', '19번째 줄입니다.^^멋있다\n', '20번째 줄입니다.^^우와\n']
In [64]:
# for in 반복문을 활용하여 파일 안에 내용들 줄을 묶어서 리스트로 가져옴
f = open("새파일.txt",'r')
lines = f.readlines()
for line in lines:
print(line, end="")
f.close()
11번째 줄입니다.^^ 12번째 줄입니다.^^ 13번째 줄입니다.^^ 14번째 줄입니다.^^ 15번째 줄입니다.^^ 16번째 줄입니다.^^ 17번째 줄입니다.^^ 18번째 줄입니다.^^ 19번째 줄입니다.^^멋있다 20번째 줄입니다.^^우와
In [71]:
f = open("새파일.txt",'r')
lines = f.readlines()
for line in lines:
line = line.strip() # strip을 사용해서 양쪽 공백 제거
print(line,end="|")
f.close()
11번째 줄입니다.^^|12번째 줄입니다.^^|13번째 줄입니다.^^|14번째 줄입니다.^^|15번째 줄입니다.^^|16번째 줄입니다.^^|17번째 줄입니다.^^|18번째 줄입니다.^^|19번째 줄입니다.^^멋있다|20번째 줄입니다.^^우와|
In [75]:
# .read()
# 문서 내용 그대로 가져오기
f = open("새파일.txt",'r')
data = f.read()
print(data)
f.close()
# 텍스트 파일 복사하기
f = open("새파일2.txt",'w')
f.write(data)
f.close()
11번째 줄입니다.^^ 12번째 줄입니다.^^ 13번째 줄입니다.^^ 14번째 줄입니다.^^ 15번째 줄입니다.^^ 16번째 줄입니다.^^ 17번째 줄입니다.^^ 18번째 줄입니다.^^ 19번째 줄입니다.^^멋있다 20번째 줄입니다.^^우와
In [87]:
# 내용 추가하기(a) 누적
# (a)로 해도 파일이 없을때는 파일이 새로 만들어짐
f = open("새파일3.txt",'a')
for i in range(21,31):
#data = "%d번째 줄입니다.\n" % i
data = f"{i}번째 줄입니다.^^\n"
f.write(data) # .write()를 사용하여 파일안에 입력하기
f.close()
In [92]:
# with open("파일경로/파일명","모드") as 객체:
# 이렇게 파일을 열면 구문이 종료되면 자동으로 파일이 닫힘, 따라서 close() 실수를 줄일 수 있음
with open("새파일.txt",'r') as f:
data = f.read()
print(data)
11번째 줄입니다.^^ 12번째 줄입니다.^^ 13번째 줄입니다.^^ 14번째 줄입니다.^^ 15번째 줄입니다.^^ 16번째 줄입니다.^^ 17번째 줄입니다.^^ 18번째 줄입니다.^^ 19번째 줄입니다.^^ 20번째 줄입니다.^^
In [94]:
# cmd에서 확인하듯이 !type 파일명을 검색해도 파일내용을 확인 할 수 있음
!type 새파일.txt
11번째 줄입니다.^^ 12번째 줄입니다.^^ 13번째 줄입니다.^^ 14번째 줄입니다.^^ 15번째 줄입니다.^^ 16번째 줄입니다.^^ 17번째 줄입니다.^^ 18번째 줄입니다.^^ 19번째 줄입니다.^^ 20번째 줄입니다.^^
In [95]:
lines = ['Hello, World!','Hello, again!']
with open("새파일4.txt",'w') as f:
for line in lines:
f.write(f"{line}\n")
In [96]:
!type 새파일4.txt
Hello, World! Hello, again!
In [101]:
# writelines()를 활용하여 한번에 여러줄 입력가능 단 리스트속에 줄나눔이 포함되어있어야 줄이 나눠짐
lines = ['Hello, World!\n','Hello, again!']
with open("새파일5.txt",'w') as f:
f.writelines(lines)
In [102]:
!type 새파일5.txt
Hello, World! Hello, again!
In [104]:
codes = ['005930','005380','035420']
with open("매수종목1.txt",'w') as f:
for code in codes:
f.write(f"{code}\n")
In [105]:
!type 매수종목1.txt
005930 005380 035420
In [112]:
with open("매수종목2.txt",'w') as f:
f.write("005930 삼성전자\n")
f.write("005380 현대차\n")
f.write("035420 NAVER\n")
In [113]:
!type 매수종목2.txt
005930 삼성전자 005380 현대차 035420 NAVER
In [153]:
# 데이터 strim을 활용하여 사용 가능하게 가져오기
list1 = []
with open("매수종목1.txt",'r') as f:
for i in f:
c = i.strip() # 공백삭제
list1.append(c)
print(list1)
print(list1==codes)
['005930', '005380', '035420'] True
In [155]:
# 매수종목2.txt를 읽어서 딕셔너리로 만들기 (key: 코드, value: 종목명)
list2 ={}
with open("매수종목2.txt","r") as f:
for i in f:
c=i.strip() # 공백 삭제
k,v = c.split(" ") # 딕셔너리 키 값에 split값 넣기
list2[k] = v
print(list2)
{'005930': '삼성전자', '005380': '현대차', '035420': 'NAVER'}
In [156]:
# 매수종목2.txt를 읽어서 딕셔너리로 만들기 (key: 종목번호, value: 종목명)
with open("매수종목2.txt","r") as f:
lines = f.readlines()
data = {}
for line in lines:
line = line.strip()
k, v = line.split() # 리스트 언팩킹
data[k] = v
print(data)
{'005930': '삼성전자', '005380': '현대차', '035420': 'NAVER'}
In [157]:
with open("매수종목2.txt","r") as f:
lines = f.readlines()
data = {}
for line in lines:
line = line.strip()
t = line.split()
data[t[0]] = t[1]
print(data)
{'005930': '삼성전자', '005380': '현대차', '035420': 'NAVER'}
In [158]:
# 컴퓨리헨션 적용 예제
with open("매수종목2.txt","r") as f:
data = {t.split()[0]:t.split()[1] for t in f.readlines()}
print(data)
{'005930': '삼성전자', '005380': '현대차', '035420': 'NAVER'}
CSV 파일¶
In [166]:
# 한 줄씩 입력 (리스트)
import csv
with open("매수종목.csv", "w", encoding="utf-8", newline='') as f:
wr = csv.writer(f)
wr.writerow(["종목명", "종목코드", "PER"])
wr.writerow(["삼성전자", "005930", 15.59])
wr.writerow(["NAVER", "035420", 55.82])
In [167]:
# 여러줄 입력 (2차원 리스트)
import csv
data = [
['이름', '나이', '도시'],
['김철수', '25', '서울'],
['이영희', '28', '부산']
]
with open('data.csv', 'w', encoding='utf-8', newline='') as f:
wr = csv.writer(f)
wr.writerows(data)
In [170]:
import csv
'''f = open("매수종목.csv", mode="r", encoding="utf-8")
reader = csv.reader(f)
for row in reader:
print(row)
f.close()'''
with open("매수종목.csv", "r", encoding="utf-8") as f:
reader = csv.reader(f)
for row in reader:
print(row)
['종목명', '종목코드', 'PER'] ['삼성전자', '005930', '15.59'] ['NAVER', '035420', '55.82']
In [169]:
with open("data.csv", "r", encoding="utf-8") as f:
data = []
reader = csv.reader(f)
for row in reader:
data.append(row)
print(data)
[['이름', '나이', '도시'], ['김철수', '25', '서울'], ['이영희', '28', '부산']]
In [163]:
with open("data.csv", "r", encoding="utf-8") as f:
data = [row for row in csv.reader(f)]
print(data)
[['이름', '나이', '도시'], ['김철수', '25', '서울'], ['이영희', '28', '부산']]
In [164]:
# write_csv(data, filename)
# result = read_csv(filename) # 최종: 2차원 배열(리스트)
data = [
['이름', '나이', '키', '몸무게'],
['박철수', '25', '190', '90'],
['이영철', '28', '180', '80']
]
filename = 'data2.csv'
def write_csv(dt, filename):
with open(filename, 'w', encoding='utf-8', newline='') as f:
wr = csv.writer(f)
wr.writerows(dt)
def read_csv(filename):
with open(filename, "r", encoding="utf-8") as f:
data = []
reader = csv.reader(f)
for row in reader:
data.append(row)
return data
#return [row for row in csv.reader(f)]
### 함수 호출
write_csv(data, filename)
result = read_csv(filename)
print(result)
[['이름', '나이', '키', '몸무게'], ['박철수', '25', '190', '90'], ['이영철', '28', '180', '80']]
In [174]:
# 학생별 성적 관리
import csv
grades_data = [
['김철수', '수학', '90'],
['이영희', '영어', '85'],
['박민수', '과학','88']
]
filename = 'grades.csv'
def write_grades(data, filename):
with open(filename, 'w', encoding='utf-8', newline='')as f:
wr = csv.writer(f)
wr.writerow(['이름','과목','점수']) #헤더 작성
wr.writerows(data)
def read_grades(filename):
with open(filename, "r", encoding= "utf-8") as f:
data = []
reader = csv.reader(f)
return [row for row in reader]
write_grades(grades_data, filename)
result = read_grades(filename)
print(result)
[['이름', '과목', '점수'], ['김철수', '수학', '90'], ['이영희', '영어', '85'], ['박민수', '과학', '88']]
In [172]:
# 직원 정보 관리
import csv
def write_employees(data, filename):
with open(filename,'w',encoding='utf-8', newline='')as f:
write = csv.writer(f)
write.writerow(['ID','이름','부서'])
write.writerows(data)
def read_employees(filename):
with open(filename, 'r', encoding='utf-8') as f:
data = []
reader = csv.reader(f)
return [row for row in reader]
employees_data = [
['001','배수지','인사부'],
['002','안소희','개발부'],
['003','한지민','마케팅부']
]
filename = 'employees.csv'
write_employees(employees_data, filename)
result = read_employees(filename)
print(result)
[['ID', '이름', '부서'], ['001', '배수지', '인사부'], ['002', '안소희', '개발부'], ['003', '한지민', '마케팅부']]
In [176]:
# 영화 정보 관리
import csv
def write_movies(data, filename):
with open(filename,'w',encoding='utf-8', newline='') as f:
write = csv.writer(f)
write.writerow(['제목','감독','개봉 연도'])
write.writerows(data)
def read_movies(filename):
with open(filename, 'r', encoding = 'utf-8') as f:
data = []
reader = csv.reader(f)
return [row for row in reader]
movies_data = [
["인셉션", '크리스토퍼 놀란', '2010'],
["타이타닉", '제임스 카메론', '1997'],
["겨울왕국", '크리스 벅', '2013']
]
filename = 'movies.csv'
write_movies(movies_data,filename)
result = read_movies(filename)
print(result)
[['제목', '감독', '개봉 연도'], ['인셉션', '크리스토퍼 놀란', '2010'], ['타이타닉', '제임스 카메론', '1997'], ['겨울왕국', '크리스 벅', '2013']]
In [186]:
# 모듈이 수정이 안되거나 로딩이 안될때 실행, 위에거는 자동으로 수정되면 수정되게 함, 아래거는 수동으로 강제로 로딩 시킴 위에거 안되면 밑에거로 하면됨
%load_ext autoreload
%autoreload 2
#import importlib
#importlib.reload(모듈이름)
The autoreload extension is already loaded. To reload it, use: %reload_ext autoreload
In [181]:
# 모듈을 로딩하여 csv파일 생성
import csv
import minfo as mf # as 뒤 별명을 붙여서 별명을 불러 호출가능
books_data = [
['파이썬 완벽 가이드','존 스미스','2020'],
['모두의 데이터 분석','김예린','2021'],
['안전한 웹 개발','이민호','2022']
]
filename = 'books.csv'
mf.write_books(books_data, filename)
result = mf.read_books(filename)
print(result)
[['제목', '저자', '출판 연도'], ['파이썬 완벽 가이드', '존 스미스', '2020'], ['모두의 데이터 분석', '김예린', '2021'], ['안전한 웹 개발', '이민호', '2022']]
In [182]:
# 쇼핑 목록 관리
import minfo as sf
shopping_data= [
['사과', '5','1000'],
['바나나','10','500'],
['우유','2','1500']
]
filename = 'shopping_list.csv'
sf.write_shopping_list(shopping_data, filename)
result = sf.read_shopping_list(filename)
print(result)
[['상품명', '수량', '가격'], ['사과', '5', '1000'], ['바나나', '10', '500'], ['우유', '2', '1500']]
내장 모듈¶
- 함수와 모듈의 차이는 함수는 import를 안해줘도됨
In [237]:
# 기본 난수 모듈
import random
print(random.randint(1,10)) # 1~10 사이 랜덤 정수 (10포함)
5
In [194]:
print(random.randrange(1,10)) # 1~9 사이 랜덤 정수
1
In [195]:
print(random.randrange(10)) # 0~9 사이 랜덤 정수
9
In [231]:
print(random.randrange(0,101,2)) # 0~100까지 정수 중 짝수만
12
In [233]:
print(random.random()) # 0~1사이 랜덤 실수 (1은 포함 안됨)
0.5157263539399057
In [234]:
print(random.random()*9+1) # 1~10사이 랜덤 실수 (10은 포함 안됨)
3.1260004685914424
In [236]:
print(random.uniform(1,10)) # 1~9사이 랜덤 실수 (10은 포함 안됨)
7.537145420745427
In [246]:
# 시퀀스 관련 난수
a = [1,2,3,4,5,6,7]
b = random.choice(a) # 리스트에서 무작위 선택
print(b)
3
In [261]:
a = [1,2,3,4,5,6,7,8,9,10,11]
b = random.choices(a,k=3) # 리스트에서 k개 무작위 선택 (중복가능)
b
Out[261]:
[10, 10, 6]
In [369]:
a = [1,2,3,4,5,6,7,8,9,10,11]
random.shuffle(a)
a
Out[369]:
[11, 6, 1, 4, 8, 3, 2, 9, 10, 5, 7]
In [341]:
c = random.sample(a,3) # 리스트에서 k개 무작위 선택 (중복 불가능)
c
Out[341]:
[9, 8, 3]
In [354]:
# random.choices(데이터, 가중치, k=수량)
items = ['A','B','C']
weights = [1,2,3] # 가중치
val = ['A','B','B','C','C','C']
random.choices(items, weights=weights,k=1)
Out[354]:
['C']
In [355]:
# random.gauss(평균,표준편차)
random.gauss(0,1)
Out[355]:
-0.30864047418412116
In [356]:
import random
menulist = []
while True:
menu = input("메뉴는?")
if(menu == ''):
break
menulist.append(menu)
print("점심메뉴는 ", random.choice(menulist),"으로 하세요")
점심메뉴는 4 으로 하세요
In [357]:
def generate_lotto():
return sorted(random.sample(range(1,46),6))
print("로또번호:", generate_lotto())
로또번호: [11, 21, 27, 28, 34, 45]
In [361]:
def generate_password(length=8): # 아무것도 입력안하면 기본적으로 8글자
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYQ0123456789'
return ''.join(random.choices(chars, k=length))
print("랜덤 비밀번호:", generate_password(20))
랜덤 비밀번호: JTgQNI42oxlpg6z0c0R2
In [362]:
fruits =['사과','바나나','오렌지']
weights = [0.5,0.3,0.2]
print("선택된 과일:", random.choices(fruits, weights=weights,k=1)[0])
선택된 과일: 사과
In [378]:
def shuffle_cards():
suits = ['♠', '♥', '♦', '♣']
numbers = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
cards = [f"{suit}{num}" for suit in suits for num in numbers]
random.shuffle(cards)
return cards
print("섞은 카드:", shuffle_cards()[:5])
섞은 카드: ['♠6', '♥5', '♦8', '♠Q', '♠4']
In [379]:
import random
s = random.randint(1,10)
life = 3
while True:
num = int(input("숫자를 입력하시오"))
if num==s:
print(f"정답입니다. {4-life}번째 만에 맞췄습니다.")
break
else:
life-=1
if life==0:
print("실패했습니다.")
break;
if num>s:
print("정답보다 큽니다")
elif num<s:
print("정답보다 작습니다")
정답보다 작습니다
정답보다 큽니다
정답입니다. 3번째 만에 맞췄습니다.
In [376]:
# math 모듈
import math
# 1. ceil() - 올림
print(math.ceil(1.4)) # 2
print(math.ceil(1.7)) # 2
print(math.ceil(-1.4)) # -1
# 2. round() - 반올림
print(round(1.4)) # 1
print(round(1.7)) # 2
print(round(1.5)) # 2
print(round(-1.5)) # -2
# 3. floor() - 내림
print(math.floor(1.7)) # 1
print(math.floor(1.4)) # 1
print(math.floor(-1.7)) # -2
# 4. sqrt() - 제곱근
print(math.sqrt(4)) # 2.0
print(math.sqrt(2)) # 1.4142135623730951
# 5. factorial() - 계승
print(math.factorial(5)) # 120 (5! = 5 × 4 × 3 × 2 × 1)
print(math.factorial(3)) # 6 (3! = 3 × 2 × 1)
# 6. pi - 원주율
print(math.pi) # 3.141592653589793
2 2 -1 1 2 2 -2 1 1 -2 2.0 1.4142135623730951 120 6 3.141592653589793
In [373]:
import datetime
now = datetime.datetime.now()
print(now)
today = datetime.date.today()
print(today)
setdate = datetime.date(2024,8,5)
print(setdate)
mydate = "2025-07-19"
tmp1 = mydate.split("-")
setdate2 = datetime.date(int(tmp1[0]),int(tmp1[1]),int(tmp1[2]))
print(setdate2)
rday = setdate2 - today
print(rday.days)
2024-11-12 17:48:26.237773 2024-11-12 2024-08-05 2025-07-19 249
In [377]:
now = datetime.datetime.now() # 현재날짜 및 현재시간
print(now.year,"년")
print(now.month,"월")
print(now.day,"일")
print(now.hour)
print(now.minute)
print(now.second)
print(now.weekday()) #0~6 (월~일)
print(now.isoweekday()) #1~7 (월~일)
2024 년 11 월 12 일 17 50 27 1 2
In [ ]: