[개발자 로드맵]/파이썬

[혼자 공부하는 파이썬] 함수1

Ramrider 2023. 9. 20. 10:31
728x90
반응형

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에 튜플을 사용할 수 있는 이유는 튜플이 이뮤터블이기 때문에

 

참고자료

  • 한빛미디어의 윤인성 저자님의 혼자 공부하는 파이썬 책을 독학하면서 복습하기 위해 정리한 내용입니다.
728x90
반응형