코딩일지/TIL: Today I Learned

20220907 TIL

야언 2022. 9. 7. 19:54

오늘의 한 일

  • 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칸으로 설정해서 스페이스바 공백 쓴다고 합니다.. 주의합시다

 

 

 

과제 숫자야구 만들기

 

 

https://yaun.tistory.com/161

 

20220907 숫자야구 게임

고려해야 할 사항 몇 자리 숫자(count)로 할 건지 입력받기 -> 받은 숫자를 이후의 함수에도 적용시켜야하는데?? -> 전역변수화 (global) count의 조건 3자리수 이상 10자리 수 이하 -> if 문 활용해 오류

yaun.tistory.com

 

3일차 강의에 배웠던 거의 모든 부분을 활용하는 난제였다.. 

일단 작동 방식을 구상한 뒤, 코드를 짜보고 감이 오지 않는 부분은 구글링을 통해 해결하는 방식으로 진행.

구글링 해서 찾을 수 있는 보통의 숫자야구 게임 코딩은 랜덤으로 뽑는 숫자의 자릿수가 3자리였는데, 이 부분부터 인풋받아서 코드를 구상해야 해서 뼈대를 찾고도 살을 굉장히 많이 붙여야하는 문제였다. 

정리 글에서도 볼 수 있듯이 크고 작은 오류들을 겪었는데 잘 해결해냈고, 결과도 만족스럽게 뽑혀서 기분이 좋다 ㅎㅎ