list = [1,1,1,3,2,4,5,6,7,3,7,6,2]
#와 같은 예시가 있다. 해당 리스트의 중복되지 않은 수만 출력하는 함수를 작성하시오.
#사실 별다른 방도가 생각이 안나서 결국
my_list = [s for s in input().split()]
for i in my_list:
if my_list.count(i) == 1: #카운트 함수로 품
print (i)
#아래는 모델 솔루션이고,
my_list = [s for s in input().split()]
current_index = 0
for element in my_list:
is_unique = True
list_without_current_element = my_list[0:current_index] + my_list[current_index+1:]
for element2 in list_without_current_element:
if element == element2:
is_unique = False
break
if is_unique:
print(element)
current_index += 1
def function(example1 = '아이유', example2):
print(f"{example1} loves {example2}")
와 같이 함수가 선언되고 인자를 한개만 넘기게 되면, 당연히 우리는 기본인자가 들어있는 example1을 지나치고 example2에 할당될것 같지만, 인자는 순서대로 전달되기 때문에, 키워드, 포지션 상관없이 디폴트 밸류의 선언을 앞에 했다면, 뒤에도 해줘야하며, 그렇게 하지않으면, 함수가 호출될 시에 인자 전달을 할때 어디에 해야할지 알 수 없어 에러가 나게 된다.
데코레이터는 파이썬 장고를 쓰면서 흔하게 접할수 있는데 바로 데코레이터 모듈을 써서 처리하는 과정들이 있는데, 별 다른 생각없이 하나의 방식으로 이해하고 사용하다가, 직접 구현을 해보니. 뿌리 깊은 이해를 할 수 있었다.
데코레이터의 역할은 단순하게 접근하면, 특정 함수의 실행 전에 먼저 수행하여, 함수의 실행 전 후에 추가적인 동작 을 할수 있게 해주는 역할을 해주는 함수하고 생각할 수 있다. 하지만 머리로 이해하는 것과 실제 실행은 너무도 달랐기 때문에 온몸으로 부딪쳐서 이해해본 결과. 다음과 같은 결론을 얻었다.
데코레이터는 함수이지만, 직접적인 실행이 아닌 내부함수(클로저)를 통해서만 실행이 된다. 따라서 실행하려는 로직은 단순히 함수로만 생각하기보다는 처리가 되는 순서에 대해 잘 생각을 해봐야 했다. 검색을 통해 알 수 있는 부분은 기본적으로 @example과 같은 메인 함수 위에 적용한 데코레이터(장식자)를 붙이게 되면, 데코레이터는 함수를 로드하여 정해진 로직을 통해(내부함수 안에서)이루어진 리턴을 반영하고 이후 메인함수를 실행한다.
단순히 함수를 넘겨 처리하는 부분은 금방 이해가 갔으나, 인자를 하나 받아 넘기는 데코레이터의 경우 다양한 궁금증이 생길 수 밖에 없었는데. 이유는 이러한 예제는 찾기가 어렵기도 했고, 찾았다고 해도 바로 이해하기는 어려움이 있었다.
먼저 데코레이터는 기본적으로 선언된 함수를 강제로 받아 넘기기 때문에 당연히 넘어오게 되어 있지만, 어떻게 받아서 일차적으로 받지 않으면 어떻게 해야할지 이해가 어려웠는데, 많은 시행착오 끝에 함수와 매개변수를 처리하려면, 최종적인 함수 수행의 처리는 가장 마지막에 이루어져야하고, 인자를 받아서 넘기기 위해 우선적으로 인자를 받고, 이후에 함수를 받고, 이후의 내부함수에서 함수 및 인자의 가공이 가능하다는 것을 확실하게 인식하게 되었다.
처음에는 떨어지는 에러코드를 처리해가며, 어떻게 해야 해결이 가능한지에만 급급했지만, 그로인해 넘어오지 않는 인자를 어떻게든 받아보려고, *args, **kwargs(쓰지도 않음) 등을 넣어서 넘기기도 하고, 함수가 받아졌으나, 담기지 않아 바로 넘기니 메모리 주소가 반환되기도 하고, 다양한 실패경험 후 원하는 작업이 이루어져야 할 단계 및 순서를 명확하게 이해할 수 있었다.
말로만 정리를 해서 코드적으로 이해가 다가오지 않을수 있으니, 이후에는 새로운 데코레이터 예제를 생성하여, 다시 기술하겠다.
def name_decorator(param):
def wrapper(func):
def inner():
message = func()
return message+param
return inner
return wrapper
@name_decorator("name")
def greeting():
return "Hello, "