Python

[파이썬 코드 업] 4-2장.

patrick-star 2023. 5. 6. 09:36
728x90

4.4 doc string

함수의 도움말을 설정하고 싶을 때 doc string을 이용해줄 수 있다.

ex) find_divisor

def find_divisor(n, max) : 
    '''
    here is our doc string for find_divisor 
    '''
    for i in range(2, max + 1) : 
        if n % i == 0 : 
            print (i, 'divides evenly into', n)
            break
    else :
        print("No!!!!")

>>> help(find_divisor)
Help on function find_divisor in module __main__:

find_divisor(n, max)
    here is our doc string for find_divisor

함수를 선언하고 나서 바로 다음 줄에 주석 블록을 통해 작성하면 된다.

4.7 일급 객체인 함수

파이썬 함수를 일급 객체(first-class)로 다루면 디버깅, 프로파일링, 관련 작업 수행 시 굉장히 유용한 도구를 하나 갖게 된다.
이 방법으로 런타임 시 함수 관련 정보를 확보하는 장점을 취할 수 있다.

ex) avg 함수

def avg(a_list) : 
    ''' 리스트 항목들의 평균값 반환 '''
    x = sum(a_list) / len(a_list) 
    print('The avg is : ' + x) 
    return x 

avg는 이 함수를 참조하는 심벌릭 이름이며 파이썬 언어 안에서 호출될 수 있는 콜러블(callable)이기도 한다.

avg를 가지고 여러 작업을 수행할 수 있다.

1) avg가 가리키던 함수에 새로운 이름 부여

새로운 함수를 정의하겠다.

def new_func(a_list) : 
    return (sum(a_list) / len(a_list)) 

old_avg = avg 
avg = new_func 

이제 기존의 avg가 가리키던 함수는 old_avg라는 변수가 참조하게 되었고
avg라는 이름은 new_func 함수를 참조하게 되었다.

>>> old_avg([4, 6, 8])
The avg is :  6.0
6.0
>>> avg([4, 6, 8])
6.0

old_avg 함수이전에 선언한 avg 함수의 동작을 실행한다.
avg 함수새롭게 정의한 new_func 함수의 동작을 실행한다.

여기서 old_avg 함수의 정보들을 살펴보자.

>>> old_avg.__name__
'avg'
>>> help(old_avg)
Help on function avg in module __main__:

avg(a_list)
    리스트 항목들의 평균값 반환

old_avg의 이름으로 최초에 정의된 이름인 avg를 출력한다는 걸 알 수 있다.

4.8 가변 길이 인수 리스트

1) *args 리스트

*args 문법은 모든 길이의 인수 리스트에 접근하는데 사용된다.

  • 형식
def 함수이름([일반 인수,] *args) : 
    문장

예시를 살펴보자.

def my_var_func(*args) : 
    print('The number of args : ', len(args)) 
    for item in args : 
        print(item) 

>>> my_var_func(10, 20, 30, 40)
The number of args :  4
10
20
30
40  

위와 같이 모든 길이의 인수 리스트를 매개변수로 받을 수 있다.
특징이 있다면 인수에 대괄호 기호를 사용할 필요가 없다는 것이다.

일반 인수에 대해서 얘기해보면 *args에 포함되지 않는 추가 인수는 반드시 *args 앞에 위치하거나 키워드 인수여야 한다.

ex) 평균 계산 함수

>>> def avg(units, *args) : 
        print(sum(args) / len(args), units)

>>> avg('inches', 11, 22, 33, 55) # 일반 인수 units가 *args보다 앞에 위치했기 때문에 유효하다
30.25 inches
  • Note

*기호는 파이썬에서 여러 가지 용도로 사용된다.
*기호의 기본적인 사용법은 unpacked list이다. 리스트를 분리해서 항목들을 나열하는 것으로 교체하는 역할을 한다.

ex)

>>> ls = [1, 2, 3, 4]
>>> print(ls)
[1, 2, 3, 4]

>>> print(*ls) # 리스트인 ls 앞에 *를 붙여줌으로써 언팩된 것을 확인할 수 있음
1 2 3 4

또한 *를 제거함으로써 표준 파이썬 리스트로 패킹(packing)하는 동작도 실행할 수 있다.

2) **kwargs 리스트

키워드 인수를 지원하는 조금 더 복잡한 문법은 함수 호출 시 매개변수의 이름을 각각 지정하는 것이다.

ex) print(10, 20, 30, end = '.', sep = ',') # end, sep 매개변수의 이름을 직접 지정함

  • 형식
def 함수이름([일반 인수, ] *args, **kwargs) : 
    문장

함수 정의 안에서 kwargs는 키-값 쌍으로 구성된 딕셔너리 형태의 인수를 의미한다.

key = 매개변수의 이름 / value = 매개변수에 전달된 값 

def pr_named_vals(**kwargs) : 
    for k in kwargs : 
        print(k, ":", kwargs[k])

>>> pr_named_vals(a = 10, b = 20, c = 30) 

# 아래와 같이 key값은 a, b, c / values는 10, 20, 30 
a : 10
b : 20
c : 30
  • 또 다른 예시
def pr_vals_2(*args, **kwargs) :
    for i in args :
        print(i)

    for k in kwargs : 
        print(k, ":", kwargs[k])

>>> pr_vals_2(1, 2, -3, -11, a = 100, b = 2000)
1
2
-3
-11
a : 100
b : 2000