본문 바로가기
멋쟁이사자처럼 AI스쿨

함수2(파이썬 강의 Day3)

by 헬푸밍 2023. 1. 4.

함수

def, return, argument, parameter, docstring, scope, lambda

반복적으로 사용되는 코드를 묶어서 사용하는 방법

=> 코드의 유지보수가 쉬워진다.

 

사용법 : 함수선언(코드작성)  -> 함수호출(코드실행)

 

- docstring

함수의 설명을 작성한다.

함수선언코드 바로 아래멀티라인 문자열로 작성한다.

help()함수로 docstring 출력이 가능하다.

 

간단한 덧셈함수의 docstring을 작성해보면...

def plus(n1, n2):
    '''
    This function is to plus two numbers.

    parameters
    ----------
    n1 : int. float : first number
    n2 : int, float : second number

    return
    ------
    n1 + n2 : int, float
    '''
    return n1 + n2
    
    help(plus)

맨 밑줄의 help(plus)를 통해 아래와 같이 docstring이 출력된다.

자주쓰는 함수인 print함수의 docstring도 확인할 수 있다.

help(print) # 프린트 함수의 docstring확인

 

- *args, **kwargs

    1. parameter에서 사용

argument의 갯수에 상관없이 함수를 실행하는 방법.

 

*args : 여러개의 argument를 tuple데이터타입으로 받아준다.

**kwargs : 여러개의 keyword argumentdictionary데이터타입으로 받아준다.

 

아래와 같은 코드를 보면...

def plus(*args, **kwargs): #파라미터에 컬렉션 데이터 타입을 받아줌 : 식별자 1개, 데이터 n개
    print(type(args), args)
    print(type(kwargs), kwargs)
    return sum(args) + sum(kwargs.values())

# 키워드 아규먼트는 키워드가 없는 아규먼트 뒤에 사용
plus(1, 2, n1=10, n2=20) # 여러개의 아규먼트

여러개의 argument를 받아주는 것을 볼 수 있고...

*args보다 **kwargs가 뒤에 오는 것을 볼 수 있다!

*args는 튜플형식이고 *kwargs는 딕셔너리형식인 것을 확인할 수 있다.

return 값은 덧셈이기 때문에 다 더한 값인 33이 출력된다.

 

    2. argument에서 사용

묶여 있는 컬릭션 데이터타입(list, tuple, dict)를 여러개의 argument로 풀어서 함수호출.

 

*args : list, tuple 데이터타입의 데이터를 여러개의 키워드가 없는 argument로 풀어줌

*kwargs : dict 데이터타입의 데이터를 여러개의 keyword argument로 풀어줌

 

다음 코드는 argument에서 *args의 사용을 확인하는 코드이다.

def echo(*args, **kwargs):
    print(type(args), args)
    print(type(kwargs), kwargs)

data = [1, 2, 3]
echo(data)  # echo([1, 2, 3]) > 아규먼트 : 1개, 데이터타입 : 리스트
echo(*data) # echo(1, 2, 3) > 아규먼트 : 3개, 데이터타입 : 정수

아래처럼 *args를 사용했을때 리스트 형식의 data가 풀린 것을 볼 수 있다.

이번엔 argument에서 **kwargs 사용을 확인해보자!

def echo(*args, **kwargs):
    print(type(args), args)
    print(type(kwargs), kwargs)

data = {'num1' : 10, 'num2' : 20}
echo(data)  # echo({'num1' : 10, 'num2' : 20}) > 아규먼트 1개, 데이터타입 : 딕셔너리
echo(**data)    # echo(num1=10, num2=20) > 키워드 아규먼트 2개, 데이터타입 : 정수

이렇게 dict가 풀려서 dict로 함수를 호출한다.

 

- scope

함수 밖 : 전역영역(global)

함수 안 : 지역영역(local)

 

다음과 같은 코드를 보자!

data = 10

def change():
    data = 20

change()
print(data)

함수 안에서 data = 20이라고 변수를 선언했지만 출력결과는...

위와 같이 함수 밖 변수 그대로 나왔다.

 

그 이유는 다음 그림과 같다!

 

바로 g(globa)영역에서 data = 10이 저장되고, l(local)영역에서 data = 20이 따로 저장되기 때문이다.

 

이 문제를 해결하려면 global을 사용한다!

global : 지역영역에서 전역영역의 변수사용 방법

 

아래와 같이 global data를 추가해 주면...

data = 10

def change():
    global data
    data = 20

change()
print(data)

전역 변수의 변수의 값이 나온다.

 

아래의 코드와 같이 지역영역에서 사용되는 변수가 지역영역이 없으면...

data = 10

def change():
    print('local', data)

change()
print('global', data)

전역영역의 변수를 가져와서 사용한다.

하지만 global을 써주는 것이 덜 헷갈린다!

 

return : 전역영역에서 지역영역의 변수를 사용하는 방법

data = 10

def change():
    data = 20
    return data

data = change()
print(data)

아래 코드와 같이 변수를 return해주면...

이렇게 지역영역의 값이 전역영역에서 출력된다!


저는 다음시간에 함수3으로 돌아오겠습니다...

댓글