1️⃣ 클래스
2️⃣ 예외 처리
3️⃣ 내장 함수
4️⃣ 라이브러리
5️⃣ 연습문제
다음은 Calculator 클래스이다.
class Calculator:
def __init__(self):
self.value = 0
def add(self, val):
self.value += val
위 클래스를 상속하는 UpgradeCalculator를 만들고 값을 뺄 수 있는 minus 메서드를 추가해 보자. 즉, 다음과 같이 동작하는 클래스를 만들어야 한다.
cal = UpgradeCalculator()
cal.add(10)
cal.minus(7)
print(cal.value) # 10에서 7을 뺀 3을 출력
풀이
class UpgradeCalculator(Calculator):
def minus(self, val):
self.value -= val
정답 👍
객체변수 value가 100 이상의 값은 가질 수 없도록 제한하는 MaxLimitCalculator 클래스를 만들어 보자. 즉, 다음과 같이 동작해야 한다.
cal = MaxLimitCalculator()
cal.add(50) # 50 더하기
cal.add(60) # 60 더하기
print(cal.value) # 100 출력
단 반드시 다음과 같은 Calculator 클래스를 상속해서 만들어야 한다.
class Calculator:
def __init__(self):
self.value = 0
def add(self, val):
self.value += val
풀이
class MaxLimitCalculator(Calculator):
def add(self, val):
if self.value >= 100:
return 100
self.value += val
틀렸음😳
정답 👇
class MaxLimitCalculator(Calculator):
def add(self, val):
self.value += val
if self.value > 100:
self.value = 100
이 문제의 경우 내가 헷갈렸던 것은 두 가지이다.
if문을 어디에 쓰냐가 중요한데, 먼저 조건문을 넣은 다음에 self.value += val 을 넣어줘야 self.value 계산 후에 if문이 실행된다고 이상하게 반대로 생각했다. 클래스 안의 메서드(함수)를 정의내리는 과정인데 for문과 헷갈렸다. 그리고 기본적으로 if문이 return 되었으면 끝나는 건데, 아예 self.value += val
의 위치를 잘못 선정했다.
다음 결과를 예측해 보자.
>>> all([1, 2, abs(-3)-3])
>>> chr(ord('a')) == 'a'
풀이
정답 👍
이유는 1번의 경우 abs(-3)
은 -3의 절댓값이므로 3이 되어 all([1,2,0])
이 되고, 리스트의 요솟값 중 0이 있어서 all은 False가 됨(all은 모든 값이 True여야 True 반환하는 내장함수)
2번의 경우 ord('a')
의 경우 정수로 반환되고(반환되는 정수는 97이라고 합니다.), 다시 chr(정수)
로 치환되기 때문에 'a'가 나올 것이라 예상.
'a'=='a'
가 되어 True 반환
filter와 lambda를 사용하여 리스트 [1, -2, 3, -5, 8, -3]에서 음수를 모두 제거해 보자.
풀이
data = [1, -2, 3, -5, 8, -3]
def positive_integer(x):
return x > 0
print(filter(lambda x: x > 0, data))
틀렸음😳
다시 푼 부분 👇
data = [1, -2, 3, -5, 8, -3]
def positive_integer(x):
return x > 0
print(list(filter(lambda x: x > 0, data)))
교재 정답 👇
print(list(filter(lambda x:x>0, [1, -2, 3, -5, 8, -3])))
또 헷갈렸던 부분, filter는 그냥 필터링 해주는 기능이라 생각했다가 함수를 이용해서 참인 것만 돌려주는 내장 함수라고 공부했던 것이 기억나서 positive_integer(x)
라는 함수를 뜬금 없이 만들었고, 매개변수 x 값을 이용해서 lambda를 사용해야 된다고 생각했다.
하지만 교재 정답을 보면 그렇게 복잡하게 사용하지 않아도 됨이 나오고, filter 뒤에 list로 묶어주지 않아서 정답이 나오지 않았다.
첫 번째 오답은 <filter object at 0x000001CC46EA3E20>
이란 결괏값이 나온다.
234라는 10진수의 16진수는 다음과 같이 구할 수 있다.
>>> hex(234)
'0xea'
이번에는 반대로 16진수 문자열 0xea를 10진수로 변경해 보자.
※ 내장 함수 int를 활용해 보자.
풀이
print(int(0xea))
맞았음😳 하지만 교재와 정답은 다름
교재 정답 👇
print(int('0xea', 16))
int 뒤에 16진수라는 것을 알려줘도 되나보다.
map과 lambda를 사용하여 [1, 2, 3, 4] 리스트의 각 요솟값에 3이 곱해진 리스트 [3, 6, 9, 12]를 만들어 보자.
풀이
print(filter(map(lambda x: x*3, [1,2,3,4])))
틀렸음😳
정답 👇
print(list(map(labmda x: x*3, [1,2,3,4])))
저번엔 filter, lambda 문제 한 번에 맞췄는데, 왜 다시 틀렸을까... 다시 공부해야 할 듯 하다.
다음 리스트의 최댓값과 최솟값의 합을 구해 보자.
[-8, 2, 7, 5, -3, 5, 0, 1]
풀이
data = [-8, 2, 7, 5, -3, 5, 0, 1]
print(max(data)+min(data))
정답 👍
17 / 3의 결과는 다음과 같다.
>>> 17 / 3
5.666666666666667
위와 같은 결괏값 5.666666666666667을 소숫점 4자리까지만 반올림하여 표시해 보자.
풀이
num = 17 / 3
print(round(num, 4))
정답 👍
다음과 같이 실행할 때 입력값을 모두 더하여 출력하는 스크립트(C:\doit\myargv.py)를 작성해 보자.
C:\> cd doit
C:\doit> python myargv.py 1 2 3 4 5 6 7 8 9 10
55
※ 외장 함수 sys.argv를 사용해 보자.
적지 못했음😳
정답 👇
import sys
num = sys.argv[1:] # 파일 이름을 제외한 명령 행의 모든 입력
result = 0
for i in num:
result += int(number)
print(result)
sys는 아직도 낯설다.
os 모듈을 사용하여 다음과 같이 동작하도록 코드를 작성해 보자.
풀이
import os
os.chdir('C:/doit') # 1번. C:\doit 이라는 디렉터리로 이동
os.system('dir') # 필요 없는 코드
f = os.popen('dir') # 2번
print(f.read()) # 3번
애매하게 반은 맞고 반은 틀렸음😳
교재 정답 👇
import os
os.chdir('C:/doit')
f = os.popen('dir')
print(f.read())
glob 모듈을 사용하여 C:\doit 디렉터리의 파일 중 확장자가 .py인 파일만 출력하는 프로그램을 작성해 보자.
풀이
import glob
print(glob.glob('C:/doit/*.py'))
정답 👍
time 모듈을 사용하여 현재 날짜와 시간을 다음과 같은 형식으로 출력해 보자.
2018/04/03 17:20:32
풀이
import time
time.strftime(%c, time.localtime(time.time()))
틀렸음😳
다시 써 본 정답 👇
import time
time.strftime("%Y/%m/%d %H:%M:%S", time.localtime(time.time()))
2021/10/26 10:33:39
이 나오는데
import time
print(time.strftime("%Y/%m/%d %H:%M:%S"))
이렇게만 적어도 같은 답이 나옵니다.
원래 적은 오답의 경우는 Tue Oct 26 10:34:46 2021
이 나오는데, 그 전에 format 형식 %c
를 '%c'
로 적어주지 않아서 틀렸다.
random 모듈을 사용하여 로또 번호(1~45 사이의 숫자 6개)를 생성해 보자(단 중복된 숫자가 있으면 안 됨).
풀이
import random
lotto = []
for i in range(6):
num = random.randint(1,45)
lotto = lotto.append(num)
틀렸음😳
틀린 부분은 중복된 숫자가 있으면 안 된다는 조건문을 넣지 못했다. 어떻게 해야 할 지 몰라서 안 적은 거긴 한데... 아직도 if문을 잘 못 떠올리는 것 같다.
다시 적어본 정답 👇
import random
lotto = []
for i in range(6):
num = random.randint(1,45)
if num not in lotto:
lotto.append(num)
print(lotto)
정답 👍
if문을 어디에 넣어야 하는지, 조건을 어떻게 설정해야 하는지 다시 공부해야 할 것 같다.
그리고 append 한 걸 다시 lotto = lotto.append(num)
의 색으로 해줘야하는 줄 알았는데, 그렇게 안 해도 for문이기 때문에 반복되며 추가되는 것 같음.
교재의 정답 👇
import random
result = []
while len(result) < 6:
num = random.randint(1, 45) # 1부터 45까지의 난수 발생
if num not in result:
result.append(num)
print(result)