TIL.13 함수의 키워드 인수 / 재귀호출

Haiin·2020년 11월 12일
0


함수의 키워드 인수

  • 함수(**딕셔너리)
  • 딕셔너리에 '키워드': 값 형식으로 인수를 저장하고, 앞에 **를 붙여서 함수에 넣어준다. 이때 딕셔너리의 키워드(키)는 반드시 문자열 형태여야 한다.
def details (name, age, address):
	print('이름: ', name)
	print('나이: ', age)
	print('주소: ', address)    
//위와 같이 함수를 만들어주고
//
x = {'name': 'haiin', 'age': 18, 'address': 'Seoul'}
details(**x) 
details(**{'name': 'haiin', 'age': 18, 'address': 'Seoul'})
//
//x라는 변수에 딕셔너리를 대입하여 함수를 부르는 방식(딕셔너리 언패킹),
딕셔너리 그대로 넣어 함수를 부르는 방식 모두 같은 아래 값을 반환.
//
//이름:  haiin
//나이:  18
//주소:  Seoul
  • 키워드 인수를 사용하는 가변 인수 함수는 매개변수 앞에 **를 붙여서 만든다.
  • def 함수이름(**매개변수): 코드
def details (**kwargs):
	for kw, arg in kwargs.items() :
    		print(kw, ': ', arg, sep='')
	print(kwargs)    
//위와 같이 함수를 만들때 키워드 인수를 사용
//
details(name = 'haiin', age = 18, address = 'Seoul')
//
//함수를 부를때 키워드와 값을 넣어 실행하면 아래와 같이 차례대로 반환됨
//
//name: haiin
//age: 18
//address: Seoul
//{'name': 'haiin', 'age': 18, 'address': 'Seoul'}
//
//아래와 같이 딕셔너리 언패킹으로 넣어도 반환됨
//x = {'name': 'haiin'}
//details(**x)
//name: haiin


문제

4가지 과목의 점수를 임의로 받고 그 중에 가장 높은 점수와 낮은 점수, 평균점수를 구하는 함수. 위치인수, 리스트언패킹, 키워드인수, 딕셔너리언패킹을 사용

korean, english, mathematics, science = map(int, input().split())
//4가지 점수 받음
//
def get_min_max_score(*args) :
  min_score = min(args)
  max_score = max(args)
  return min_score, max_score
//
//위치인수, 리스트언패킹으로 값을 받고 min(), max() 함수 사용
//
def get_average(**kwargs) :
  average_score = sum(kwargs.values()) / len(kwargs)
  return average_score
//
//키워드인수, 딕셔너리언패킹으로 값을 받고 sum()함수로 키워드인수들의 값들만 받아 합을 구함
//
min_score, max_score = get_min_max_score(korean, english, mathematics, science)
average_score = get_average(korean=korean, english=english, mathematics=mathematics, science=science)
//
print('낮은 점수: {0:.2f}, 높은 점수: {1:.2f}, 평균 점수: {2:.2f}'.format(min_score, max_score, average_score))
//
//75 95 85 99 입력했을 경우 아래와 같이 반환됨
//
//낮은 점수: 75.00, 높은 점수: 99.00, 평균 점수: 88.50


함수에서 재귀호출

  • 함수 안에서 함수 자기자신을 호출하는 방식을 재귀호출(recursive call)이라고 한다.
  • 재귀호출로 구현한 코드가 좀 더 직관적이고 이해하기 쉬운 경우가 많고, 알고리즘을 구현할 때 많이 사용한다고 한다.
  • 재귀호출은 종료조건을 만들어줘야한다. 그렇지 않으면 계속 자기자신 함수를 호출하기 때문에 에러발생함.
def recursive ():
	print('superstar')
	recursive()    
#위와 같이 함수를 만들어주면 계속해서 superstar을 프린트하다 1000번이 되면 RecursionError 가 뜬다.
//
//
def recursive(n):
    if n == 0:    # 종료 조건, n이 0이면 다시 recursive 함수를 호출하지 않고 끝냄
        return 
    print('superstar', n)
    n -= 1      # n를 1 감소시킨 뒤
    recursive(n)    # 다시 recursive에 넣음
// 
recursive(5)    # recursive 함수 호출


문제

  • 재귀호출로 회문 판별하기
    회문 또는 팰린드롬은 거꾸로 읽어도 제대로 읽는 것과 같은 문장이나 낱말, 숫자, 문자열 등이다. -위키백과-
def is_palindrome(word):
  if len(word) < 2 : #문자열이나 숫자열이 1개이면 회문
    return True
  if word[0] != word[-1] : #첫문자와 마지막문자가 같지 않은지 확인
    return False
  return is_palindrome(word[1:-1]) #같으면 재귀호출하기위해 다시 열을 정리해줌
//
//
//print(is_palindrome('hello')) #False
//print(is_palindrome('level')) #True
  • 재귀호출로 피보나치 수 구하기
    피보나치 는 수학에서, 피보나치 수(영어: Fibonacci numbers)는 첫째 및 둘째 항이 1이며 그 뒤의 모든 항은 바로 앞 두 항의 합인 수열이다. 처음 여섯 항은 각각 1, 1, 2, 3, 5, 8이다. 편의상 0번째 항을 0으로 두기도 한다.-위키백과-
#n
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21...
#피보나치 수
#아래와 같이 앞의 두수를 더한 값이 다음항의 수가 된다.
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946...
def fib(n) :
  if n <= 1 : # 종료 조건을 설정해주고
    return n
  else :
    return fib(n-1) + fib(n-2)   
//
n = int(input())
print(fib(n))
//
#n 에 6 대입 할 경우:
#n 이 1 보다 크기 때문에 else로 가서 fib(5) + fib(4)
#여기서 fib(5)는 위와 같은 과정으로 fib(4) + fib(3) 을 호출
#위와 같이 계속 호출하다가 f(1) 이나 f(0)을 호출하면 리턴되므로 덧셈시작
#결국 다 더하면 숫자 8 반환.


0개의 댓글