Python/basic

[Learning Python] Functions and Getting Help

Tree_Park 2020. 11. 21. 15:23
728x90
def least_difference(a, b, c):
    diff1 = abs(a - b)
    diff2 = abs(b - c)
    diff3 = abs(a - c)
    return min(diff1, diff2, diff3)

Function과, help에 관한 이야기다.

 

www.kaggle.com/colinmorris/functions-and-getting-help

 

Functions and Getting Help

Explore and run machine learning code with Kaggle Notebooks | Using data from no data sources

www.kaggle.com

www.kaggle.com/learn/python

 

Learn Python Tutorials

Learn the most important language for data science.

www.kaggle.com

 


Functions and Getting Help


 Getting Help 

 

전의 듀토리얼에서 print, abs와 같은 함수들을 잠깐 다루어 보았다. 파이썬에서는 이러한 함수들의 사용법을 알려주기 위한 'help()' function을 내장하고 있다.

help("abs")

위와 같이 괄호안에 함수의 이름을 입력하면.

함수의 사용법과 설명

위와 같은 결과를 출력하게 된다.

보다싶이 help는 크게 두가지를 출력하게 된다.

    1. function의 header에 해당하는 정보, 즉 위의 경우에는 abs function에 어떤 인자가 들어가는지 볼 수 있다.

    2. 간단하게 function이 무슨일을 하는지를 설명한다.

 

* function을 사용할 시에 유의점.

function을 찾을 때, function을 그대로 help 함수의 인자로  주면 안되고, 함수명을 그대로 문자열 형태로 주어야 한다.

 

help("help")

 

help("help")의 출력결과

위의 설명을 보면, python promt창에서 help()를 호출하면, interactive한 help session을 시작하고,

thing, 즉 python object에 대한 도움말을 출력하게 된다.

여기에서 유의할점은, help가 어떻게 정의되어 있는지 보는 것인데, __call__(self, *args, **kwds)를 호출하는 것을 볼 수 있다. 

 

그렇다면 __call__은 무엇이고,  *args, **kwds는 무엇을 의미하는 걸까?

 

 


""" __init__ 인스턴스 초기화 할 때 불러와지고, __call__은 인스턴스가 호출됐을 때 실행 """

 Getting Help : __call__ 

iissgnoheci.tistory.com/8

 

__init__와 __call__ 의 차이 + 약간의 decorator

