본문 바로가기

배운 책들 정리/혼자 공부하는 파이썬

혼자 공부하는 파이썬 5 - 함수 만들기, 함수의 활용

5장 함수

1. 함수 만들기

1) 기본 매개변수, 가변매개변수

 

*기본 매개변수

 

# 기본 매개변수
def printntimes(value, n):
    # n번 반복하는 반복문
    for i in range(n):
        # value를 출력
        print(value)

# "안녕하세요"를 5번 출력
printntimes("안녕하세요", 5)

 

* 가변 매개변수

 

# 가변매개변수
def printntimes(n,*values):
  for i in range(n):
    for j in values:
      print(j)
    print("-"*10)

printntimes(3,"삼겹살","배고","프니")

 

print에서 반복 횟수를 쓴 것

 

n =3 를 쓴 것

앞에서 명시하냐 뒤에서 명시하냐의 차이

 

 

* 기본 매개변수가 가변 매개변수 앞에 있다면?

 

# 기본 매개변수가 가변 매개변수 앞에 있다면?
def printntimes(*values, n=3):
  for i in range(n):
    for j in values:
      print(j)

printntimes("안녕","파이썬","재밌니?")

 

* 키워드 매개변수

 

# 키워드 매개변수
def printntimes(*values, n=3):
  for i in range(n):
    for j in values:
      print(j)

printntimes("안녕","파이썬","재밌니?",2) # 숫자 2까지 가변 매개변수가 되어버림

 

* 키워드 매개변수 2

 

# 키워드 매개변수는 입력 순서 상관 없음
def test(a,b=3,c=9):
  print(a+b+c)
# 1) 기본 형태로 사용 = 매개변수 입력 순서대로
test(2) # = test(2,3,9)


# 2) 키워드 매개변수로 사용
test(a=2) # = test(a=2,b=3,c=9)

test(a=2,b=3,c=9)

# 3) 키워드 매개변수 순서를 마음대로
test(c=9,a=2,b=3)

# 4) 키워드 매개변수 일부
test(2,c=10)

 

* 리턴 

 

# 리턴 = 반환값
# 1) 자료 없이 리턴
def return_test():
  print("A")
  return # 자료 없이 리턴
  print("B")
return_test()

# 2) 자료와 함께 리턴
def return_test():
  return "B"
return_test()

# 3) None 으로 리턴 (교수님)
def return_test():
  return
a= return_test()
print(a)

# 3) None 으로 리턴 (나)
def return_test():
  return
print(return_test())

# 입력한 값을 모두 더하는 함수 = sum 과 비슷하게
def sumall(start, end):
  output = 0
  for i in  range(start,end+1):
    output += i
  return output
sumall(1,1000)

 

* 계속해서 리턴

 

# 입력한 값을 모두 더하는 함수 = sum 과 비슷하게
def sumall(start, end):
  output = 0
  for i in  range(start,end+1):
    output += i
  return output
sumall(1,10)
sumall(start = 1, end=10) # 키워드 매개변수 

# 입력한 값을 모두 더하는 함수 + 간격
def sumall(start=1, end=10, step=2):  # 값을 넣어 기본 매개변수로 변경합니다.
  output = 0  # 초기값 설정
  for i in range(start, end+1, step):  # start부터 end까지 step만큼씩 증가하며 반복합니다.
    output += i  # i를 output에 더합니다.
  return output  # 결과값을 반환합니다.

sumall(1, 10, 2)  # 1부터 10까지 2씩 증가하며 더한


sumall(step=2, end=10, start = 1) # 키워드 매개변수 

sumall(step=2, end=10) # 키워드 매개변수 

sumall(end=10) # 키워드 매개변수

 

2) 확인문제 290p

 

# 다음과 같이 방정식을 파이썬 함수로 만들어 보세요. // 예시
# 예: f(x)=x
def f(x):
  return x
print(f(10))

# 290p 확인문제 1번
def f(x):
  return 2*x+1
print(f(10))

