[Python] 파이썬의 함수

2022. 12. 28. 11:25·Programming
반응형

함수 정의 방법

함수는 다음과 같이 쓸 수 있다.

def first_func(w):
    print("Hello, ", w)

함수 호출 방법

위에 정의한 함수를 호출하고 싶을때는 어떻게 할까?

 

먼저, fist_func에는 파라미터(매개변수) w가 필요하다.

만약 파라미터가 없이 호출을 한다면 타입 에러가 난다. TypeError: first_func() missing 1 required positional argument: 'w'

아래 예제에서는 word를 미리 변수로 할당해주고 매개변수로 사용해주었다.

# 예제1
def first_func(w):
    print("Hello, ", w)
    # Hello, Goodboy


word = "Goodboy"

# 함수 호출
first_func(word)

 

# 예제2

def return_function(w):
    value = "Hello, " + str(w)
    return value

x = return_function('Goodboy2')
print(x)

# Hello, Goodboy2

또 !

first_func() <- 괄호를 꼭 넣어줘야한다.

괄호가 없는 first_func은 변수일 뿐이다. 

실제 출력 시 id값을 반환하는 것을 확인 할 수 있다. 

print(first_func)

>>> <function first_func at 0x000001C0DD0F3F40>

다중 반환

파이썬의 함수는 다중 반환이 가능하다,

def func_mul(x1):
    y1 = x1 * 10
    y2 = x1 * 20
    y3 = x1 * 30
    return y1, y2, y2


x, y, z = func_mul(10)

위 예제와 같이 y1, y2, y3을 반환한다.

이렇게 보면 3개의 다른 값으로 보이지만 사실은 하나의 튜플이다.

즉,  function이라는 함수는 하나의 튜플을 리턴한 것이다.

 

print(func_mul(10))
print(type(func_mul(10)))

>>> (100, 200, 200)
>>> <class 'tuple'>

 

그럼 반환값을 튜플이 아닌 리스트나 딕셔너리 형태로도 가능할까?

" 가능하다! "

 

반환값을 [ ] 로 묶어주면 리스트가 된다.

def func_mul3(x1):
    y1 = x1 * 10
    y2 = x1 * 20
    y3 = x1 * 30
    return [y1, y2, y2]


q = func_mul3(20)
print(type(q), q)


>>> <class 'list'> [200, 400, 400]

 

딕셔너리 형태도 아래와 같이 반환할 수 있다.

def func_mul4(x1):
    y1 = x1 * 10
    y2 = x1 * 20
    y3 = x1 * 30
    return {'y1': y1, 'y2': y2, 'y3': y3}


q = func_mul4(20)

print(type(q), q)

>>> <class 'dict'> {'y1': 200, 'y2': 400, 'y3': 600}

 

함수의 매개변수 *args & **kwargs 

*args : 

매개변수명은 바꿔써도 상관없다. (*something, *asedf 등 자유롭게 사용할 수 있다)

*args 는 *arguments의 줄임말이다. 

 

여러개의 인자(파라미터)를 받을 때 쓴다. (*args는 튜플이 형태이다)

 

# *args (언팩킹)
def args_func(*args):  # 매개변수 명은 자유
    for i, v in enumerate(args):
        print('Result : {}'.format(i), v)
    print('--------')


args_func('Lee')
args_func('Lee', 'Park')
args_func('Lee', 'Park', 'Kim')


>>> Result : 0 Lee
>>> --------
>>> Result : 0 Lee
>>> Result : 1 Park
>>> --------
>>> Result : 0 Lee
>>> Result : 1 Park
>>> Result : 2 Kim
>>> --------

 

**kwargs :

keyword arguments의 줄임말로 키워드를 제공한다.

딕셔너리의 형태로 함수 내부에 전달된다.

 

def kwargs_func(**kwargs):
    for v in kwargs.keys():
        print('Result : {}'.format(v), kwargs[v])
    print('---------')


kwargs_func(name1='Lee')
kwargs_func(name1='Lee', name2='Kim')
kwargs_func(name1='Lee', name2='Kim', name3='cho')

>>> Result : name1 Lee
>>> ---------
>>> Result : name1 Lee
>>> Result : name2 Kim
>>> ---------
>>> Result : name1 Lee
>>> Result : name2 Kim
>>> Result : name3 cho
>>> ---------

 

혼합 사용도 가능하다.

def example(args_1, args2, *args, **kwargs):
    print(args_1, args2, args, kwargs)


example(10, 20, 'Lee', 'Kim', 'Park', 'Cho', age1=10, age2=20, age3=30)
print('---------')


>>> 10 20 ('Lee', 'Kim', 'Park', 'Cho') {'age1': 10, 'age2': 20, 'age3': 30}
>>> ---------

 

중첩 합수

함수 안에 또 다른 함수가 있는 형태

def nested_func(num):
    def func_in_func(num):
        print(num)

    print("In Func")
    func_in_func(num + 100)


nested_func(100)

>>> In Func
>>> 200

# 함수 호출 불가 (외부에서 내부 함수 호출 불가)
# func_in_func()

 

람다식

람다는 메모리 절약, 가독성 향상, 코드의 간결화와 같은 장점이 있다.

람다식을 남용하면 오히려 코드를 이해하기 어려울 수 있다. 따라서 람다식을 사용할 경우 주석을 다는 것이 좋다.

 

일반적으로 우리가 사용하는 함수는 객체를 생성하고 -> 리소스(메모리) 할당을 하는 반면

람다식은 즉시 함수를 실행(Heap초기화) -> 메모리 초기화를 히기 때문에 불필요한 루프문을 삭제 할 수 있다.

 

람다에 대해 부정적인 의견을 피력하는 사람들도 많아 조금 더 깊은 학습이 필요할 것 같다.

 

 

그럼 람다는 어떻게 사용할까?

 

아래 함수는 모두 두 파라미터를 받아 값을 곱하여 반환하는 함수이다.

람다는 아래와 같이 lamda (인자):(반환 값) 의 형태이다.

def mul_func(a, b):
    return a * b


lambda a, b: a * b
# 일반 함수 -> 변수 할당
def mul_func(a, b):
    return a * b

mul_fun_var = mul_func

print(mul_fun_var(20, 50))

>>> 1000



# 람다 함수 -> 할당
lambda_mul_func = lambda a, b: a * b

print(lambda_mul_func(50, 50))

>>> 2500
def fun_final(a, b, func):
    print(a * b * func(100, 100))


fun_final(10, 20, lambda_mul_func)

>>> 2000000

 

 

해당 글은 인프런의 [프로그래밍 시작하기 : 파이썬 입문-Inflearn Original ] 강의를 듣고 정리한 개인적인 학습 노트 입니다.

반응형
'Programming' 카테고리의 다른 글
  • [Python] Class 클래스 개념
  • [Python] 입력
  • [Python] 제어 구조 : while 구문
  • [Python] 제어 구조 : For 구문
기록하기-
기록하기-
  • 기록하기-
    꾸밈없이 끊임없이
    기록하기-
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Programming
      • Episode
  • 블로그 메뉴

    • 깃허브
    • 링크드인
  • 링크

    • Github
    • LinkedIn
  • 공지사항

  • 인기 글

  • 태그

    파이썬문법
    Django
    Python 문법
    파이썬
    python
    파이썬 문법
    파이썬 기초
    python class
    파이썬기초
    python 기초 문법
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
기록하기-
[Python] 파이썬의 함수
상단으로

티스토리툴바