티스토리 뷰
2019/11/11 - [Python/심사문제] - 파이썬 도장 심사문제(Unit 41) 풀이(judge_coroutine.py)
문제
표준 입력으로 HTML 태그 이름 두 개가 입력됩니다. 다음 소스 코드에서 함수의 반환값을 HTML 태그로 감싸는 데코레이터를 만드세요. HTML 태그는 웹 페이지에 사용하는 문법이며
<span>
문자열</span>
,<p>
문자열</p>
처럼 <태그이름>으로 시작하며 </태그이름>으로 끝납니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
________________
________________
________________
________________
________________
________________
a, b = input().split()
@html_tag(a)
@html_tag(b)
def hello():
return 'Hello, world!'
print(hello())
|
cs |
입출력 예시
- 예1
입력
p span
결과
<p><span>Hello, world!</span></p>
- 예2
입력
b i
결과
<b><i>Hello, world!</i></b>
해설
문제 분석
- 데코레이트의 사용 이유를 상기해 본다.
- 문제의 소스를 보면 표준입력에서 2개의 태그명을 받아서 각각을 변수 a, b에 저장하였다.
- 일정한 문자열("Hello, world!")를 출력하는 함수가
Hello()
가 작성되었다. - 함수 hello()를 그대로 둔 채 그 반환 문자열을 지정한 태그명(a, b)로 각각 둘러싸는 동작을 두 개의 데코레이션(
@html_tag(a)
,@html_tag(b)
)를 정의하여 해결한다.
포인트
-
매개변수(a, b)가 있는 데코레이션을 작성해야 한다.
-
매개변수가 있는 데코레이션의 내부 구조는 아래와 같다. 아래의 코드와 달리 이 문제에서는 지정된 함수
Hello()
에 인자가 없으므로def wrapper()
가 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# 데코레이터가 사용할 매개변수를 지정
def is_multiple(x):
def real_decorator(func): # 호출할 함수를 매개변수로 받음
def wrapper(a, b): # 호출할 함수의 매개변수와 똑같이 지정
r = func(a, b) # func를 호출하고 반환값을 변수에 저장
if r % x == 0: # func의 반환값이 x의 배수인지 확인
print('{0}의 반환값은 {1}의 배수입니다.'.format(func.__name__, x))
else:
print('{0}의 반환값은 {1}의 배수가 아닙니다.'.format(func.__name__, x))
return r # func의 반환값을 반환
return wrapper # wrapper 함수 반환
return real_decorator # real_decorator 함수 반환
@is_multiple(3) # @데코레이터(인수)
def add(a, b):
return a + b
|
cs |
-
wrapper()
함수에서는 지정된 문자열을 태그명으로 감싸는 문자열을 만들어 이 문자열을 반환하도록 한다. 태그가 붙어 있는 새로운 문자일을 만들기 위해서는.format()
을 이용한다. 새로운 문자열(result)을 반환하는 것을 잊지 말자.1234result = '<{0}>{1}</{2}>'.format(tag, func(), tag)return resultcs -
정답 해설에 아래와 같은 추가 설명이 있다. 클래스를 이용하여 데코레이션을 만드는 방식인 것 같은데 강좌를 대충 읽었던 까닭인지 기억나는 게 없다. 해당 방식은 추후에 보충하도록 하겠다.
또는, 클로저 형태가 아닌 클래스로 만들어도 됩니다. 클래스로 만들 때는 def
__init__(self, tag_name):
과 같이__init__
메서드에서 데코레이터가 사용할 매개변수를 초깃값으로 받고 속성에 저장합니다. 그다음에def __call__(self, func):
와 같이__call__
메서드에서 호출할 함수를 매개변수로 받습니다. 그리고__call__
메서드 안에서 wrapper 함수를 만든 뒤 문자열을 조합해서 반환하고, wrapper 함수를 다 만들었으면 wrapper 함수도 반환해주면 됩니다.
소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
def html_tag(tag):
def real_decorator(func):
def wrapper():
result = '<{0}>{1}</{2}>'.format(tag, func(), tag)
return result
return wrapper
return real_decorator
a, b = input().split()
@html_tag(a)
@html_tag(b)
def hello():
return 'Hello, world!'
|
cs |
2019/11/10 - [Python/심사문제] - 파이썬 도장 심사문제(Unit 43) 풀이(judge_regular_expression.py)
'Python > 심사문제' 카테고리의 다른 글
백준(BAEKJOON): 고양이(10171번) (0) | 2019.12.11 |
---|---|
파이썬 도장 심사문제(Unit 41) 풀이(judge_coroutine.py) (0) | 2019.11.11 |
파이썬 도장 심사문제(Unit 44) 풀이(judge_import.py) (0) | 2019.11.10 |
파이썬 도장 심사문제(Unit 43) 풀이(judge_regular_expression.py) (0) | 2019.11.10 |
파이썬 도장 심사문제(Unit 45) 풀이(judge_package.py) (0) | 2019.11.10 |
- Total
- Today
- Yesterday
- MacOS
- 리찬규
- QLineEdit
- QLabel
- BOJ
- 유래
- QGridLayout
- 소수
- word
- tips
- books
- python3
- 어원
- QComboBox
- 리규찬
- QtDesigner
- 백준
- judge
- baekjoon
- django
- C
- words
- Python
- Tistory
- setText()
- PyQt5
- 북한말
- NK
- locallibrary
- Mac
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |