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,"삼겹살","배고","프니")
앞에서 명시하냐 뒤에서 명시하냐의 차이
* 기본 매개변수가 가변 매개변수 앞에 있다면?
# 기본 매개변수가 가변 매개변수 앞에 있다면?
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)
* 해설
* 알고리즘 해설
* 시각화 해설
* 교수님이 그려준 알고리즘 시각화
* 더 깊게 들어간 알고리즘 시각화
* 핵심
- 가변 매개변수 뒤에는 일반 매개변수 올 수 없음
- 가변 매개변수는 하나만 사용할 수 있음
- 함수를 쓰면 유지보수가 쉬움
- 재귀함수, 메모화, 조기 리턴 등등
* 링크 (직접 글 쓴 당사자만 확인 가능 // 계정 이동해서 확인하기)
* 오늘의 링크
파이썬 코드 시각화 링크.
728x90
반응형
LIST
'배운 책들 정리 > 혼자 공부하는 파이썬' 카테고리의 다른 글
혼자 공부하는 파이썬 6,7 - 예외 처리, 모듈 (1) | 2023.04.19 |
---|---|
혼자 공부하는 파이썬 5,6 - 함수 고급, 예외 처리 (1) | 2023.04.18 |
혼자 공부하는 파이썬 4 - 문자열, 리스트, 딕셔너리와 관련된 기본 함수(while,range,reversed,enumerate,Counter 등등) (0) | 2023.04.14 |
혼자 공부하는 파이썬 4 - 반복문(조건문 응용(if), dict, list, 이중for문, range, while문) (0) | 2023.04.13 |
혼자 공부하는 파이썬 2,3,4 - 숫자와 문자열의 다양한 기능, 조건문, 반복문 (0) | 2023.04.11 |