# 290p 확인문제 1-2번
def f(x):
  return x**2+2*x+1
print(f(10))

# 291p 확인문제 2번
# 입력된 값을 전부 곱해서 리턴하는 함수 # 가변 매개변수
def mul(*values):
  result = 1 # 곱셈을 위해 1로 초기화
  for value in values:
    result *= value # 각 value를 곱해서 result에 누적 # result = result * value
  return result

print(mul(5, 7, 9, 10))  
# 출력결과 3150

 

 

# 291p 확인문제 3번
# 오류가 발생하는 코드를 고르시오 // 정답 1번
# 1번
def function(*values,valueA,valueB):  # 가변  # 일반  # 일반-가변은 순서가 바뀔 수 없다
  pass
function(1,2,3,4,5)  
# 2번
def function(*values,valueA=10,valueB=20): # 가변 # 기본
  pass
function(1,2,3,4,5)  
# 3번
def function(valueA,valueB,*values): # 일반 # 가변
  pass
function(1,2,3,4,5)  
# 4번
def function(valueA=10,valueB=20, *values):  # 기본 # 가변  # 기본-가변은 가능하다
  pass
function(1,2,3,4,5)

 

3) 함수의 활용

* 재귀함수

 

# 재귀함수
# 팩토리얼 함수 만들기
def factorial(n):
  output = 1
  for i in range(1,n+1):
    output *= i
  return output
print(factorial(1))
print(factorial(2))
print(factorial(3))
print(factorial(4))
print(factorial(5))

 

 

# 재귀함수
# 팩토리얼 함수 만들기
def factorial(n):
  output = 1
  for i in range(n,1-1,-1):
    output *= i
  return output
print(factorial(1))
print(factorial(2))
print(factorial(3))
print(factorial(4))
print(factorial(5))

 

 

# 재귀함수
def factorial(n):
  if n == 0:
    return 1
  else:
    return n * factorial(n-1)
print(factorial(1))
print(factorial(2))
print(factorial(3))
print(factorial(4))
print(factorial(5))

- 모두 다 같은 결과 값

 

 

#  피보나치 수열 함수 - 재귀함수
def fibonacci(n):
  # n이 1일 때는 1을 반환
  if n == 1:
    return 1
  # n이 2일 때는 1을 반환
  if n == 2:
    return 1
  # n이 1이나 2가 아닐 경우에는 n-1번째와 n-2번째 피보나치 수열 값을 더하여 반환
  else:
    return fibonacci(n-1) + fibonacci(n-2)

# 피보나치 수열의 첫 다섯 항 출력
print(fibonacci(1))
print(fibonacci(2))
print(fibonacci(3))
print(fibonacci(4))
print(fibonacci(5))

 

* global 함수

 

# 키워드 global: 함수 외부에 있는 변수 참고
counter = 0

def fibonacci(n):
  print("피보나치 수열:{}".format(n))
  
  # 전역 변수 counter를 함수 내부에서 참조하고, 값을 1 증가시킨다.
  global counter
  counter += 1

  # n이 1일 때는 1을 반환
  if n == 1:
    return 1
  
  # n이 2일 때는 1을 반환
  if n == 2:
    return 1
  
  # n이 1이나 2가 아닐 경우에는 n-1번째와 n-2번째 피보나치 수열 값을 더하여 반환
  else:
    return fibonacci(n-1) + fibonacci(n-2)

# fibonacci 함수를 호출하면서 매개변수를 1, 2, 3, 4로 하여 반환값을 출력한다.
print(fibonacci(1))
print(fibonacci(2))
print(fibonacci(3))
print(fibonacci(4))

 

* 재귀 함수의 문제

dictionary = {
    1:1,
    2:1
}
def fibonacci(n):
  if n in dictionary:
    return dictionary[n]
  else:
    output = fibonacci(n-1) +fibonacci(n-2)
    dictionary[n] = output
    return output
print(fibonacci(50))

dict을 사용하는 이유는 출력 결과가 오래 걸리기 때문에 한번 계산한 식을 저장해서 응용한다.

 

 

