본문 바로가기
Python 파이썬/기초 & 내장모듈

python ) 함수 function

by 하이방가루 2022. 3. 8.
728x90
반응형

어떤 기능을 하는 코드들을 묶어 재사용하거나 알기 쉽게 하기 위해 쓴다.

 

기본 형태

def 함수 이름() :

  문장

 

호출한다.

  '함수를 불러와서 사용한다'는 뜻

 

매개변수

  함수 호출 시 괄호 내부에 넣는 여러 가지 자료

def 함수이름(매개변수, 매개변수, ... ) :
  문장

  일반 매개변수

    함수에 매개변수를 반드시 넣어줘야할 때 쓴다.

    만약 함수를 만들 때 매개변수의 수와 함수를 호출했을 때 매개변수의 수가 다르다면 TypeError가 발생한다.    

  

  일반 가변 매개변수( *변수명 )

    매개변수를 원하는 만큼 받을 수 있게 해준다. -> 매개변수를 생략하거나 무한히 넣을 수 있다.

    가변 매개변수 뒤에는 일반 매개변수가 올 수 없다. -> 어길시 가변 매개변수가 어디부터 어디까지인지 알 수 없기 때문에 가변 매개변수 뒤에 일반 매개변수가 오면 일반 매개변수에 값이 들가지 않아서 TypeError가 발생한다.

    가변 매개변수는 1개만 쓸 수 있다.

    튜플로 값을 받아온다.

 

  기본 매개변수 (함수선언시 변수명=기본값 )

    매겨변수에 값이 입력되지 않으면 기본 값으로 처리 -> 매개변수를 생략할 수 있다.

    기본 매개변수 뒤에는 다른 매개변수가 올 수 없다. -> 가변 매개변수와 마찬가지로 기본 매개변수가 생략됐는지 안됐는지 알 수 없기 때문에 그렇다. 어길 시 TypeError가 발생하거나 의도와는 다르게 작동할 수 있다.

    키워드 매개변수 (함수호출시 변수명=값 )

      가변 매개변수 뒤에 있는 매개변수를 사용하기 위해 매개변수을 지정해서 값을 입력해야하는 매개변수

      일반 매개변수와 마찬가지로 가변 매개변수가 어디부터 어디까지인지 알 수 없기 때문에 사용한다.

      특정 매개변수에 값을 넣어 사용하는 방법정도로 생각하면 된다.

      매개변수 이름을 지정해서 입력하기 때문에 키워드 매개변수끼리는 순서를 섞어 넣어도 상관없다.

    키워드 가변매개변수(함수선언시 **변수명 )(함수호출시 키=값, 키=값, ... )

      키워드 매개변수를 원하는 만큰 받을 수 있게 해준다.

      매개변수를 딕셔너리(dictionary)의 형태로 받아온다.

      함수선언시 키워드 가변매개변수 뒤에는 어떤 매개변수도 올 수 없다.

요약 : 일반 매개변수 -> 일반 가변매개변수 -> 기본&키워드 매개변수 -> 키워드 가변매개변수

이런 식으로 함수 선언시 매개변수를 지정하는게 좋다.

일반 가변매개변수 뒤에 있는 매개변수는 키워드 매개변수 방식으로 써야 한다.

def repeat_print(value, n) :
  print(value*n)

repeat_print("안녕", 3) # 안녕안녕안녕
# repeat_print("안녕") # TypeError: repeat_print() missing 1 required positional argument: 'n'
# repeat_print("안녕", "hi", 3) # TypeError: repeat_print() takes 2 positional arguments but 3 were given


def test1(*value, n) :
  print(value*n)

test1("안녕", 1) # TypeError: test1() missing 1 required keyword-only argument: 'n'

def re_print(*values, n=2) :
  for value in values :
    print(value*n)

re_print("안녕") # 안녕안녕
re_print("안녕",3) # 3까지 가변 매개변수로 인식함
# 실행결과
# 안녕안녕
# 6

re_print("안녕", n=3) # 안녕안녕안녕 -> 키워드 매개변수

