TIL(24.12.05)

채채·2024년 12월 5일

Today I Learned

목록 보기
24/75

개별 과제 리뷰

1. 숫자맞추기

운 좋게 당첨되어 코드 피드백 받음.
도전과제 추가하려니 자꾸 코드가 고장나서 다른 분들한테도 물어보고, 머리도 멍해지고 힘들었지만 완성한 보람을 살짝 느꼈음.

튜터님 feedback 내용
1. 변수명은 쉽게 알아보기 좋은 것으로 정할것. ex)user_input
2. if를 두 번 쓰면 컴퓨터는 다른 단락으로 이해해서 if를 다 검사함 ->시간복잡도? , 성능? 등에 영향을 미칠 수 있음. elif활용.
3. 정답인 부분은 else로 처리하지말고 명확하게 하는게 좋음. (이 코드에선 다른 예외가 없어서 else해도 되지만, 큰플젝에선 다른 예외가 있을수도 있고, 조건을 명확히 해줘야 다른 사람들도 한눈에 파악할 수 있음.)

  • 사실 변수명을 Question_num과 Answer_num의 의미를 담아 줄임말로 Q_num, A_num으로 정했었는데, 나만 알아보는건 의미가 없다는 걸 한 번 더 느낌 .(소통의 중요함) 개발은 여러 사람들과 함께 진행하기 때문에, 주석으로 달아놓던가, 설명 없이도 다 알아볼 수 있는 변수명을 선택하는 것이 중요할 것 같음.

  • if를 두 번 쓴 건, 다른 단락으로 구분지으려고 한 의도가 맞음. 숫자의 범위를 지정한 부분(1~10사이의 숫자입력)과 게임내에서 숫자의 크기를 판별하는 부분을 구분해야 한다고 생각했었는데, 튜터님 말씀을 들어보니 굳이 구분하지 않고, elif로 묶었어도 됐었음.
    어차피 받은 input 값에서 판별하는 거라 상관없는 것 같음.

  • 마지막 조건은 귀찮기도하고, else도 있으니 else로 처리했는데 다음부턴 조건을 더 자세히 쓸 필요가 있겠음.

  • 피드백 된 코드

import random

while True :
    random_num = random.randint(1,10) 
    print('랜덤 숫자 1~10이 생성됩니다 맞춰보세요')
    while True:
        try :
            user_num = int(input('예상숫자 >> '))
            if not (1 <= user_num <= 10):
                print("1과 10 사이의 숫자를 입력해주세요!")
                continue
            elif random_num < user_num :
                print('떙! 너무 커요')  
            elif random_num > user_num :
                print('땡! 너무 작아요')
            elif random_num == user_num :
                print('딩동댕 정답입니다.')
                break
        except ValueError :
            print('잘못된 입력입니다. 숫자를 입력하세요')
    while True : 
        re_game = input('한 판 더 ? (y/n) >> ').lower()
        if re_game == 'y' :
            break
        elif re_game == 'n' :
            print('끝!')
            break
        else :
            print('잘 못 입력하셨습니다. y나 n을 입력해주세요')
            continue
    if re_game == 'n' :
        break



2. 클래스와 함수 사용하기

2번부턴 문제가 아주 많았음.
잘 된 코드와 내 코드를 비교해보니 차이가 어마어마했음.
우선, 이름과 나이, 성별 받는 부분을 다 함수화 해서 클래스 안에 넣어놔야함.
과제가 '클래스' 라는 것을 간과하고, 문제를 이 파일 속 짧은 코드에서만 실행되도록 만든게 패착이었던 것 같음.
클래스 안에 함수를 정의해놓아야, 다른 코드에서 한번에 불러올 수 있는데, input를 다 따로 빼버려서 나의 person 클래스는 반쪽짜리 클래스가 되었음.

이름을 한글, 영어 등으로만 받게 하는 조건과, 나이를 0에서 120으로 제한하는 조건 넣기는 일단 제외하고, 클래스 안에 이름, 나이, 성별 함수를 정의하여 불러오고 실행해 봄.

  • 해설강의 보고 수정해 본 코드
