dev/Python

[Python]함수 - def / lambda

mingracle 2022. 1. 22. 04:24

함수

  : 입력값을 가지고 수행 후 결과물을 출력하는 일을 한다.

    반복적으로 사용되는 가치있는 부분을 묶어 어떤 입력값을 주었을 때 어떤 결과값을 돌려준다.

    프로그램의 흐름을 일목요연하게 볼 수 있어 오류발견이 쉽다.

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를 연속적으로 사용해야 한다.(사용 잘 하지않음)