주요 특징
•
보통 입력값, 출력값 또는 반환값을 가지고 있으며 특정 동작을 수행한다.
•
함수 내에서 출력(print) 할 경우에는 함수의 결과를 변수에 저장할 경우 None값이 저장된다.
•
return을 쓰나 print를 쓰나 함수의 결과는 나타난다.
•
매개변수는 있어도, 없어도 상관없다.
•
출력이나 반환은 반드시 써야 한다.
기본적인 기능 알아보기
매개변수
# 매개변수 기본값 설정하기
def hello(name='여러분'):
print(f'{name}님 안녕하세요? 반갑습니다!')
# 함수 사용
hello('홍길동')
hello() # default 인자 사용
Python
복사
홍길동님 안녕하세요? 반갑습니다!
여러분님 안녕하세요? 반갑습니다!
Plain Text
복사
•
함수를 만들 때 지정한 매개변수의 순서에 맞게 값을 넣어주면 매개변수의 이름을 생략해도 된다.
•
‘매개변수=값’ 형태로 이름을 지정할 경우, 매개변수의 순서를 바꿔도 괜찮다.
가변변수
•
매개변수의 개수가 정해지지 않은 채로 전달되는 인수
•
가변인수들은 함수 내에서 반복문으로 처리되는 경우가 많다.
def hello(*args):
for who in args:
print(f'{who}님 안녕하세요? 반갑습니다.')
hello('홍길동','일지매','강우동')
Python
복사
args 는 iterable한 튜플이다.
# 아래와 같이 리스트를 인자로 전달할 경우,
whos = ['홍길동','일지매','강우동']
hello(whos)
Python
복사
['홍길동', '일지매', '강우동']님 안녕하세요? 반갑습니다!
위와 같이 args에 하나의 인자값만 들어간 것이 되기 때문에 원하는 결과를 얻을 수 없다.
# 만약 리스트의 원소 하나 하나가 들어가 원하는 결과를 얻으려면
# 아래와 같이 입력할 인자에 *를 붙여서 리스트 원소들을 따로 떼어내면 된다.
hello(*whos)
Python
복사
홍길동님 안녕하세요? 반갑습니다!
일지매님 안녕하세요? 반갑습니다!
강우동님 안녕하세요? 반갑습니다!
Plain Text
복사
< 참고 >
# '*' 의 의미 : 낱개씩 처리하는 것
print('ABCDEFG')
print(*'ABCDEFG')
a = [1,2,3,4,5]
print(*a)
print(a[0], a[1], a[2], a[3], a[4])
Python
복사
ABCDEFG
A B C D E F G
1 2 3 4 5
1 2 3 4 5
Plain Text
복사
가변 인수와 위치 인수
•
요약해서, ‘선 가변 인수 → 후 위치 인수’
로 하는 것이 편리하다.
•
주의할 점은 위치 인수를 반드시 키워드 인수로 사용해야 된다는 점이다.
def hello(*args, title):
for who in args:
print(f'{who}{title} 안녕하세요? 반갑습니다!')
# 함수 사용
hello('홍길동', '일지매', '강우동', title='선생님')
Python
복사
# 만약 아래와 같이, 키워드 인수를 이용하지 않을 경우에
# 오류가 발생한다.
def hello(*args, title):
for who in args:
print(f'{who}{title} 안녕하세요? 반갑습니다!')
# 함수 사용
hello('홍길동', '일지매', '강우동', '선생님')
Python
복사
TypeError: hello() missing 1 required keyword-only argument: 'title'
출력 기능
•
값을 반환할 때는 return 을 사용한다.
◦
여러 개의 결괏값을 반환할 수 있다.
def calculate2(a, b):
return a + b, a * b
# 함수 사용
r1, r2 = calculate2(10, 5)
print(r1)
print(r2)
Python
복사
예외 처리
•
함수 내에서 발생할 수 있는 오류에 대해 사전 처리를 해놓는 것이 좋다.
오류 예시
입력 데이터 형식 확인
함수에서 굳이 입력 데이터 형식을 확인할 일은 잘 없지만
간혹 조건에서 활용되는 경우에 다음과 같이 이용하면 된다.
# '==' 이나 is 를 이용하면 된다
a = 123
print(type(a) == int) # 'int' 아님 주의!
b = '123'
print(type(b) is str)
c = [1,2,3]
print(type(c) is list)
d = {'v':23}
print(type(d) == dict)
Python
복사
True
True
True
True
def divide(a, b) :
if b == 0 :
print('나누는 값이 0이 될 수 없습니다.')
elif (type(a) != int) or (type(b) != int):
print('정수 연산만 가능합니다.')
else:
result = a / b
return result
# 함수 사용
divide(10, 0)
divide(10, 'ab')
divide(10, 2)
Python
복사
변수 우선 순위
1.
LOCAL
함수 안에서 선언된 변수
2.
Enclosing
함수가 함수를 호출한 경우, 밖의 함수가 선언한 변수
3.
Global
함수 밖에서 선언된 전역 변수
4.
Built-in
파이썬이 기본적으로 제공하는 함수
•
전역 변수는 함수 안에서 그대로 사용할 수 있다.
age = 20
# 함수 선언
def test():
print('age = ',age)
# 함수 사용
test() # 전역 변수 age 사용
print('-'*20)
print(age)
Python
복사
age = 20
--------------------
20
Plain Text
복사
•
전역 변수와 지역 변수가 같을 경우, 지역 변수가 우선된다.
age = 20
# 함수 선언
def test():
age = 30 # 지역 변수(local) 선언
print('age = ',age) # 지역 변수값 출력
# 함수 사용
test() # 지역 변수 age 사용
print('-'*20)
print(age) # 전역 변수 age 사용
Python
복사
age = 30
--------------------
20
Plain Text
복사
•
원래 전역 변수를 함수 내에서 변경할 수 없으나 global 문을 이용해서 전역변수를 이용 및 변경할 수 있다.
age = 20
# 함수 선언
def test():
global age # age는 전역 변수(함수 밖에서 선언한 변수)임을 명시
age = age + 10 # 지역 및 전역 변수 모두 반영
print('age = ',age) # 지역 변수값 출력
# 함수 사용
test()
print('-'*20)
print(age)
Python
복사
age = 30
--------------------
30
Plain Text
복사
def test():
global member
print(member)
member = [1,2,3,4,5] # 전역 변수 및 지역 변수이기도 한 member를 변경함
print(member)
# 리스트 변수 선언
member = ['홍길동','일지매','한사랑']
# 함수 사용
test()
print('-'*20)
print(member) # 전역변수도 바뀐 것을 확인할 수 있음
Python
복사
['홍길동', '일지매', '한사랑']
[1, 2, 3, 4, 5]
--------------------
[1, 2, 3, 4, 5]
Plain Text
복사
전역 변수 예외 - 리스트 / 딕셔너리
•
global 문을 이용하지 않는 이상, 원래 전역변수를 함수 내에서 변경하는 것은 불가하다.
하지만, 리스트와 딕셔너리는 global 을 이용하지 않고도 전역변수를 함수 내에서 변경할 수 있다.
def test():
member.append('한국인') # 전역 변수 그대로 변경
print(member)
# 리스트 변수 선언
member = ['홍길동','일지매','한사랑']
# 함수 사용
test()
print('-'*20)
print(member)
Python
복사
['홍길동', '일지매', '한사랑', '한국인']
--------------------
['홍길동', '일지매', '한사랑', '한국인']
Plain Text
복사
a = [1,2,3,4,5,6,7,8,9,10]
# 함수 선언
def test():
# a = [1,2,3]
a[0] = 10
a.append(11)
# 함수 사용
test()
# 변수 확인
print(a)
Python
복사
[10, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
내장 함수
•
abs(x)
절댓값 반환
•
all(x)
x의 요소 모두가 참이면 True 반환
a = [1,2,3,4,5]
all(a)
Python
복사
True
•
any(x)
x의 요소 중 하나라도 참이면 True 반환
a = [0, 1, 2, 3, 4]
any(a)
Python
복사
True
•
chr(x)
아스키 코드 x(정수)에 대응하는 문자를 반환
chr(65)
chr(97)
Python
복사
A
a
•
ord(x)
문자 x의 아스키 코드값을 반환
ord('A')
Python
복사
65
•
dir(x)
객체 x가 가지고 있는 변수나 메서드 목록을 반환
a = [1,2,3]
dir(a)
Python
복사
결과 목록
•
divmod(x,y)
x를 y로 나눈 몫과 나머지를 튜플 형태로 반환
a = 32
b = 5
divmod(a,b)
Python
복사
(6, 2)
•
enumerate(x)
리스트, 튜플, 문자열을 받아 인덱스와 값을 반환한다.
a = [1, 2, 3]
for idx, name in enumerate(a):
print(idx, name)
Python
복사
0 1
1 2
2 3
•
eval(x)
실행 가능한 문자열 x를 받아 실행한 결과를 반환한다.
eval('10 + 20')
eval('print("ABC")')
Python
복사
30
ABC
•
filter(f, x)
함수 f에 x를 매개변수로 전달해 True인 경우만 반환
def ucase(s):
return s == s.upper() and s != ' ' # 공백 문자가 아니고 대문자인 문자
a = 'I Have a Dream'
list(filter(ucase,a))
Python
복사
['I', 'H', 'D']
# comprehension 사용
a = 'I Have d Dream'
list(filter(lambda x: x == x.upper() and x != ' ', a))
Python
복사
•
id(x)
객체 x의 고유 주소값을 반환
a = 100
id(a)
Python
복사
140711825786392
•
input()
사용자로부터 입력값을 받는다
a = input()
print('입력 값', a)
Python
복사
•
isinstance(x, y)
x가 y의 인스턴스인지 여부를 True, False 로 반환
a = list('PYTHON')
print(isinstance(a, tuple))
print(isinstance(a, list))
Python
복사
False
True
•
map(f, x)
함수 f에 x요소를 하나씩 전달해 얻은 결과를 반환
a = [1,2,3,4,5]
b = list(map(lambda x: x * 2, a))
b
Python
복사
[2, 4, 6, 8, 10]
•
pow(x, y)
x를 y번 제곱한 결과를 반환
pow(5,3)
Python
복사
125
•
zip(x, y)
x와 y의 요소를 쌍으로 묶어서 반환
a = [1,2,3,4,5]
b = [10,20,30,40]
list(zip(a,b))
Python
복사
[(1, 10), (2, 20), (3, 30), (4, 40)]