* 조기 리턴

 

# 조기 리턴 (else를 안쓰고)
dictionary = {
    1:1,
    2:1
}
def fibonacci(n):
  if n in dictionary:
    return dictionary[n]
  output = fibonacci(n-1) +fibonacci(n-2)
  dictionary[n] = output
  return output
print(fibonacci(50))

 

* 리스트 평탄화 - 재귀함수

 

# 재귀함수를 이용한 리스트 평탄화 함수 flatten
def flatten(data):
  # 평탄화한 결과를 저장할 리스트 output 초기화
  output = []
  # 리스트의 원소를 하나씩 확인하며
  for i in data:
    # 원소가 리스트인 경우 재귀함수로 다시 flatten 함수를 호출하여 내부 리스트의 원소를 확인하고 결과를 output 리스트에 추가
    if type(i) == list:
      output += flatten(i)
    # 원소가 리스트가 아닌 경우 output 리스트에 추가
    else:
      output.append(i)
  # 모든 원소를 확인한 후 최종적으로 평탄화된 리스트 반환
  return output

# 리스트 a 정의
a = [[1,2,3],[4,[5,6]],7,[8,9]]
# 원본 리스트 a 출력
print(a)
# 리스트 a를 평탄화한 결과 출력
print(flatten(a))

 

4) 314p 확인문제 1번

 

min = 2     # 앉힐 수 있는 최소 사람 수
max = 10    # 앉힐 수 있는 최대 사람 수
all = 100   # 전체 사람 수
memo = {}   # 메모이제이션에 사용할 딕셔너리

def Q(remain, sit):
    key = str([remain, sit])    # 현재 남은 사람 수와 앉은 사람 수를 하나의 키로 만들어 메모이제이션에 사용

    # 종료 조건
    if key in memo:     # 이미 계산한 값이면 저장된 값을 반환
        return memo[key]

    if remain < 0:      # 남은 사람 수가 음수가 되면 유효한 경우가 아니므로 0 반환
        return 0

    if remain == 0:     # 남은 사람 수가 0이 되면 모든 사람을 다 앉혔으므로 1 반환
        return 1

    # 재귀 처리
    count = 0   # 경우의 수를 저장할 변수 초기화
    for i in range(sit, max+1):     # 앉을 수 있는 사람 수를 sit에서 max+1까지 반복 # 끝번호를 포함하지 않아서 +1
        count += Q(remain-i, i)     # 재귀 호출을 통해 경우의 수를 누적
        # 남은 사람수 - 앉힌 사람 수 = 현재 사람 수 // 현재까지 앉힌 사람 수 = i

    # 메모이제이션에 결과 저장
    memo[key] = count

    return count

# 출력결과 437420
print(Q(all, min)) # 끝 값, 시작 값
print(memo)

 

 

* 해설

 

 

* 알고리즘 해설

 

 

* 시각화 해설

 

* 교수님이 그려준 알고리즘 시각화

 

* 더 깊게 들어간 알고리즘 시각화

 

* 핵심

- 가변 매개변수 뒤에는 일반 매개변수 올 수 없음 

- 가변 매개변수는 하나만 사용할 수 있음

- 함수를 쓰면 유지보수가 쉬움 

- 재귀함수, 메모화, 조기 리턴 등등

 

 

* 링크 (직접 글 쓴 당사자만 확인 가능 // 계정 이동해서 확인하기)

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

 

 

* 오늘의 링크

파이썬 코드 시각화 링크.

 

Python Tutor code visualizer: Visualize code in Python, JavaScript, C, C++, and Java

Please wait ... your code is running (up to 10 seconds) Write code in Python 3.6 C (gcc 9.3, C17 + GNU) C++ (g++ 9.3, C++20 + GNU) Java 8 JavaScript ES6 ------ Python 2.7 [unsupported] Visualize Execution hide exited frames [default] show all frames (Pytho

pythontutor.com

 

728x90
반응형
LIST