Aiffel: Day 6

4085 단어 AIFFELAIFFEL

오늘의 주제
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가 반환됩니다.

좋은 웹페이지 즐겨찾기