✅ 함수를 왜 사용할까?
✅ 함수의 종류
✅ 함수의 입력(Input)
✅ 파이썬의 범위(Scope)
✅ 함수 응용
- 내장함수
- 파이썬에 기본적으로 포함된 함수
- 외장함수
- import문을 통해 사용하며, 외부 라이브러리에서 제공하는 함수
- 사용자 정의 함수
- 직접 사용자가 만드는 함수
특정한 기능을 하는 코드의 조각 혹은 묶음
특정한 코드를 매번 다시 작성하지 않고, 필요시에만 호출하여 간편히 사용
위 사진과 같이, 함수의 기본 구조에는
1. 선언과 호출(define & call)
2. 입력(Input)
3. 문서화(Docstring)
4. 범위(Scope)
5. 결과값(Output)
모든 언어가 공통적이지만, 함수는 크게 4가지로 구분지을 수있다.
한참 코딩을 배우는 시기라면 모르겠지만, 자신이 능력있는 개발자로 거듭나고 싶다면 이러한 분류를 잘 알고 사용해야 한다.
'Parameter'와 'Argument'의 차이를 알고있는가?
대부분의 경우에서 이 두 단어는 비슷하게 사용된다. 하지만 이 둘은 다른 뜻을 지니고 있다.
def function(ham)
return ham
function('spam')
여기에서 1번째 줄에 ham은 파라미터, 3번째 줄에 'spam'은 알규먼트이다.
기본적으로 이 argument는 함수 호출시 위치에 따라 함수 내부에 전달된다.
argument의 순서대로 parameter에 대입되는것이다.
하지만, argument의 순서대로가 아닌 특정 변수명을 직접 parameter에 넣고싶다면?
그럴때 사용하는 것이 Keyword Arguments이다.
위 사진과 같이 x,y라는 파라미터에 x=2, y=5를 통하여 keyword argumets를 넣어주었다. 이는 위치가 바뀌어도 상관없이 정해진 파라미터에 들어가게 된다.
하지만 주의해야 할 점은 'Keyword Arguments'와 'Positional Arguments'를 함께 사용할 때 발생한다.
Keyword Arguments 뒤에 Positional Arguments를 넣게되면
함수는 제대로 인식할 수 없게 된다.
이번엔 Argument에 기본 값을 지정하는 방법을 알아보자.
그렇다면 정해지지않은 여러 개의 Arguments를 처리하기 위해서는 어떻게 해야 할까?
바로, 언패킹 연산자라 불리는 '*'애스터리스크(asterisk)를 사용하면된다.
numbers = (1,2,3,4,5) # 패킹
print(numbers) # (1,2,3,4,5)
numbers = (1,2,3,4,5)
a,b,c,d,e = numbers # 언패킹
print(a,b,c,d,e) # 1 2 3 4 5
쉽게 말하자면 패킹과 언패킹은 말 그대로 어떤 변수에 여러개의 값을 묶고 푸는 것이다.
하지만, 여기서도 언패킹시에는 지켜야 할 규칙이 있다.
바로, 변수의 개수와 할당하고자 하는 요소의 갯수가 동일해야 한다는 것이다.
그렇다면 패킹은 아무때나 사용할 수 있고 언패킹은 반드시 갯수를 알아야 사용할 수 있을까? 그렇지 않다.
numbers = (1,2,3,4,5)
a,b,*temp = numbers
print(a,b,temp)
a,*temp,b = numbers
print(a,temp,b)
1 2 [3,4,5]
[2,3,4]
이처럼 *연산자를 사용하면 갯수를 몰라도 언패킹을 진행할 수 있고 이를 응용하면 파라미터에서도 사용이 가능하다.
def print_name(father, mother, *pets):
print(f'아버지 : {father})
print(f'어머니 : {Mother})
print('반려동물들..')
for name in pets:
print(f'반려동물:{name}')
print(print_name('재헌', '상분', '강아지', '고양이')
아버지 : 재헌
어머니 : 상분
반려동물들..
강아지
고양이
None
def print_family_name(father,mother,**pets):
print('아버지 : ', father)
print('어머니 : ', mother)
if pets:
print('반려동물들..')
for species, name in pets.items():
print(f'{species} : {name}')
print_family_name('재헌', '상분', dog = '강아지', cat = '고양이')
아버지 : 재헌
어머니 : 상분
반려동물들..
dog : 강아지
cat : 고양이
그렇다면 다양한 변수들중 이름이 같다면, 파이썬은 어떤 순서로 변수를 탐색할까?
이와 같은 순서로 탐색하게 된다.
1. Local scope
2. Enclosed scope
3. Global scope
4. Built-in scope
a = 10
def func1():
global a
a = 3
print(a) # 10
fuc1()
print(a) # 3
map(function, iterable)
n, m = map(int, input().split()) # 3,5 입력
print(n,m) # 3, 5
print(type(n)), type(m)) # <class 'int'> <class 'int'>
filter(function, iterable)
def odd(n):
return n%2
numbers = [1,2,3]
result = filter(odd,nubmers)
print(result, type(result))
# <filter object at 0x000001FB4B217F40>
# <class 'filter>
print(list(result)) # [1,3]
zip(*iterables)
girls = ['jane', 'ashley']
boys = ['justin', 'eric']
pair = zip(girls, boys)
print(pair, type(pair))
print(list(pair))
<zip object at 0x105bdd600> <class 'zip'>
[('jane', 'justin'), ('ashley', 'eric')]
왜 재귀를 사용할까?
하지만, 재귀를 사용할 때는 항상 주의가 필요하다.