함수 function

Nam Eun-Ji·2020년 11월 26일
0
  • 내장함수 : 기본적으로 제공하는 함수
  • 모듈의 함수 : import 해서 갖다가 쓸 수 있는 함수
  • 사용자정의함수 : 직접 함수를 만들어 사용하는 함수
  • 인자와 return은 있어도 되고 없어도 됨.
def 함수이름(인자1, ...):    # 인자 혹은 매개변수
    실행할 명령1
    실행할 명령2

    return 결과    

  • 여러개의 결과 돌려받기
def 함수이름(인자1, ...):
    실행할 명령1
    실행할 명령2

    return 결과1, 결과2, ...



unpacking

def addMulti(num1, num2):
    return num1 + num2, num1 * num2

addMulti(1, 2)   # (3, 2) tuple의 형태로 넘김. 때문에 결국 하나의 값을 받은 것과 같음
my_add, my_mul = addMulti(1,2)
my_add    # 3
my_mul    # 2
 # tuple형태로 넘겨주기 때문에 언패킹도 가능
  • 리스트나 튜플같이 index가 존재하는 객체를 *를 붙여 인자로써 함수에 입력하면 함수의 정의된 위치에 맞게 입력됨.
number_list = [1,2,3]
def reNum(num1,num2,num3):
    return num3,num2, num1
reNum(*number_list)      # 3, 2, 1
  • 함수에 설정된 파라미터 갯수와 넘겨주는 인자의 갯수가 다르면 오류 발생
list1 = [1,2]
list2 = [1,2,3,4]
def reNum(num1,num2,num3):
    return num3,num2, num1
reNum(*list1)      # TypeError: reNum() missing 1 required positional argument: 'num3
reNum(*list2)      # TypeError: reNum() takes 3 positional arguments but 4 were given


keyword arguments

  • 해당 방식으로 파라미터를 전달하면 실제 파라미터 순서가 변경되어도 괜찮음.
  • positional arguments 부분은 순서를 지켜줘야 함.
def introduce(arg1, arg2) :
    print(f"Hello, My name is {arg1}. I like {arg2} color.")
# keyword arguments ↓↓↓↓↓↓↓↓
introduce(arg2="yellow", arg1="John")    # Hello, My name is John. I like yellow color.
introduce("John", arg2="yellow")         # Hello, My name is John. I like yellow color.
introduce(arg2="yellow", "John")         # SyntaxError: positional argument follows keyword argument


Default value

  • 파라미터에 값을 전달하지 않아도 default 값이 있어, default값으로 전달됨.
def introduce(arg1, arg2="yellow") :
    print(f"Hello, My name is {arg1}. I like {arg2} color.")
# Default value ↓↓↓↓↓↓↓↓
introduce("John")       # Hello, My name is John. I like yellow color.
  • default parameter는 non-default parameter보다 앞에 있으면 안 됨.
    함수를 실행할 때 첫번째 인자의 위치 먼저 파악하기 때문에 default parameter가 non-default parameter가 먼저 정의될 경우 전달해준 인자가 첫번째 인자의 위치로 들어가고 두번째 인자가 전달되지 않는 것으로 나오기 때문.
def introduce(arg2="yellow", arg1) :
    print(f"Hello, My name is {arg1}. I like {arg2} color.")  
introduce("John")       # SyntaxError: non-default argument follows default argument
  • default value는 함수가 실행될 때가 아닌 정의된 함수가 처음 실행될 때임.
import time
print(time.ctime())     # Sun Dec  1 14:59:47 2019
print(time.ctime())     # Sun Dec  1 15:00:55 2019

def show_time(now=time.ctime()):
	print(now)
 
show_time()             # Sun Dec  1 15:01:16 2019
show_time()             # Sun Dec  1 15:01:16 2019  


keyword variable length of arguments / **kwargs

  • parameter가 몇개가 들어갈지 모를 경우 사용
  • 해당 파라미터는 dictionary형태로 들어감
def alphabet(**kwargs):
    for key in kwargs:
        print(f"{key} : {kwargs[key]}")

alphabet(a='apple', b='banana')
# 위와 같음(alphabet({'a':'apple', 'b':'banana'})

# a : apple
# b : banana


Non-keyworded variable length of arguments / *args

  • tuple형태로 넘어감
def alphabet(*args):
    print(args)
    for key in args:
        print(key)

alphabet('a','b','c')
# ('a', 'b', 'c')
# a
# b
# c


중첩함수 nested function

  • 함수 안에 자식함수를 정의
  • 자식함수를 호출하려면 부모함수에서 호출해야함. 부모함수 밖에서 호출 불가.
  • 사용이유 1) 가독성 : 함수 안의 코드 중 반복되는 코드가 있다면 중첩함수를 정의하여 가독성을 높임
  • 사용이유 2) closure : 외부로부터 접근은 막고 부모함수에서 선언된 변수는 사용가능하게 함
  • factory를 구현할 때 사용, 설정값을 노출하지 않고 해당 설정값을 기반으로 연산이 가능하게 할 때.


Decorator

  • b함수가 실행되기 전 a함수가 먼저 실행되게끔 하는 것
  • 데코레이터는 강제성, 가독성을 위해 사용
  • 기본적인 형태
@functionA
def functionB
profile
한 줄 소개가 자연스러워지는 그날까지

0개의 댓글