Language/Python

TIL-파이썬 기초문법,중복 함수, 장식자(Python-Nested Function, Decorator)

청렴결백한 만능 재주꾼 2020. 4. 24. 10:23
반응형

Assignment

함수 2개를 구현해주세요. 함수의 이름은 다음과 같아야 합니다.

 

  • sum_of_numbers

  • what_is_my_full_name

 

함수 sum_of_numbers는 arugment로 주어지는 모든 수를 합한 값을 리턴해야 합니다.

 

예를 들어, sum_of_numbers(1, 2, 3, 4, 5) 는 15를 리턴해야 하고 sum_of_numbers(1,2)는 3을 리턴해야 합니다.

만일 parameter가 주어지지 않으면 0을 리턴해야 합니다.

 

what_is_my_full_name 함수는 주어진 parameter중 first_name 과 last_name 이라는 parameter를 조합하여 full name을 리턴해주어야 합니다.

 

예를 들어, first_name이 "우성" 이고 last_name 이 "정" 이면 "정 우성" 라고 리턴하면 됩니다.

Last name과 first name 사이에 space(빈칸)이 들어가 있어야 합니다.

만일 last_name이 없거나 first_name이 없으면 둘 중하나만 리턴하면 됩니다.

예를 들어, last_name이 없으면 "우성" 이라고 이름만 리턴하면 됩니다,

마지막으로, last_name과 first_name 둘다 없으면 "Nobody" 라고 리턴하면 됩니다. 


My answer:

def sum_of_numbers(*args):
    A=[]
    C = len(args)-1
    if C>0:
        for i in args:
            A.append(i)
        return sum(A)
    elif C==0:
      for z in args:
        A.append(z)
      return A[0]
    else:
      return 0
    
    
def what_is_my_full_name(**kwarg):
    
  dic={}
  for i in kwarg:
    dic[i]=kwarg[i]
        
  if 'first_name' in dic:
    if 'last_name' in dic:
      a1 = str(dic["last_name"])
      b1 = " "
      c1 = str(dic["first_name"])
      abc=a1+b1+c1
      return abc
    else:
      g1 = str(dic["first_name"])
      return g1
  elif 'last_name' in dic:
    if 'first_name' in dic:
      d = str(dic["last_name"])
      f = " "
      e = str(dic["last_name"])
      dfe = d+f+e
      return dfe
    else:
      h = str(dic["last_name"])
      return h
  else:
    return 'Nobody'

 

 

굉장히 조잡하게 처리한 것이 스스로도 느껴진다. 슬프다. 최적화된 간결하게 코딩하고 싶다. 


Nested Function

함수도 중복 가능

 

Why use nested function?

 

1.  가독성 - 반복되는 코드블럭을 함수로 정의해서 효과적으로 코드를 관리하기 위해

2. Closure - 특정 함수를 가둬놓으려고

Clousre 조건

 - 해당 함수는 어떤 함수 내의 중첩된 함수여야 한다.

 - 해당 함수는 자신을 둘러싼(enclose)함수 내의 상태값을 반드시 참조해야 한다.

 - 해당 함수를 둘러싼 함수는 이 함수를 반환해야 한다.

 

위에 그림 함수는 그냥 함수가 2의 몇승 값을 출력한다. 하지만 밑의 함수를 보았을 때에 power인자를 직접적으로 고칠 수는 없다. 

generate_power함수가 직접 받는 것이 아닌 이상 다 그 밑의 함수인 nth_power가 함수를 받는다. 그래서 첫번째에는 2의 몇승을 출력하게 되고 그 다음 함수인 calculate_power_of_seven 함수는 7의 몇승인지를 받게 된다. 무슨 말인지 이해가 잘 되지 않는다면 밑에 함수를 직접 쳐보길 바란다.^^

   


Decorator : chain of functions

https://stackoverflow.com/c/wecode/questions/64

참조하였음.

Decorator로 변하게 될 함수

잭팟 주식의 정보가 나타났지만, 그 정보가 전달 되어야 할 사람은 유료 회원들 이다. 잭팟 주식의 정보를 전달하는 함수가 실행 되기전에 사전에 시행 되어야만 하는 함수는 유료회원인지 따지는 함수이다. 실수로 유료회원인지 따지는 함수를 하지 않고 잭팟 주식 정보함수를 실행하게 된다면 큰일이 나기 때문에 유료회원확인 함수를 데코레이터로 달아 놓는다. ^^

 

Decorator로 변해버린 is_paid_user 함수

 

 

전체적인 흐름

 Decoration이 이해가 안되네 . 이해를 하고 정리를 하기 위해 오늘은 여기까지 마친다.

반응형