[혼자 공부하는 파이썬] 함수1
05-1. 함수 만들기
가변 매개변수
사용법 : def 함수이름(매개변수, 매개변수, ..., *가변 매개변수) :
#ex01.
def print_n_times(n, *values):
for i in range(n):
for value in values:
print(value)
print()
print_n_times(3, "안녕하세요", "오늘도", "화이팅")
매개변수를 원하는 만큼 받을 수 있는 함수를 가변 매개변수 함수라고 한다. 가변 매개변수 뒤에는 일반 매개변수가 올 수 없다. 또한 가변 매개변수는 하나만 사용 가능하다.
기본 매개변수
#ex02.
def print_n_times(value, n=2):
for i in range(n):
print(value)
print_n_times("안녕하세요")
매개변수 = 값 형태로 되어있는 것을 기본 매개변수라고 한다. 매개변수를 입력하지 않았을 경우 매개변수에 들어가는 기본값이다. 기본 매개변수 뒤에는 일반 매개변수가 올 수 없다.
키워드 매개변수
#ex03.
def print_n_times(*values, n=2):
for i in range(n):
for value in values:
print(value)
print()
print_n_times("안녕하세요", "즐거운", "하루", n=4)
가변변수와 기본매개변수를 같이 쓰기 위해서는 위와 같은 순서로 작성을 해야한다. 그리고 매개변수 이름을 직접적으로 지정해서(상기 예제에서 n=4) 입력하는데 이를 키워드 매개변수라고 한다.
05-2. 함수의 활용
재귀 함수
#ex04. 재귀함수로 팩토리얼 구하기
def factorial(n):
if n == 1:
return 1
else:
return n*factorial(n-1)
print("1!:", factorial(5))
재귀 함수의 문제
상황에 따라서 기하급수적으로 많이 반복하는 문제가 있다. 그러나 적재적소에 활용시 코드를 쉽게 알아볼 수 있는 장점이있다. 재귀 함수로 인해 발생하는 문제를 알아보고 이후 해결할 수 있는 메모화라는 기술을 알아본다.
#ex05. 재귀 함수로 구현한 피보나치 수열(1)
counter = 0
def fibonacci(n):
global counter
counter += 1
if n == 1:
return 1
if n == 2:
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)
print("35!:", fibonacci(35))
print("---")
print("fibonacci(35) 계산에 활용된 덧셈 횟수는 {}번입니다.".format(counter))
각 컴퓨터의 성능에 따라, 출력 결과가 다른 것들에 비해 약간 시간이 소요됨을 알 수 있다. 덧셈 횟수가 9227465번을 하기 때문에 시간이 소요되는 것이다. 그래서 이를 메모화를 통해서 개선한다.
재귀함수와 메모화는 같이 많이 사용되므로 재귀함수를 고려할 때 쌍으로 메모화도 떠올릴 수 있도록 하자.
#ex 05. 메모화를 통한 재귀 함수로 구현한 피보나치 수열(1) 개선
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("35!:", fibonacci(35))
리스트 평탄화하기
#ex06. 리스트 평탄화
def flatten(data):
output = []
for item in data:
if type(item) == list:
output += flatten(item)
else:
output.append(item)
return output
example = [[1, 2, 3], [4, [5, 6]], 7, [8, 9]]
print(flatten(example))
05-2. 함수 고급
- 튜플 : 리스트와 비슷한 자료형으로 한번 결정된 요소는 바꿀 수 없다.
- 람다 : 함수 구문을 작성하는 것이 번거롭고, 코드 공간 낭비라는 생각이 들 때 함수를 간다하고 쉽게 선언하는 방법, 보통 1회용 함수를 만들어야 할 때 많이 사용.
튜플 기본
#ex07. 튜플 기본
a = (1, 2, 3)
print(a)
#아래와 같은 방법으로 튜플에 요소 접근이 가능
print(a[0])
print(a[1])
print(a[2])
#ex08. 요소를 하나 갖는 튜플
a = (1, 2, 3)
#괄호를 하고 숫자에 ,를 꼭 넣어줘야함.
b = (1, )
print(b, type(b))
#ex09. 튜플 괄호 생략
a = 1, 2, 3
b = 1,
print(a)
print(b)
튜플 기본 특성
1. 외관이 간단
2. 요소를 변경할 수 없음(리스트와 다른점)
3. 함수의 리턴에서 가장 많이 사용되며, 다중 리턴도 가능
4. 딕셔너리에서 생일과 같이 내부의 요소를 변경하지 않고 사용하는 경우 여러 개의 값을 갖는 그룹은 튜플을 사용(리스트보다 더 빠르기 때문)
5. 딕셔너리의 키 값에 사용할 수 있다.(튜플은 이뮤터블 자료형이기 때문)
#ex10. 튜플과 리스트의 차이
#리스트는 아래와 같이 요소에 값을 넣어 변경이 가능함
a = [1, 2, 3]
a[1] = 5
print(a)
#튜플은 아래와 같이 요소에 값을 넣어 변경하려면 오류가 발생됨
b = (1, 2, 3)
b[1] = 5
print(b)
#ex11. 외관이 간단한 예제
[a, b] = [10, 20]
#리스트처럼 튜플도 작성 가능하며, 괄호를 삭제해서 사용할 수도 있다
(c, d) = (10, 20)
e, f = 10, 20
print(a, b)
print(c, d)
print(e, f)
튜플은 다중 리턴도 가능하다
# ex12. 괄호를 삭제한 튜플 리턴값 예제
def a():
return 10, 20, 30
b, c, d = a()
print(b, c, d)
#ex13. 튜플을 리턴하는 함수의 예
A = ["바나나", " 사과", "고구마", "감자"]
for item in enumerate(A):
print(item)
#위를 출력하면 튜플로 출력이 된다. 즉, item이 튜플이라는 의미
#그래서 이를 이용해서
for (i, item) in enumerate(A):
print(i, item)
#괄호를 삭제할 수도 있다 그러면 아래와 같이된다.
for i, item in enumerate(A):
print(i, item)
#ex14. 딕셔너리에서 튜플을 사용하는 경우
#딕셔너리에서 튜플을 사용하는 경우
B = {
"이름" : "별",
"생일" : (2019, 11, 14),
}
for key in B:
print(key, B[key])
#key의 값에 접근하기 위해서는 B[key]를 써야했으나 이렇게 번거롭게 써야하는데
#이를 번거롭게 하지 않기 위해서는 아래와 같이 사용할 수도 있다.
C = {
"이름" : "별",
"생일" : (2019, 11, 14),
}
for key in C.items():
print(key)
#위와 같이 작성하게되면 key값에 튜플이 들어오는 것을 확인할 수 있다
#여기에 튜플을 넣게 되면
C = {
"이름" : "별",
"생일" : (2019, 11, 14),
}
for key, value in C.items():
print(key, value)
#itmes()의 반환형은 튜플이기때문에 key, value로 받을 수 있다
#생일과 같이 내부의 요소를 변경하지않고 여러 개의 값을 갖는 그룹은 리스트보다 튜플을 사용한다.
#기능이 간단하므로 용량도 적고 더 빠르기 때문
뮤터블과 이뮤터블
뮤터블(mutable)
1. 값을 변경할 수 있는 객체
2. 생성 후 자유롭게 값을 변경, 추가, 삭제 가능
3. list, set, dictionary 등
4. 변수의 값을 변경하면 객체 자체를 할당된 메모리에 전달하여 업데이트한다
5. call by reference(참조에 의한 호출)
이뮤터블(immutable)
1. 값을 변경할 수 없는 객체
2. 숫자, string, 튜플 등
3. 변수의 값을 변경하면 새로운 메모리에 전달하여 그 객체에 대한 참조로 업데이트한다
4. call by value(값에 의한 호출)
#ex15. 자료: 뮤터블 자료 + 이뮤터블 자료
# 이뮤터블 자료
# 변수에 넣었을 때
# 스택에 있는 값을 변경해야만 + 값을 변경할 수 있는 자료
a = 10
a = 20 #숫자들은 이뮤터블
b = True
b = False #bool도 이뮤터블
c = "안녕하세요"
c = "안녕히가세요" #문자열도 이뮤터블
d = (1, 2, 3)
d[1] = 3 #이랬을 때 오류가 발생되는데, 튜플도 이뮤터블이기 때문.
# 뮤터블 자료
# 변수에 넣었을 때
# 스택에 있는 값을 변경하지 않아도 + 값을 변경할 수 있는 자료
# 대표적인 예 : 리스트, 딕셔너리
# 결론은 이뮤터블 자료로 딕셔너리의 key로 활용할 수 있다
A = {
(2022, 1, 1) : "새해",
(2022, 12, 25) : "크리스마스"
}
print(A)
#이렇게 특정한 날짜에 이름을 붙일 수 있는데, 튜플을 딕셔너리에 활용해서 메모화에 사용할 수 있다.
#key에 튜플을 사용할 수 있는 이유는 튜플이 이뮤터블이기 때문에
참고자료
- 한빛미디어의 윤인성 저자님의 혼자 공부하는 파이썬 책을 독학하면서 복습하기 위해 정리한 내용입니다.