def
는 함수를 만들 때 사용하는 예약어함수 이름
은 만드는 사람이 임의로 만든다.매개변수
는 함수의 입력으로 전달되는 값을 받는 변수
를 말한다.return
은 함수의 결괏값을 돌려주는 명령어. def 함수명(매개변수): <수행할 문장1> <수행할 문장2> ...
#예제
def add(a, b):
return a + b
a = 3
b = 4
c = add(a, b)
print(c)
7
➡️ 변수 a와 b에 각각 3과 4를 대입한 후 'add함수'에 입력값으로 넣어준다. 그리고나면 변수 c에 'add 함수'의 결과값을 대입하면 c의 값을 알수 있다.
def add(a, b): # a, b는 매개변수
return a+b
print(add(3, 4)) # 3, 4는 인수
1. 입력값과 결괏값이 존재하는 함수(일반적인 함수)
def 함수이름(매개변수):
<수행할 문장>
...
return 결과값
#----예시----
def add(a,b):
result = a+b
return result
a = add(3,5)
print(a)
2. 입력값이 없는 함수
#----예시----
def say(): #매개변수가 없음
return 'Hi'
#위 함수를 쓰기위해서는 괄호안이 없어야 "hi"라는 문자열을 돌려줌.
a = say()
print(a)
#만약 입력값이 생기면 오류가 뜸.
a = say("oohohohoho")
print(a)
3. 결과값이 없는 함수
#----예시----
def add(a, b):
print("%d, %d의 합은 %d입니다." % (a, b, a+b))
# 결과값이 없음.
a= add(3,4)
print(a)
#결과
3, 4의 합은 7입니다.
None
➡️ 헷갈리지 않아야할 것은 print문은 <수행할문장>일 뿐 결괏값이 아니다. 결괏값은 오직 return
으로만 돌려받을 수 있다. a값은 결괏값이 없으므로 거짓을 나터나태는 자료형 none
을 돌려준다.
4. 입력값도 결괏값도 없는 함수
#----예시----
def say(): #매개변수 없음
print("hello")
#return값도 없음
#이 함수를 사용하는 방법 - 함수이름()
a =say()
print(a)
args
에 *
를 붙이면 입력값을 전부 모아서 튜플로 만들어 준다. def 함수이름(*매개변수): <수행할 문장> ...
#예시1
def add_many(*args): # 모아서 튜플로 만들어줌
res = 0
for i in args:
res = res+i
return res
a = add_many(1,2,3)
print(a)
#6
➡️ 튜플로 만들고 더한 후 결과값을 돌려줌.
#예시2
def add_mul(choice,*args): #choice라는 매개변수 추가
if choice =="add":
result = 0
for i in args:
result = result + i
elif choice == "mul":
result = 1
for i in args:
result = result * i
return result
result = add_mul("add",1,2,3,4,5)
print(result)
result = add_mul("mul",1,2,3,4,5)
print(result)
➡️ 매개변수 choice에 "add"가 입력되면 모든 값을 더하고, "mul"이 입력되면 곱해서 돌려준다.
**
를 붙이면 매개변수 kwargs는 딕셔너리가 되고 모든 key=value
형태의 결과값이 딕셔너리에 저장된다.def print_kwargs(**kwargs):
print(kwargs)
#결과
>>> print_kwargs(a=1)
{'a': 1} #딕셔너리
>>> print_kwargs(name='foo', age=3)
{'age': 3, 'name': 'foo'} #딕셔너리
def a(a,b):
return a+b, a*b #return 두개
res =a (3,4)
print(res)
#결과
(7, 12) # 튜플값 하나로 돌려줌.
#위의 튜플 값을 2개의 결과값으로 받고 싶다면,
res1, res2 = a(3,4)
print(res1,res2)
#결과
7 12 # res1은 7, res2는 12
#기본 코드
def add(a, b):
return a+b
#매개변수 지정
result = add(a=3, b=7) # a에 3, b에 7을 전달
print(result)
10
#지정하면 순서에 상관없이 사용 가능함
result = add(b=5, a=3) # b에 5, a에 3을 전달
print(result)
8
def say_myself(name, old, man=True): #man=True라는 초깃값 설정
print("나의 이름은 %s 입니다." % name)
print("나이는 %d살입니다." % old)
if man:
print("남자입니다.")
else:
print("여자입니다.")
say_myself("홍길동",30) #입력값을 주지 않아도 man=True로 실행
say_myself("디카프리오",20,False) #man=False로 바뀜.
➡️ 코드를 보면 man=True
라고 매개변수 초깃값을 설정했다. 이렇게 매개변수에 들어갈 값이 항상 변하지 않을 경우에는 초깃갑을 미리 설정하는 것이 유용하다.
def say_myself(name, man=True, old):
print("나의 이름은 %s 입니다." % name)
print("나이는 %d살입니다." % old)
if man:
print("남자입니다.")
else:
print("여자입니다.")
say_myself("홍길동",30)
# 오류 발생 : non-default argument follows default argument
➡️ 위 오류는 초깃값을 설정해 놓은 매개변수 뒤에 초깃값을 설정해 놓지 않는 매개변수는 사용할 수 없다는 뜻이다. 따라서 매개변수로 (name,old,man=True)
는 가능하지만,(name,man=True,old)
는 안 된다.
a = 1
def vartest(a):
a = a +1
vartest(a)
print(a)
#결과 1
➡️ 변수 a가 1이므로 1을 더해 2가 나올것 같지만, 결과는 1이다. 이유는 함수 안에서 새로만든 매개변수는 함수안에서만 사용하므로 함수만의 변수이기 때문이다. 즉 함수안의 a와 함수밖의 a는 다른 변수를 말한다.
def vartest(a):
a = a + 1
vartest(3)
print(a)
#결과는 오류 - name 'a' is not defined
➡️ 4가 나올 것 같지만, print(a)는 함수 밖의 a이고, 입력받아야하는 a 변수를 찾을 수 없으므로 오류가 뜬다.
1. return 사용하기
a = 1
def vartest(a):
a = a +1
return a # return을 추가함.
a = vartest(a) # 함수 리턴값을 a에 대입
print(a)
➡️ 코드에 return을 추가해 a를 돌려주고 그 리턴값을 a라고 대입하면, 함수를 사용해 함수 밖의 값을 변경할 수 있다.
2. global 명령어 사용하기
a = 1
def vartest():
global a #함수 안에서 함수 밖의 a변수를 사용하겠다는 의미
a = a+1
vartest()
print(a)
##그러나 이 방법은 좋은 방법이 아니라서 1번 방법 쓰기
lambda 매개변수1, 매개변수2, ... : 매개변수를 이용한 표현식
>>> add = lambda a, b: a+b #람다 함수
>>> result = add(3, 4)
>>> print(result)
7