class person : 
    def __init__(self, name, gender, age) :
        self.name = name
        self.gender = gender
        self.age = age

    def get_name() :
        print("정보를 입력해주세요. \n(성별은 'male' 또는 'female'로 표기)")  
        name = input("이름: ")
        return name
    
    def get_age() :
        while True :
            try :
                age = int(input("나이: "))
                return age
            except ValueError :
                print('숫자를 입력해주세요')

    def get_gender() :
        while True: 
            gender = input("성별: ").lower()
            if gender in ['male', 'female'] :
                return gender
            else :
                print('잘 못 입력하셨습니다. male 또는 female을 입력하세요')

    def display(self) :
        print(f"이름: {self.name}, 성별: {self.gender} \n나이: {self.age} ")
    
    def greet(self) :
        if age > 19 :
            print(f"안녕하세요, {self.name}! 성인이시군요!")
        else :
            print(f"안녕하세요, {self.name}! 미성년자시군요!")


name = person.get_name()
age = person.get_age()
gender = person.get_gender()

user= person(name, gender, age)
user.display()
user.greet()



3. 라이브러리 사용하여 데이터분석하기

이 문제는 단순노동으로 푼 부분이 많았는데, 파이썬 강의 때 배웠던 for문을 이용할 생각을 못했음.
이렇게도 활용할 수 있구나를 깨닳았음.

  • 해설 강의보고 수정해 본 코드
import pandas as pd                                      

df_excel = pd.read_excel("C:/Users/heeky/Downloads/관서별 5대범죄 발생 및 검거.xlsx")
df_excel

gu = {'서대문서': '서대문구', '수서서': '강남구', '강서서': '강서구', '서초서': '서초구',
'서부서': '은평구', '중부서': '중구', '종로서': '종로구', '남대문서': '중구',
'혜화서': '종로구', '용산서': '용산구', '성북서': '성북구', '동대문서': '동대문구',
'마포서': '마포구', '영등포서': '영등포구', '성동서': '성동구', '동작서': '동작구',
'광진서': '광진구', '강북서': '강북구', '금천서': '금천구', '중랑서': '중랑구',
'강남서': '강남구', '관악서': '관악구', '강동서': '강동구', '종암서': '성북구', 
'구로서': '구로구', '양천서': '양천구', '송파서': '송파구', '노원서': '노원구', 
'방배서': '서초구', '은평서': '은평구', '도봉서': '도봉구'}

df_excel['구별']=df_excel['관서명'].map(gu)

df1=df_excel.fillna('구 없음')

pivot = pd.pivot_table(df1, index='구별', aggfunc = 'sum')
pivot = pivot.drop(columns = ['관서명'])
df2 = pivot.drop('구 없음')
df2

for crime in ['강간', '강도', '살인', '절도','폭력'] : 
    df2[f'{crime} 검거율'] = df2[f'{crime}(검거)'] / df2[f'{crime}(발생)'] *100
    
df2['검거율']=df2['소계(검거)']/df2['소계(발생)']*100
df2

for delete_columns in ['강간(검거)','강도(검거)','살인(검거)','절도(검거)','폭력(검거)','소계(발생)','소계(검거)']:
    if delete_columns in df2:
        del df2[delete_columns]
df2

df2.rename(columns={'강간(발생)':'강간',
'강도(발생)':'강도',
'살인(발생)':'살인',
'절도(발생)':'절도',
'폭력(발생)':'폭력'})

df_csv = pd.read_csv("C:/Users/heeky/Downloads/pop_kor.csv", index_col='구별')

df_csv

df3 = df2.join(df_csv)

df3.sort_values(by='검거율', ascending=True)



4. 최종 소감

시행착오도 많았고, 결과적으로 많이 틀렸지만 그래도 무지렁이가 도전과제까지 어떻게든 구현해냈으니 충분히 잘했따 나자신 !
남은 수업도 열심히 잘 따라가도록 해보자 !

profile
화이팅

0개의 댓글