본문 바로가기
코딩 이야기/파이썬(Python)

파이썬(Python) – 초보 탈출 예제 풀이 (1/2)

by 아재코더 2021. 12. 17.
파이썬 - 연습문제

그동안 살펴본 파이썬 기초 문법에 대해 예제풀이(총 20문항)를 진행코자 합니다. 제가 풀어낸 과정보다 훨씬 효율적인 방법이 있으리라 생각되지만, 지금의 제 수준에서 이해한 대로 풀이를 진행했습니다. ​예제를 풀어보며 제가 느낀 점이 있다면 당분간은 파이썬 관련 자료를 계속 찾아보고, 확인해가며 반복 숙달 학습이 필요한 단계임을 알았습니다. 제가 잘못 이해하거나 보강해야 할 부분이 있으면 댓글로 남겨 주시기 바랍니다.

 

Q1. 문자열 ‘a:b:c:d’를 split, join 함수를 이용 ‘a#b#c#d’로 바꿔봅니다.

>>> a='a:b:c:d'

>>> a=a.split(':')

>>> a

['a', 'b', 'c', 'd']

>>> a='#'.join(a)

>>> a

'a#b#c#d'

 

Q2. 딕셔너리에 ‘C’를 추출할 때 발생하는 에러 대신에 70을 얻을 수 있도록 수정해 봅니다.

>>> a

{'A': 90, 'B': 80}

>>> a['C']

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

KeyError: 'C'

>>> try : a['C']

... except KeyError : a['C']=70

...

>>> a

{'A': 90, 'B': 80, 'C': 70}

저는 예외 처리 방법으로 풀었으나 출제자의 의도는 GET() 함수의 이해를 확인(?) ㅠㅠ

 

Q3. 리스트의 더하기와 extend 차이점을 알아봅니다.

>>> a=[1,2,3]

>>> a=a+[4,5]

>>> id(a)

27918216

>>> a=a+[6,7]

>>> id(a)

27918088

>>> a.extend([8,9])

>>> id(a)

27918088

한참 헤맸네요… 도저히 알 길이 없어 구글링 해 봅니다. 더하기를 하게 되면 a의 주소가 매번 바뀌게 되고, extend는 주소가 고정되어 있음을 알 수 있습니다. (더하기, append, extend 기능이 비슷하지만 조금씩 다릅니다.)

append [4,5]를 하게 되면 [1, 2, 3, [4, 5] ]의 결과로 돌려줍니다. 리스트 안에 리스트!

 

Q4. A 학생의 점수 리스트에서 50점 이상 점수의 총합을 구해 봅니다.(리스트 총합 구하기)

>>> a=[20,55,67,82,45,33,90,87,100,25]

>>> total = [total+i for i in a if i>= 50]

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

File "<stdin>", line 1, in <listcomp>

NameError: name 'total' is not defined

>>> total=0

>>> total = [total+i for i in a if i>= 50]

>>> total

[55, 67, 82, 90, 87, 100]

>>> sum(total)

481

total 초기값을 0으로 지정했는데도 리스트가 들어가고 sum(total)로 총합을 출력합니다.

(원래 생각은 total에 총합이 들어가리라 생각했습니다. ㅎ)

 

Q5. 정수 n을 입력받아 n 이하까지의 피보나치수열을 출력하는 함수를 작성해 봅니다.

def fibo(a):

fb=[0,1]

for i in range(0,a):fb.append(fb[i]+fb[i+1])

return fb

 

n=int(input('input n :'))

print(fibo(n))

 

실행 결과

input n :10

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

리스트를 사용하면 간단하게 구현되지만 출제자의 의도와 부합하는지 의문입니다.

 

Q6. 콤마로 구분된 숫자를 입력받아 총합을 구합니다.

>>> def add_all(*a):

... sum=0

... for i in a: sum+=i

... return sum

...

>>> add_all(1,2,3,4,5)

15

내포 리스트를 사용하지 않고 총합을 구합니다.

 

Q7. 2~9의 숫자 중 하나를 입력받아 한 줄 구구단 출력이 가능토록 해 봅니다.

n=int(input('구구단을 출력할 숫자 입력(2~9) :'))

print([n*i for i in range(1,10)])

실행 결과

구구단을 출력할 숫자 입력(2~9) :2

[2, 4, 6, 8, 10, 12, 14, 16, 18]

Q8. 아래 abc.txt를 역순으로 저장해 봅니다.

abc.txt 내용

aaa

bbb

ccc

ddd

 

with open('ABC.TXT','r') as f:

l=f.readlines()

with open('ABC.TXT','w') as f:

l.reverse()

f.writelines(l)

​실행 후 abc.txt

ddd

ccc

bbb

aaa

뭔가 더 간단한 방법이 있을 것 같지만 우선 아는 만큼 해 봅니다.

 

Q9. 아래와 같은 sample.txt를 읽어 총합, 평균을 구하고 평균값을 result.txt에 기록합니다.

sample.txt

70

60

55

75

95

90

80

85

100

 

with open('sample.txt','r') as f:

score = f.readlines()

t_score= sum(list(map(int,score)))

ave_score=t_score/len(score)

print (t_score,ave_score)

with open('result.txt','w') as f:

f.write(str(ave_score))

result.txt에 기록할 때 ave_score를 그대로 사용하면 “TypeError: write() argument must be str, not float” 발생합니다.

str(ave_score) 함수 사용으로 실수형을 문자열로 변경 후 에러 없이 result.txt에 79.0이 기록됩니다.

 

Q10. 다음과 같이 동작하는 클래스 Calculator를 작성해 봅니다.

>>>cal1=Calculator([1,2,3,4,5])

>>>cal1.sum()

15

>>> cal1.avg()

3.0

>>> cal2=Calculator([6,7,8,9,10])

>>>cal2.sum()

15

>>> cal2.avg()

3.0

 

class Calculator:

def __init__(self,num):

self.num=num

 

def sum(self) :

total = 0

for i in self.num : total += i

return total

 

def ave(self) :

ave=0

total=0

for i in self.num :total += i

ave = total/len(self.num)

return ave

 

cal1=Calculator([1,2,3,4,5])

print(cal1.sum())

print(cal1.ave())

 

cal2=Calculator([6,7,8,9,10])

print(cal2.sum())

print(cal2.ave())

평균을 구할 때 그냥 self.sum()을 사용하면 되는데 굳이 합을 다시 계산했네요… 클래스 내 함수 재사용이 가능합니다. 이렇게 알아가는 거죠!

댓글