__init__ 인스턴스 초기화 할 때 불러와지고, __call__은 인스턴스가 호출됐을 때 실행 1 2 3 4 5 6 7 8 9 10 class A:     def __init__(self):         print('init')     def __call__(self..

iissgnoheci.tistory.com

class CuteDecorator: # class decorator를 선언할 때
    def __init__(self,data): # instance가 초기화될 때 
        self.storage = data  # self.storage 에 data를 초기화

    def __call__(self): # instance가 호출될 때
        print('data entered :',self.storage.__name__) # 아까 초기화한 data의 __name__을 print
        self.storage()  # 초기화한 함수 실행
        print('data exited :',self.storage.__name__)

@CuteDecorator
def printer(): # printer 함수 정의
    print('I print the empty space')

print('---start---')
printer()

""" Result is below
	---start---
    data entered : printer
    I print the empty space
    data exited : printer
"""

 Getting Help : *args, **kwds  

brunch.co.kr/@princox/180

 

[나름 중급 파이썬1] *args와 **kwargs

항상 헷갈리는 두 가지 다시 한번 살펴보자 | 이 글은 파이썬의 문법을 모르면 이해하기 어렵습니다. python의 함수 작성 요령, 인자(argument)와 파라미터를 이해한다면 도움이 되는 내용입니다. 아

brunch.co.kr

*와 **는 c에서보던 pointer의 값이나 pointer 값의 pointer를 가리키는 개념이 아니다.  *args는 이름에서 유추 해 볼 수 있듯 arguments의 약자이다. 즉, 앞에서의 __call__(self, *args,  **kwds)를 호출할 때, args에 들어가는 값들은 help(thing)를 호출했을 때 괄호안에 들어간 thing과 같은 인자가 tuple 형태로 들어갈 것이다.

**kwds는 딕셔너리 형태의 값들이 인자로 들어갈 때, 자세한 설명은 위의 링크를 참조


Getting Help : Result 

즉, help instance가 호출될때 자기 자신을 호출했을 때, 문자열이 아닌 함수의 형태로 전달된다면 어떻게 되겠는가?

help(abs(-2.2))
help(abs(-1))

신기하게도, 전달한 argument의 type object에 대한 설명이 나오는 것이다.

어 그렇다면 어떻게 문자열을 주면 해당하는 함수에 대한 설명이 출력되는 것일까? ......

음 아쉽게도, python의 help의  구조에 대한 것은 찾지 못하였다. 하지만, 내부 알고리즘을 예상해보면, 들어오는 인자가 string이면 해당하는 함수이름을 찾아서 설명 문서를 띄어주고, 없다면 에러를 띄우고 string이 아니라 int와 float같은 primitive type이면 해당하는 타입에 대한 설명 문서를 띄어주는게 아닐까??

 

정확히 아시는 분은 댓글을 남겨주시면 정말 감사합니다.


 Define Functions

처음에는 python에서 함수를 정의하는 법이나, 문장의 끝에 끝맺음 기호를 쓰지 않거나, 범위를 대괄호로 제한하지 않는 것에 정말 익숙하지가 않았다.

def least_difference(a, b, c):
    diff1 = abs(a - b)
    diff2 = abs(b - c)
    diff3 = abs(a - c)
    return min(diff1, diff2, diff3)

 

def라는 keyword로 시작하여 함수를 정의할 수 있고, 뒤에 오는 함수명과  괄호안에  파라미터를 정의하여 함수의 header를 정의할 수 있다.

 함수의 body를 작성하기 위해서는 함수의 header 바로 뒤에 ':'로 표기를 하고, body의 시작은 '/t(tab)'으로 들여쓰기하여 구분할 수 있다.

한가지 편한점은 기타 다른 언어처럼 함수의 return type이나, parameter들의 type을 지정하지 않아도 된다는 것이지만, 이건 이것대로 중간에 파라미터의 타입과 다른 인자를 함수의 인자로주어 에러가 나는 경우도 있어서 애매하긴 하다.

 

위의 함수를 사용할때는?

print(
    least_difference(1, 10, 100),
    least_difference(1, 10, 10),
    least_difference(5, 6, 7), # Python allows trailing commas in argument lists. How nice is that?
)

 요렇게 하고 결과는 "9 0 1"로 나타날 것이다.

 

 


 Docstrings 

comments 즉 주석이다.

# 한줄 주석은 이렇게 쓰고

"""

 여러 줄 주석은 이렇게 쓴다.

"""

# 한줄 주석
"""
	여러줄 주석
"""

 Default Arguments 

함수의 기본 인자,

print(1, 2, 3, sep=' < ')
# result is "1 < 2 < 3"

print(1, 2, 3)
# result is "1 2 3"

왜 위와 같은 결과가 나오는 것일까? 보통의 함수를 정의할 때,  argument들에 초기값을 부여할 수 있다. 위의 print함수의 sep인자의 경우 초기값이 ' '(공백)이기 때문에 두 번째 결과와 같이 인자를 지정해주지 않아도 되는 것이다. 만약 ' '이 아닌 ' < '를 원한다면 첫번째처럼 사용하는 것.

 


 Functions appiled to Functions 

def mult_by_five(x):
    return 5 * x

def call(fn, arg):
    """Call fn on arg"""
    return fn(arg)

def squared_call(fn, arg):
    """Call fn on the result of calling fn on arg"""
    return fn(fn(arg))

print(
    call(mult_by_five, 1),
    squared_call(mult_by_five, 1), 
    sep='\n', # '\n' is the newline character - it starts a new line
)

함수의 인자로 함수를 가져올 수 있다. 위의 코드 예를 보면, call()이라는 함수를 squeared_call함수의 인자로 사용하여 제곱연산을 구현한 것을 볼 수 있다.

 

이런 함수를 흔히 고차함수라고 하고, 이러한 고차 함수가 적용된 함수가  python에서는 built in되어 있다.

 

def mod_5(x):
    """Return the remainder of x after dividing by 5"""
    return x % 5

print(
    'Which number is biggest?',
    max(100, 51, 14),  # return 100
    'Which number is the biggest modulo 5?',
    max(100, 51, 14, key=mod_5), # return 14
    sep='\n',
)

위의 결과를 간단히 설명하면 첫 번째 max 함수에서는 가장 간단하게 큰 수인 100으로 리턴한다.

하지만, 두 번째 max에서는 key 인자값으로 mod_5 라는 '5를 나누었을 때 나머지를 구하는' 함수를 주어 각각의 인자에 key 함수를 적용했을 때 가장 큰 값인 14를 리턴한 것이다.

'Python > basic' 카테고리의 다른 글

[Learning Python] Hello world  (0) 2020.11.19