1. 모듈
calculator.py 안에 내용
def add(x, y):
return x + y
def subtract(x, y):
return x - y
def multiply(x, y):
return x * y
def divide(x, y):
return x / y
import calculator
# calculator 파일을 불러와서 쓰겠다. 모듈, 다른 파이썬 프로그램에서 불러와서 쓴다. 같은 폴더에 있는 py 파일(다른 폴더도 가능)
import calculator
print(calculator.add(2, 5))
pritn(calculator.multiply(3, 4))
import calculator as calc # calculator 대신 calc 를 사용 가능
from calculator import add, multiply # calculator 에서 add, multiply 함수만 불러와서 쓴다.
import calculator import * # 모든 함수 불러온다. (잘 사용 안함)
# 스탠다드 라이브러리 standard library (표준 라이브러리)
import math
print9math.log10(100))
print(math.cos(0))
pritn(math.pi)
import random
print(random.random()) # 랜덤한 숫자 생성
import os
print(os.getlogin()) # 컴퓨터에 어떤 계정으로 로그인 되어 있나 확인
print(os.getcwd()) # 현재 파일의 경로 확인
[import random]
# randint 함수
두 수 사이의 어떤 랜던한 정수를 리턴하는 함수
randint(a, b) 를 하면 a <= N <= b 를 만족한느 어떤 랜던함 정수 N을 리턴
import random
print(random.randint(1, 20))
print(random.randint(1, 20))
print(random.randint(1, 20))
print(random.randint(1, 20))
print(random.randint(1, 20))
8
3
6
6
2
# uniform 함수
두수 사이의 랜덤한 소수를 리턴
randint와 다른것은 정수가 아닌 소수 리턴
import random
print(random, uniform(0, 1))
print(random, uniform(0, 1))
print(random, uniform(0, 1))
print(random, uniform(0, 1))
0.00023902930293
0.0239019
0.209309230923092
0.0293029384
# datetime 모듈
날짜와 시간
datetime 값 생성
2020년 3월 14일 파이썬으로 표현
pi_day = datetime.datetime(2020, 3, 14)
print(pi_day)
print(type(pi_day))
2020-03-14 00:00:00
<class 'datetime.datetime'>
시간을 직접 정할 수 있음
pi_day = datetime.datetime(2020, 3, 14, 13, 6, 15)
print(pi_day)
print(type(pi_day))
2020-03-14 13:06:15
<class 'datetime.datetime'>
오늘 날짜
날짜와 시간을 정해 주는 게 아니라, 코드를 실행한 '지금 이 순간'의 날짜와 시간을 받아오고 싶다면?
today = datetime.datetime.now()
print(today)
print9type(today))
2020-04-05 17:49:12.360266
<class 'datetime.datetime'>
datetime 해부하기
datetime 값에서 '연도'나 '월'같은 값들을 추출하려면 어떻게 해야 할까요?
today = datetime.datetime.now()
print(today)
print(today.year) # 연도
print(today.month) # 월
print(today.day) # 일
print(today.hour) # 시
print(today.minute) # 분
print(today.second) # 초
print(today.microsecond) # 마이크로초
2020-04-05 17:59:21.709817
2020
4
5
17
59
21
709817
date 포맷팅
datetime 값을 출력하면 별로 예쁘지 않습니다. 하지만 strftime을 사용하면, 우리 입맛대로 바꿀 수 있습니다.
today = datetime.datetime.now()
print(today)
print(today.strftime("%A, %B %dth %Y"))
2020-04-05 18:09:55.233501
Sunday, April 05th 2020
포맷 코드설명예시
| %a | 요일 (짧은 버전) | Mon |
| %A | 요일 (풀 버전) | Monday |
| %w | 요일 (숫자 버전, 0~6, 0이 일요일) | 5 |
| %d | 일 (01~31) | 23 |
| %b | 월 (짧은 버전) | Nov |
| %B | 월 (풀 버전) | November |
| %m | 월 (숫자 버전, 01~12) | 10 |
| %y | 연도 (짧은 버전) | 16 |
| %Y | 연도 (풀 버전) | 2016 |
| %H | 시간 (00~23) | 14 |
| %I | 시간 (00~12) | 10 |
| %p | AM/PM | AM |
| %M | 분 (00~59) | 34 |
| %S | 초 (00~59) | 12 |
| %f | 마이크로초 (000000~999999) | 413215 |
| %Z | 표준시간대 | PST |
| %j | 1년 중 며칠째인지 (001~366) | 162 |
| %U | 1년 중 몇 주째인지 (00~53, 일요일이 한 주의 시작이라고 가정) | 35 |
| %W | 1년 중 몇 주째인지 (00~53, 월요일이 한 주의 시작이라고 가정) | 35 |
# input 사용자 입력 받기
name = input("이름을 입력하세요: ")
print(name)
이름을 입력하세요: Codeit
Codeit
x = input("숫자를 입력하세요: ")
print(x + 5)
input 함수가 받는 답변은 문자값으로 정수형으로 변환 필요
x = int(input("숫자를 입력하세요: ")
print(x + 5)
ex) 숫자 맞히기
import random
# 상수 정의
ANSWER = random.randint(1, 20)
NUM_TRIES = 4
# 변수 정의
guess = -1
tries = 0
while guess != ANSWER and tries < NUM_TRIES:
guess = int(input("기회가 {}번 남았습니다. 1-20 사이의 숫자를 맞혀보세요: ".format(NUM_TRIES - tries)))
tries += 1
if ANSWER > guess:
print("Up")
elif ANSWER < guess:
print("Down")
if guess == ANSWER:
print("축하합니다. {}번 만에 숫자를 맞히셨습니다.".format(tries))
else:
print("아쉽습니다. 정답은 {}입니다.".format(ANSWER))
# 파일 읽고 쓰기
1. 파일읽기
with open('data/chicken.txt', 'r') as f: # r은 read의 약자, w은 write의 약자, data는 디렉토리 경로
print(type(f))
<class '_io.TextIOWrapper'>
for line in f:
print(line)
print("Hello\n") # 백슬러시 n 이 들어가면 엔터가 들어가 빈줄이 생김
# strip 앞뒤로 있는 화이스 스페이스(스페이트, 엔터 등 공백)을 제거
print(" abc def ".strip())
abc def # 중간만 남음
prit(" \t \n abc def\n\n\n".strip())
abc def
with open('data/chcken.txt', 'r') as f:
for line in f:
print(line.strip()) # 줄공백 제거
# split
my_string = "1. 2. 3. 4. 5. 6"
print(my_string.split(".")) # 파라미터를 기준으로 문자열을 나눔
['1', ' 2', ' 3', ' 4', ' 5', ' 6'] # 문자열 사이에 띄어쓰기 발생
문자열 나누는 기준을 ". " # . 띄어쓰기로 변경
print(my_string.split(". "))
full_name = "Kim, Yuna"
print(full_name.split(", "))
['KIm', 'Yuna']
full_name = "Kim, Yuna"
print(full_name.split(", "))
last_name = name_data[0]
first_name = name_data[1]
print(first_name, last_name_
Yuna Kim
print(" \n\n 2 \t 3 \n 5 7 11 \n\n".split()) #화이트 스페이스 기준으로 나눌때 split() 으로
['2', '3', '5', '7', '11']
print(numbers[0] + numbers[1])
23 # 문자열 합
print(int(numbers[0] + numbers[1]))
5 # 정수 변환
ex) 한달 평균 매출액
with open('data/chicken.txt', 'r') as f:
total_revenue = 0
total_days = 0
for line in f:
data = line.strip().split(": ")
revenue = int(data[1])
total_revenue += revenue
total_days += 1
print(total_revenue / total_days)
# 파일 쓰기
with open('new_file.txt', 'w') as f: # 새로운 파일 생성
f.write("Hello world!\n") # 내용 기재, \n 은 줄 바꿈
f.write("My name is Codeit.\n")
기존의 파일에 추가하고 싶을 때
with open('new_file.txt', 'a') as f: # append 'a' 사용, 파일이 없어도 w 대신 a를 사용하여 파일 생성 가능
ex) 영어 단어 입력
with open('vocabulary.txt', 'w') as f:
while True:
english_word = input('영어 단어를 입력하세요: ')
if english_word == 'q' :
break
korean_word = input('한국어 뜻을 입력하세요: ')
if korean_word == 'q':
break
f.write('{}: {}\n'. format(english_word, korean_word))
ex) 단어 퀴즈
with open('vocabulary.txt', 'r') as f:
for line in f:
date = line.strip().split(": ")
english_word, korean_word = data[0], data[1]
guess = input("{}: ".format(korean_word))
if guess == english_word:
print("맞앗습니다!\n")
else:
print("아쉽습니다. 정답은 {}입니다.\n".format(english_word))
ex) 고급 단어장(랜덤)
import random
# 사전만들기
vocab = {}
with open('vocabulary.txt', 'r') as f:
for line in f:
date = line.strip().split(": ")
english_word, korean_word = data[0], data[1]
vocab[english_word] = korean_word
# 목록 가져오기
keys = list(vocab.keys())
# 문제 내기
while True:
# 랜덤한 문제 받아오기
index = random.randint(0, len(keys) -1)
english_word = keys[index]
korean_word = vocab[english_word]
# 유저 입력값 받기
guess = input("{}: ".format(korean_word))
# 프로그램 끝내기
if guess == 'q':
break
# 정답 확인하기
if guess == english_word:
print("정답입니다!\n")
else:
print("아쉽습니다. 정답은 {}입니다.\n").format(english_word)
ex) 로또
import random
def generate_numbers(n): #무작위 번호 추출 함수
my_numbers_list = [] #내 번호 리스트 생성
my_numbers = random.randint(1, 45)
for i in range(n): #n번 반복(리스트에 n개의 숫자가 들어가도록 함)
while my_numbers in my_numbers_list:
my_numbers = random.randint(1, 45)
my_numbers_list.append(my_numbers)
return my_numbers_list #for에 줄을 맞춰주어야 그만큼 반복 가능
def draw_winning_numbers():
winning_numbers = generate_numbers(6) #generate_numbers 함수 호출
bonus_number = random.randint(1, 45)
while bonus_number in winning_numbers:
bonus_number = random.randint(1, 45)
winning_numbers.append(bonus_number)
return winning_numbers
def count_matching_numbers(list_1, list_2): #파라미터로 리스트 2개를 받음
duplicated_list = [] #중복되는 리스트 생성
for i in list_1:
if i in list_2:
duplicated_list.append(i) #중복되는 요소만 리스트에 추가
return len(duplicated_list)
def check(my_numbers_list, winning_numbers_list): #파라미터로 리스트 2개를 받음
general_number = winning_numbers_list[0:6]
check_numbers = count_matching_numbers(my_numbers_list, general_number) #check_numbers는 중복되는 숫자의 개수
bonus_number = winning_numbers_list[6] #당첨번호의 7번째 번호는 보너스 번호
if check_numbers == 6:
return 1000000000
elif check_numbers == 5 and bonus_number in my_numbers_list:
return 50000000
elif check_numbers == 5:
return 1000000
elif check_numbers == 4:
return 50000
elif check_numbers == 3:
return 5000
else:
return 0
import random
# 무작위 번호 추출 함수
def generate_numbers(n):
# 내 번호 리스트 생성 => 내 번호라는 것은 semantic 한 이름에 조금 어긋납니다.
# 함수 이름이 숫자들 생성의 역할만 하는 것이기 때문입니다.
# 따라서 함수 이름도 numbers 가 더욱 적절해보이는군요!
numbers = []
# 아래 과정에서 my_numbers 라고 변수 이름을 명명하셨는데
# 무작위 숫자가 하나만 들어가므로 my_number 가 더 적절한 표현이겠죠? ㅎㅎ
# my_numbers = random.randint(1, 45)
# 어짜피 매번 while 문안에서 random number 를 생성해야하므로 다음과 같이 바꾸어 주는 게 좋겠습니다.
# 이중으로 반복문이 들어가는 것이 시간복잡도 면에서는 좋지 못하니까요! ㅎㅎ
i = 0
while i < n:
number = random.randint(1, 45)
# n번 반복(리스트에 n개의 숫자가 들어가도록 함)
if number not in numbers:
numbers.append(number)
i += 1
return numbers # for에 줄을 맞춰주어야 그만큼 반복 가능 => 의미전달이 조금 어려운 코멘트입니다.
def draw_winning_numbers():
# generate_numbers 함수 호출
# winning_numbers = generate_numbers(6)
# bonus_number = random.randint(1, 45)
# while bonus_number in winning_numbers:
# bonus_number = random.randint(1, 45)
# winning_numbers.append(bonus_number)
# 가독성이 비교적 모범답안 보다 좋지 못한 코드입니다.
# 되도록 이면 아래처럼 해주세요 ㅎㅎ
# 참! 위 코드에서는 앞의 6 개 숫자를 정렬하지 않으셨더라구요. 문제 요구 사항도 반영하는 것이 좋습니다.
winning_numbers = generate_numbers(7)
return sorted(winning_numbers[:6]) + winning_numbers[6:]
def count_matching_numbers(list_1, list_2): #파라미터로 리스트 2개를 받음
# 간결한 코드들은 다른 분들이 많이 써주신 거 같아요.
# 리스트 연산보다 숫자연산이 더 빠르기 때문에 조금 고쳐주었습니다.
# 매칭되는 갯수만 세주는 게 목적이므로 숫자만 있는 것이 좀 더 나을 거라 생각합니다.
# duplicated_list = [] #중복되는 리스트 생성
duplicated_numbers = 0
for i in list_1:
if i in list_2:
duplicated_numbers += 1
# duplicated_list.append(i) #중복되는 요소만 리스트에 추가
return duplicated_numbers
def check(my_numbers_list, winning_numbers_list): #파라미터로 리스트 2개를 받음
# 0은 생략해도 됩니다!
general_number = winning_numbers_list[:6]
check_numbers = count_matching_numbers(my_numbers_list, general_number) #check_numbers는 중복되는 숫자의 개수
bonus_number = winning_numbers_list[6] #당첨번호의 7번째 번호는 보너스 번호
# 커다란 문제가 있지 않지만, boolean 값 체크가 check_numbers 가 5고 보너스 넘버가 안 맞을 경우 4번 이루어 지네요.
# 아래 같이 하면 좀 더 낫지 않을까 생각합니다.
if check_numbers == 6:
return 1000000000
elif check_numbers == 5:
if bonus_number in my_numbers_list:
return 50000000
else:
return 1000000
elif check_numbers == 4:
return 50000
elif check_numbers == 3:
return 5000
else:
return 0
ex) 로또
i) 무작위 번호 생성
from random import randint
def generate_numbers(n):
numbers = []
while len(numbers) < n:
num = randint(1, 45)
if num not in numbers:
numbers.append(num)
return numbers
print(generate_numbers(6))
ii) 최종
from random import randint
def generate_numbers(n):
numbers = []
while len(numbers) < n:
new_number = randint(1, 45)
if new_number not in numbers:
numbers.append(new_number)
return numbers
def draw_winning_numbers():
winning_numbers = generate_numbers(7)
return sorted(winning_numbers[:6]) + winning_numbers[6:]
def count_matching_numbers(numbers, winning_numbers):
count = 0
for num in numbers:
if num in winning_numbers:
count += 1
return count
def check(numbers, winning_numbers):
count = count_matching_numbers(numbers, winning_numbers[:6])
bonus_count = count_matching_numbers(numbers, winning_numbers[6:])
if count == 6:
return 10000000
elif count == 5 and bonus_count == 1:
return 50000000
elif count == 5:
return 1000000
elif count == 4:
return 50000
elif count == 3:
return 5000
else:
return 0
ex) 야구게임
i) generate_numbers 무작위로 정답 번호 3개를 뽑는 함수
from random import randint
def generate_numbers(n):
numbers = []
while len(numbers) < n:
num = randint(0, 9)
if num not in numbers:
numbers.append(num)
print("0과 9사이의 서로 다른 숫자 3개를 랜덤한 순서로 뽑았습니다.\n")
return numbers
print(generate_numbers(3))
ii) take_guess 유저에게 번호 3개를 입력받는 함수
from random import randint
def generate_numbers():
numbers = []
while len(numbers) < 3:
num = randint(0, 9)
if num not in numbers:
numbers.append(num)
print("0과 9 사이의 서로 다른 숫자 3개를 랜덤한 순서로 뽑았습니다.\n")
return numbers
def take_guess():
print("숫자 3개를 하나씩 차례대로 입력하세요.")
new_guess = []
while len(new_guess) < 3:
new_num = int(input("{}번째 숫자를 입력하세요: ".format(len(new_guess) + 1)))
if new_num < 0 or new_num > 9:
print("범위를 벗어나는 숫자입니다. 다시 입력하세요.")
elif new_num in new_guess:
print("중복되는 숫자입니다. 다시 입력하세요.")
else:
new_guess.append(new_num)
return new_guess
iii) get_score 유저 번호 3개와 정답 번호 3개를 비교해서, 스트라이크와 볼 수를 계산하는 함수
def get_score(guesses, solution):
strike_count = 0
ball_count = 0
for i in range(3):
if guesses[i] == solution[i]:
strike_count += 1
elif guesses[i] in solution:
ball_count += 1
return strike_count, ball_count
return strike_count, ball_count
# 테스트
s_1, b_1 = get_score([2, 7, 4], [2, 4, 7])
print(s_1, b_1)
s_2, b_2 = get_score([7, 2, 4], [2, 4, 7])
print(s_2, b_2)
s_3, b_3 = get_score([0, 4, 7], [2, 4, 7])
print(s_3, b_3)
s_4, b_4 = get_score([2, 4, 7], [2, 4, 7])
print(s_4, b_4)