Search

함수

주요 특징

보통 입력값, 출력값 또는 반환값을 가지고 있으며 특정 동작을 수행한다.
함수 내에서 출력(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)]