[Python] 5장 파이썬 날개 달기 연습문제 풀이

미남로그·2021년 10월 26일
0
post-thumbnail

5장 정리

1️⃣ 클래스
2️⃣ 예외 처리
3️⃣ 내장 함수
4️⃣ 라이브러리
5️⃣ 연습문제


Q1

다음은 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

정답 👍


Q2

객체변수 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의 위치를 잘못 선정했다.


Q3

다음 결과를 예측해 보자.

>>> all([1, 2, abs(-3)-3])
>>> chr(ord('a')) == 'a'

풀이

  1. False
  2. True

정답 👍

이유는 1번의 경우 abs(-3)은 -3의 절댓값이므로 3이 되어 all([1,2,0])이 되고, 리스트의 요솟값 중 0이 있어서 all은 False가 됨(all은 모든 값이 True여야 True 반환하는 내장함수)

2번의 경우 ord('a')의 경우 정수로 반환되고(반환되는 정수는 97이라고 합니다.), 다시 chr(정수)로 치환되기 때문에 'a'가 나올 것이라 예상.

'a'=='a'가 되어 True 반환


Q4

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>이란 결괏값이 나온다.


Q5

234라는 10진수의 16진수는 다음과 같이 구할 수 있다.

>>> hex(234)
'0xea'

이번에는 반대로 16진수 문자열 0xea를 10진수로 변경해 보자.

※ 내장 함수 int를 활용해 보자.

풀이

print(int(0xea))

맞았음😳 하지만 교재와 정답은 다름

교재 정답 👇

print(int('0xea', 16))

int 뒤에 16진수라는 것을 알려줘도 되나보다.


Q6

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 문제 한 번에 맞췄는데, 왜 다시 틀렸을까... 다시 공부해야 할 듯 하다.


Q7

다음 리스트의 최댓값과 최솟값의 합을 구해 보자.

[-8, 2, 7, 5, -3, 5, 0, 1]

풀이

data = [-8, 2, 7, 5, -3, 5, 0, 1]
print(max(data)+min(data))

정답 👍


Q8

17 / 3의 결과는 다음과 같다.

>>> 17 / 3
5.666666666666667

위와 같은 결괏값 5.666666666666667을 소숫점 4자리까지만 반올림하여 표시해 보자.

풀이

num = 17 / 3
print(round(num, 4))

정답 👍


Q9

다음과 같이 실행할 때 입력값을 모두 더하여 출력하는 스크립트(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는 아직도 낯설다.


Q10

os 모듈을 사용하여 다음과 같이 동작하도록 코드를 작성해 보자.

  1. C:\doit 디렉터리로 이동한다.
  2. dir 명령을 실행하고 그 결과를 변수에 담는다.
  3. dir 명령의 결과를 출력한다.

풀이

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())

Q11

glob 모듈을 사용하여 C:\doit 디렉터리의 파일 중 확장자가 .py인 파일만 출력하는 프로그램을 작성해 보자.

풀이

import glob
print(glob.glob('C:/doit/*.py'))

정답 👍


Q12

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'로 적어주지 않아서 틀렸다.


Q13

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)

복습할 것

  1. filter, lambda, list, map
  2. if문
profile
미남이 귀엽죠

0개의 댓글