운 좋게 당첨되어 코드 피드백 받음.
도전과제 추가하려니 자꾸 코드가 고장나서 다른 분들한테도 물어보고, 머리도 멍해지고 힘들었지만 완성한 보람을 살짝 느꼈음.
튜터님 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번부턴 문제가 아주 많았음.
잘 된 코드와 내 코드를 비교해보니 차이가 어마어마했음.
우선, 이름과 나이, 성별 받는 부분을 다 함수화 해서 클래스 안에 넣어놔야함.
과제가 '클래스' 라는 것을 간과하고, 문제를 이 파일 속 짧은 코드에서만 실행되도록 만든게 패착이었던 것 같음.
클래스 안에 함수를 정의해놓아야, 다른 코드에서 한번에 불러올 수 있는데, 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()
이 문제는 단순노동으로 푼 부분이 많았는데, 파이썬 강의 때 배웠던 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)
시행착오도 많았고, 결과적으로 많이 틀렸지만 그래도 무지렁이가 도전과제까지 어떻게든 구현해냈으니 충분히 잘했따 나자신 !
남은 수업도 열심히 잘 따라가도록 해보자 !