Aiffel: Day 6
오늘의 주제
Aiffel LMS : Fundamental 10. 다양한 데이터 전처리 기법
파이썬 코딩 도장 : Unit 31-32, 34-35
Aiffel LMS
Fundamental 10. 다양한 데이터 전처리 기법
파이썬 코딩 도장
Unit 31. 함수에서 재귀호출 사용하기
- 심사문제
def fib(n):
if n <= 1:
return n
else:
return fib(n-1)+fib(n-2)
n = int(input())
print(fib(n))
Unit 32. 람다 표현식 사용하기
- 심사문제
files = input().split()
a = list(map(lambda x: '{0:03d}'.format(int(x.split('.')[0]))+'.'+x.split('.')[1],files))
print(a)
--> 어떻게 풀어야 할 지 감이 안 잡혀서 구글링 했음,,
풀이: 리스트 files에는 문자열로 된 파일 이름이 들어갑니다. 이 리스트에서 모든 요소를 지정된 함수로 처리해야 하므로 map 함수를 사용해야 합니다.
먼저 람다 표현식을 작성할 때 매개변수로 받은 문자열을 조작해서 001.png, 099.docx, 100.xlsx 같은 형식이 되어야 합니다. 따라서 문자열 포매팅을 '{0:03d}.{1}'와 같이 만들어줍니다. 먼저 {0:03d}는 파일 이름 부분이며 숫자 1은 001, 99는 099, 100은 100처럼 숫자 3개로 만들고 앞에 0이 들어갑니다. 그리고 {1}은 확장자 부분이며 문자열이 그대로 들어갑니다.
이제 '{0:03d}.{1}'에 format 메서드를 사용해서 내용을 채웁니다. 먼저 문자열은 split('.')처럼 '.'을 기준으로 분리해서 파일 이름과 확장자로 나눕니다. 그리고 lambda에서 매개변수로 x를 지정했다면 int(x.split('.')[0])과 같이 파일 이름 부분을 얻습니다. 즉, 1.png는 split('.')으로 분리했을 때 리스트 ['1', 'png']가 나오는데 첫 번째 요소를 사용해야 하므로 [0]입니다. 그리고 {0:03d}에는 숫자가 들어가야 하므로 int를 사용해서 정수로 변환해줍니다.
확장자는 x.split('.')[1]처럼 문자열을 '.'으로 분리했을 때 두 번째 요소를 사용합니다. 람다 표현식에서는 새 변수를 사용할 수 없으므로 이렇게 매번 split 메서드를 사용하여 파일 이름과 확장자 부분을 얻어야 합니다.
마지막으로 출력 결과는 리스트 형태라 하므로 map 부분을 list로 묶어줍니다.
Unit 34. 클래스 사용하기
- 심사문제
class Annie:
def __init__(self, health, mana, ap):
self.health = health
self.mana = mana
self.ap = ap
def tibbers(self):
print('티버: 피해량', self.ap * 0.65 + 400)
health, mana, ap = map(float, input().split())
x = Annie(health=health, mana=mana, ap=ap)
x.tibbers()
Unit 35. 클래스 속성과 정적, 클래스 메서드 사용하기
- 심사문제
class Time:
def __init__(self, hour, minute, second):
self.hour = hour
self.minute = minute
self.second = second
@classmethod
def from_string(cls, time_string):
hour, minute, second = map(int, time_string.split(':'))
time = cls(hour, minute, second)
return time
@staticmethod
def is_time_valid(time_string):
hour, minute, second = map(int, time_string.split(':'))
return hour <= 24 and minute <= 59 and second <= 60
time_string = input()
if Time.is_time_valid(time_string):
t = Time.from_string(time_string)
print(t.hour, t.minute, t.second)
else:
print('잘못된 시간 형식입니다.')
--> 이것도 어려워서 구글링함,,,
풀이: Time 클래스에는 인스턴스 속성이 hour, minute, second가 있습니다. Time에 숫자를 넣어서 인스턴스를 만들면 되지만 여기서는 from_string 메서드를 사용하여 문자열로 인스턴스를 만들어야 합니다.
from_string 메서드는 Time.from_string처럼 호출하고 있고, 현재 클래스로 인스턴스를 만들어야 하므로 클래스 메서드로 만듭니다. 따라서 메서드 위에 @classmethod를 붙여준 뒤 첫 번째 매개변수에 cls를 지정하고, 두 번째 매개변수로 날짜 문자열 time_string을 지정합니다. 메서드 안에서는 hour, minute, second = map(int, time_string.split(':'))와 같이 ':'로 문자열을 분리한 뒤 int로 변환해서 각 변수에 넣어줍니다. 그다음에는 time = cls(hour, minute, second)와 같이 클래스에 변수를 넣어서 인스턴스를 만듭니다. 여기서 cls(hour, minute, second)는 Time(hour, minute, second)와 같습니다. 그리고 인스턴스는 바깥에서 사용할 수 있도록 return으로 반환해줍니다. 만약 정적 메서드로 만들었다면 cls를 받지 않았으므로 인스턴스를 만들 때는 Time(hour, minute, second)로 만들면 됩니다.
is_time_valid 메서드도 Date.is_time_valid처럼 호출하고 있지만, 문자열이 올바른 시간인지 검사만 하면 되고, 클래스에 접근할 필요는 없습니다. 그러므로 정적 메서드로 만듭니다. 먼저 메서드 위에 @staticmethod를 붙여준 뒤 첫 번째 매개변수로 날짜 문자열 time_string을 지정합니다. 메서드 안에서는 hour, minute, second = map(int, time_string.split(':'))와 같이 ':'로 문자열을 분리한 뒤 int로 변환해서 각 변수에 넣어줍니다. 그다음에는 return hour <= 24 and minute <= 59 and second <= 60과 같이 시간이 24 이하이고 분이 59 이하이면서 초가 60 이하인지 검사하고 결과를 반환하도록 만들면 됩니다. 즉, 시, 분, 초 모두 만족하면 True가 반환되고 하나라도 만족하지 않으면 False가 반환됩니다.
Author And Source
이 문제에 관하여(Aiffel: Day 6), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@nickim/Aiffel-Day-6저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)