오늘의 한 일
- python 강의 3일차
- 과제 숫자야구 만들기
python 강의
반복문 for, while
- for문
- list, tuple, set 자료형의 요소들로 반복문을 사용할 수 있습니다.
numbers = [1, 2, 3, 4]
for number in numbers:
print(number)
# result print
"""
1
2
3
4
"""
members = ("lee", "kim", "park")
for member in members:
print(member)
# result print
"""
lee
kim
park
"""
-
- enumerate()를 사용해 반복되는 요소가 몇번째인지 확인할 수 있습니다.
members = ["lee", "park", "kim"]
for i, member in enumerate(members):
print(f"{member}는 {i}번째 회원입니다.")
# result print
"""
lee는 0번째 회원입니다.
park는 1번째 회원입니다.
kim는 2번째 회원입니다.
"""
-
- dictionary 자료형의 key 혹은 value로 반복문을 사용할 수 있습니다.
products = {
"bread": 1000,
"milk": 3000,
"egg": 6000,
"drink": 1500
}
for k in products: # key만 사용할 때
print(k)
for v in products.values(): # value만 사용할 때
print(v)
for k, v in products.items(): # key, value 모두 사용할 때
print(k, v)
# result print
"""
bread
milk
egg
drink
1000
3000
6000
1500
bread 1000
milk 3000
egg 6000
drink 1500
"""
-
- range() 함수를 활용하면 원하는 만큼 반복문을 사용할 수 있습니다.
# range에 지정한 값만큼 반복되며, i에는 0부터 지정한 값-1까지의 값이 할당됩니다.
for i in range(5):
print(i)
# result print
"""
0
1
2
3
4
"""
-
- continue를 활용해 특정 상황에서 아무런 동작도 하지 않고 넘어갈 수 있습니다.
numbers = [24, 75, 12, 54, 30, 70, 99]
for number in numbers:
if number <= 50: # number가 50보다 작거나 같은 경우
continue # 아무런 동작도 하지 않고 다음으로 넘어감
print(f"{number}는 50보다 큰 숫자입니다!")
# result print
"""
75는 50보다 큰 숫자입니다!
54는 50보다 큰 숫자입니다!
70는 50보다 큰 숫자입니다!
99는 50보다 큰 숫자입니다!
"""
-
- break를 활용해 특정 상황에서 반복문을 중지시킬수 있습니다.
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
for number in numbers:
if number >= 4: # number가 4보다 크거나 같은 경우
break # 반복문을 중지
print(number)
# result print
"""
1
2
3
"""
- while문
- 사용방법은 for문과 크게 다르지 않지만, 조건을 다루는 방식에 차이가 있습니다.
# while문은 조건이 참일 경우 계속해서 실행됩니다.
# 때문에 아래와 같이 코드를 작성할 경우, 무한 루프(infinity loop)에 빠지게 됩니다.
while True:
print("hello world")
-
- 대부분의 경우 while문은 반복 할 횟수가 정해져 있지 않을 때 사용합니다.
while True:
user_input = input("번호를 입력하세요. 종료 : 0") # 사용자의 input을 받는 함수
if user_input == "0":
break
print(f"{user_input}번을 입력하셨습니다!")
자주 사용되는 모듈 및 패턴
- type() / 값의 자료형 확인해보기
integer = 10
float_ = 1.23
string = "hello world!!"
list_ = [1, 2, 3]
tuple_ = (1, 2, 3)
set_ = {1, 2, 3}
dictionary = {"key": "value"}
boolean = True
print(type(integer)) # <class 'int'>
print(type(float_)) # <class 'float'>
print(type(string)) # <class 'str'>
print(type(list_)) # <class 'list'>
print(type(tuple_)) # <class 'tuple'>
print(type(set_)) # <class 'set'>
print(type(dictionary)) # <class 'dict'>
print(type(boolean)) # <class 'bool'>
- split() / string을 list로 변환하기
# split은 string.split("구분자")로 구성되어 있습니다.
string = "hello/python/world!!"
string_list = string.split("/") # split() 안에 들어간 값을 기준으로 문자를 나눈다.
print(string_list) # ['hello', 'python', 'world!!']
- join() / list를 string으로 변환하기
# join은 "사이에 들어갈 문자".join(리스트) 로 구성되어 있습니다.
string_list = ["hello", "python", "world"]
string = "!! ".join(string_list)
print(string) # hello!! python!! world
- replace() / 문자 바꾸기
- pprint() / 코드 예쁘게 출력하기
# pprint는 pretty print의 약자이며, 데이터를 더 예쁘게 출력해 준다.
from pprint import pprint
sample_data = {
"id": "0001",
"type": "donut",
"name": "Cake",
"ppu": 0.55,
"batters":
{
"batter":
[
{"id": "1001", "type": "Regular"},
{"id": "1002", "type": "Chocolate"},
{"id": "1003", "type": "Blueberry"},
{"id": "1004", "type": "Devil's Food"}
]
},
"topping":
[
{"id": "5001", "type": "None"},
{"id": "5002", "type": "Glazed"},
{"id": "5005", "type": "Sugar"},
{"id": "5007", "type": "Powdered Sugar"},
{"id": "5006", "type": "Chocolate with Sprinkles"},
{"id": "5003", "type": "Chocolate"},
{"id": "5004", "type": "Maple"}
]
}
pprint(sample_data) # print로 출력했을 때와 결과 비교해 보기!!
- random / 랜덤한 로직이 필요할 때
# 난수 생성, 임의의 번호 생성 등 랜덤한 동작이 필요할 때 사용된다.
import random
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
random.shuffle(numbers) # numbers를 무작위하게 섞기
print(numbers) # [2, 8, 6, 4, 3, 7, 1, 5]
random_number = random.randint(1, 10) # 1 ~ 10 사이의 무작위 번호 생성
print(random_number) # 4
- time / 시간 다루기
# 함수의 실행 시간을 측정하는 등 시간을 다룰 때 사용되는 모듈이다.
import time
start_time = time.time() # 현재 시간 저장
time.sleep(1) # 1초간 대기
end_time = time.time()
# 코드가 종료된 시간 - 코드가 시작된 시간으로 실행 시간 구하기 (단위 : 초)
print(f"코드 실행 시간 : {end_time-start_time:.5f}") # 코드 실행 시간 : 1.00100
- datetime / 날짜 다루기
from datetime import datetime, timedelta
# 현재 날짜 및 시간 출력
print(datetime.now()) # 2022-09-04 03:55:32.277095
# datetime의 format code, 더 제세한건 여기
'''
%y : 두 자리 연도 / 20, 21, 22
%Y : 네 자리 연도 / 2020, 2021, 2022
%m : 두 자리 월 / 01, 02 ... 11 ,12
%d : 두 자리 일 / 01, 02 ... 30, 31
%I : 12시간제 시간 / 01, 02 ... 12
%H : 24시간제의 시간 / 00, 01 ... 23
%M : 두 자리 분 / 00, 01 ... 58, 59
%S : 두 자리 초 / 00, 01 ... 58, 59
'''
# string을 datetime 날짜로 변경하기
string_datetime = "22/12/25 13:20"
datetime_ = datetime.strptime(string_datetime, "%y/%m/%d %H:%M")
print(datetime_) # 2022-12-25 13:20:00
# datetime 날짜를 string으로 변환하기
now = datetime.now()
string_datetime = datetime.strftime(now, "%y/%m/%d %H:%M:%S")
print(string_datetime) # 22/09/04 04:04
# 3일 전 날짜 구하기
three_days_ago = datetime.now() - timedelta(days=3)
print(three_days_ago) # 2022-09-01 04:07:48.526502
지금까지 배운 문법들을 활용해 로또 번호를 뽑는 코드 작성하기
import random
lotto = set() # lotto 변수를 set 자료형으로 선언
def get_lotto_number(count):
result = []
if count < 1:
print("1 이상의 값을 입력해주세요")
for _ in range(count): # count만큼 반복해서 실행
lotto = set()
while len(lotto) < 8: # lotto의 요소 갯수가 8 이하일 경우 계속해서 반복
lotto.add(random.randint(1, 45)) # lotto에 1~45 사이의 랜덤 값을 입력
result.append(lotto)
return result
lotto_numbers = get_lotto_number(10)
print(lotto_numbers)
# result print
"""
[
{1, 3, 4, 6, 9, 44, 18, 22, 26},
{2, 5, 9, 11, 44, 45, 19, 23, 28},
{1, 4, 39, 41, 16, 18, 27, 29, 31},
{2, 5, 8, 9, 14, 20, 22, 24, 31},
{33, 37, 6, 40, 41, 42, 19, 30, 31},
{33, 1, 36, 8, 41, 9, 17, 24, 30},
{5, 39, 41, 10, 12, 16, 23, 25, 26},
{3, 35, 37, 11, 14, 17, 19, 20, 30},
{33, 35, 3, 11, 43, 15, 16, 27, 30},
{33, 36, 38, 6, 43, 24, 25, 30, 31}
]
"""
# 랜덤 값을 사용하기 때문에 코드를 실행할 때마다 결과는 달라집니다.
+ 내가 짠 로또번호생성기
P.S. 공백 만들 시에 탭 공백 vs 스페이스바 공백
보통 탭공백을 스페이스바 4칸으로 설정해서 스페이스바 공백 쓴다고 합니다.. 주의합시다
과제 숫자야구 만들기
3일차 강의에 배웠던 거의 모든 부분을 활용하는 난제였다..
일단 작동 방식을 구상한 뒤, 코드를 짜보고 감이 오지 않는 부분은 구글링을 통해 해결하는 방식으로 진행.
구글링 해서 찾을 수 있는 보통의 숫자야구 게임 코딩은 랜덤으로 뽑는 숫자의 자릿수가 3자리였는데, 이 부분부터 인풋받아서 코드를 구상해야 해서 뼈대를 찾고도 살을 굉장히 많이 붙여야하는 문제였다.
정리 글에서도 볼 수 있듯이 크고 작은 오류들을 겪었는데 잘 해결해냈고, 결과도 만족스럽게 뽑혀서 기분이 좋다 ㅎㅎ