def test2(n=2, *values) :
  for value in values :
    print(value*n)

test2("안녕") # n에 "안녕"이 할당되고 values에는 아무것도 없기때문에 for문이 실행되지않고 끝나버림.
#아무것도 출력하지 않음.
test2(3, "안녕") # 안녕안녕안녕

def re_line_print(*values, n=2, l=1) :
  for i in range(l) :
    for value in values :
      print(value*n)

re_line_print("안녕", l=2, n=3)
# 실행결과
# 안녕안녕안녕
# 안녕안녕안녕

def mixed_params( name, age=19, *args, address, **kwargs ) :
  print("name :", name)
  print("age :", age)
  print("args :", args)
  print("address :", address)
  print("etc : ", kwargs)

mixed_params("Jack", 30, 'male','programer', mobile='11122220000', address='Jeju', email='jack@pro.net')
#실행결과
#name : Jack
#age : 30
#args : ('male', 'programer')
#address : Jeju
#etc : {'mobile': '11122220000', 'email': 'jack@pro.net'}

# age를 생략할 경우
mixed_params("Jack", 'male','programer', mobile='11122220000', address='Jeju', email='jack@pro.net')
#실행결과
#name : Jack
#age : male     # 이런 경우 때문에 기본 매개변수는 가변 매개변수 뒤에 넣는 것이 좋다.
#args : ( 'programer', )
#address : Jeju
#etc : {'mobile': '11122220000', 'email': 'jack@pro.net'}

# address 값을 안 넣을 경우
mixed_params("Jack", 30, 'male','programer', mobile='11122220000', email='jack@pro.net')
# TypeError: mixed_params() missing 1 required keyword-only argument: 'address'
# 때문에 반드시 입력받아야하는 매개변수는 일반 가변 매개변수 앞으로 생략가능하거나 없어도 되는 값은 일반 가변 매개변수 뒤에 위치해서 default값을 정해주는게 좋다.

 

리턴값

  함수를 호출하여 최종적으로 나오는 결과

  함수 내 return 키워드를 리턴값을 만들 수 있다.

  return을 쓰면 그 즉시 값을 반환하고 함수를 종료하기 때문에 return 뒤에 문장은 실행되지 않는다.

def return_test() :
  print('a')
  return
  print('b')

return_test()  # a만 출력됨

value = return_test()
print(value) # None -> 파이썬에서 없다는 의미
#####################
def factorial(n) :
  result = 1

  for i in renge(1, n+1) :
    result *= i

  return result

print( "1!:", factorial(1) ) # 1!: 1
print( "2!:", factorial(2) ) # 2!: 2
print( "3!:", factorial(3) ) # 3!: 6
print( "4!:", factorial(4) ) # 4!: 24

 

재귀 함수 (recusion function)

  재귀는 자기 자신을 호출하는 것을 의미한다.

  따라서 재귀함수는 자기 자신을 호출하는 함수를 의미한다.

def factorial(n) :
  if n == 0 :
    return 1
  else:
    return n * factorial( n-1 )

print( "1!:", factorial(1) ) # 1!: 1
print( "2!:", factorial(2) ) # 2!: 2
print( "3!:", factorial(3) ) # 3!: 6
print( "4!:", factorial(4) ) # 4!: 24

 

함수 데코레이터

  대상 함수의 앞뒤에 꾸밀 부가적인 내용을, 혹은 반복할 내용을 데코레이터로 정의해서 손쉽게 사용할 수 있도록 한 것

  기본 구조 예제

# 함수 데코레이터 정의
def test(function) :
  def warp( ) :
    print( '함수 시작' )
    function( )
    print( '함수 종료' )
  return warp

# 데코레이터를 사용하여 함수 정의
@test
def hello( ) :
  print( 'Hello~' )

# 함수 호출
hello()

# 실행결과
# 함수 시작
# Hello~
# 함수 종료
# hello()함수 호출 -> hello()함수를 매개변수로 하여 test함수 데코레이터 호출 -> wrap함수 정의하고 wrap함수를 호출하여 반환
728x90
반응형

댓글