[Python]함수 - def / lambda
함수
: 입력값을 가지고 수행 후 결과물을 출력하는 일을 한다.
반복적으로 사용되는 가치있는 부분을 묶어 어떤 입력값을 주었을 때 어떤 결과값을 돌려준다.
프로그램의 흐름을 일목요연하게 볼 수 있어 오류발견이 쉽다.
def 함수명(매개변수): 수행문1 수행문2 ... |
def add(a, b):
retuen a+b
a = 3
b = 5
c = add(a, b)
print(c) # 8 출력
- 인수
: 함수를 호출할 때 전달하는 입력 값
- 매개변수
: 함수에 입력으로 전달된 값을 받는 변수
- 입력값, 결과값에 따른 함수의 형태
① 입력값과 결과값이 있는 함수 (일반적인 함수)
결과값을 받을 변수 = 함수명(입력인수1, 입력인수2, ...) |
def add(a, b):
result = a+b
return result
a = add(3, 4)
print(a) # 7 출력
② 입력값이 없는 함수
결과값을 받을 변수 = 함수명() |
def say():
return 'Hi'
a = say()
print(a) # Hi 출력
③ 결과값이 없는 함수
함수명(입력인수1, 입력인수2, ...) |
def add(a, b):
print("%d, %d의 합은 %d입니다." %(a, b, a+b) # 3, 4의 합은 7입니다. 출력
add(3, 4)
a = add(3, 4)
print(a) # None 출력. 결과값을 돌려받지 않기 때문. 결과값 없는것임!!
print문은 함수 구성요소 중 하나인 수행할 문장에 해당하는 부분. 결과값은 return 명령어로만 돌려받을 수 있다.
④ 입력값, 결과값 모두 없는 함수
함수명() |
def say():
print("Hi")
say()
- 매개변수 지정하여 호출
def add(a, b):
return a+b
result1 = add(a=3, b=7) # a에는 3, b에는 7을 대입
print(result1)
result2 = add(b=7, a=3) # 순서 상관없이 사용 가능
print(result2)
- 여러개의 입력값을 받을 수 있는 매개변수
: 매개변수 부분을 *매개변수로 바꿔준다. ==> 입력값을 전부 모아서 튜플로 만들어준다.(수정/삭제 X)
def add_many(*args):
result = 0
for i in args:
result = result + i
return result
result = add_many(1,2,3)
print(result) # 6 출력
result = add_many(1,2,3,4,5,6,7,8,9)
print(result) # 55 출력
def add_mul(choice, *args):
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) # 15 출력
result = add_mul("mul", 1,2,3,4,5)
print(result) # 120 출력
※ 키워드 파라미터
: 매개변수 앞에 별 두개(**)를 붙여 **매개변수가 딕셔너리가 되어 key=value형태의 결과값이 딕셔너리에 저장된다.
def print_kwargs(**kwargs):
print(kwargs)
print_kwargs(a=1)
# {'a' = 1} 출력
print_kwargs(name='foo', age=3)
# {'age'=3, 'name'='foo'} 출력
- 함수의 결과값은 언제나 하나이다.
return a+b, a*b
: 결과값은 튜플값 하나인 (a+b, a*b)로 돌려준다.
def add_and_mul(a, b):
return a+b, a*b
result = add_and_mul(3, 4)
result = (7, 12)
result1, result2 = add_and_mul(3, 4)
print(result1) # 7
print(result2) # 12
return a+b
return a*b
def add_and_mul:
return a+b
# return a*b # return이 1개 이상이면 뒤에 오는 return a*b는 실행되지 않는다.
result = add_and_mul(2, 3)
print(result) # 5 출력
※ return을 단독으로 사용해 함수를 빠져나갈때 사용이 가능하다.(즉시 함수 탈출)
- 매개변수에 초깃값 미리 설정하기
: 매개변수에 들어갈 값이 항상 변하는 것이 아닐 경우 유용하게 사용된다.
매개변수의 맨 마지막 값에 초깃값을 설정해줘야 한다.
### 초깃값을 설정한 매개변수 뒤에 초깃값을 설정해놓지 않은 매개변수를 사용할 수 없다. (오류메시지 출력)
def say_myself(name, old, man=True):
print("나의 이름은 {0}입니다.".format(name))
print("나의 나이는 {0}입니다.".format(old))
if man:
print("남자입니다.")
else:
print("여자입니다.")
say_myself('최웅', 20) # 입력값을 주지 않아도 초깃값인 True를 갖는다.
say_myself('최웅', 20, False) # 기존 True 값이 False로 갱신. "여" 출력
## def say_myself(name, man=True, old):
## say_myself('최웅', 20)
# 초깃값을 가운데에 설정하는 경우. 20을 man/old 중 어디에 대입해야하는지 모르게 된다.
- 함수 안에서 선언한 변수는 함수 안에서만 사용하는 변수이다. (이름이 같아도 해당 변수는 함수 밖에서 사용 불가)
a = 1 #전역변수
def vartest(a):
a+=1 #함수 안에서만 사용할 수 있는 지역변수.
#return값이 없어서 출력X
vartest(a)
print(a) #전역변수의 a값임 a=1
※ 함수 안에서 함수 밖의 변수를 변경하는 법
① return 사용
a = 1
def vartest(a):
a+=1
return a
a = vartest(a)
print(a) # a = 2
② global명령어 사용
but. 함수는 독립적으로 존재해야 좋기 때문에 외부 변수에 종속적인 함수로 사용하는 방법은 좋지 않다.
a = 1
def vartest():
global a #global = 전역변수. 함수안에서 함수 밖의 a변수를 사용하겠다.
a+=1
vartest()
print(a)
- lambda(익명함수)
: 함수를 생성할 때 사용하는 예약어. def와 동일한 역할. 함수를 간결하게 만들때 사용.
lambda 매개변수1, 매개변수2,, ... : 매개변수를 사용한 표현식 |
# def를 사용한 함수
def add(a,b):
return a+b
result = add(3, 4)
print(result)
# labmbda 함수
add = lambda a, b : a+b
result = add(3, 4)
print(result)
#람다에 조건부 사용
a = list(range(1,11))
print(list(map(lambda x:str(x) if x%2 == 0 else x, a))) # [1, '2', 3, '4', 5, '6', 7, '8', 9, '10'] 출력
#짝수면 str(x) else면 x. 리스트로 출력
※ 람다식에서 if를 사용했다면 반드시 else를 사용해야 한다.(간단한 경우에 사용함)
람다식에서 elif는 사용할 수 없다. 조건이 많은경우 if, else를 연속적으로 사용해야 한다.(사용 잘 하지않음)