[Python]파이썬 자세히 공부하기 3️⃣

포동동·2023년 3월 3일
0

18. Docstring이란 무엇인가?

docstring은 모듈, 함수, 클래스 또는 메소드 정의의 첫 번째 명령문으로 발생하는 문자열 리터럴이다. 이러한 docstring은 해당 객체 의 doc 특수 속성으로 추가되며, [함수명].__doc__이나 help(함수명)으로 확인 가능하다. PEP257

모든 모듈에는 일반적으로 doc 문자열이 있어야 하며, 모듈이 내보내는 모든 함수와 클래스에도 있어야 한다. Public 메서드에도 있어야 한다. 공식문서에 따르면 docstring은 파이썬 bytecode 컴파일러에서 인식하지 않으며, 런타임 객체 속성으로 접근할 수 없다.

기본적으로 """triple double quotes"""을 써야하고 One-line Docstring으로 써도 되고, Multi-line Docstring으로 작성할 수도 있다. Standard convention은 아래와 같다.

  • Triple quotes are used even though the string fits on one line. This makes it easy to later expand it.
  • The closing quotes are on the same line as the opening quotes. This looks better for one-liners.
  • There’s no blank line either before or after the docstring.
  • The docstring is a phrase ending in a period. It prescribes the function or method’s effect as a command (“Do this”, “Return that”), not as a description; e.g. don’t write “Returns the pathname …”.
  • The one-line docstring should NOT be a “signature” reiterating the function/method parameters (which can be obtained by introspection). Don’t do:
# single-line docstring
def multiplier(a, b):
    """Takes in two numbers, returns their product."""
    return a*b
print(multiplier.__doc__)    
>>> 'Takes in two numbers, returns their product.'

# multi-line docstring
def complex(real=0.0, imag=0.0):
    """Form a complex number.

    Keyword arguments:
    real -- the real part (default 0.0)
    imag -- the imaginary part (default 0.0)
    """
    if imag == 0.0 and real == 0.0:
        return complex_zero
print(complex.__doc__)        
>>> '''
	Form a complex number.

    Keyword arguments:
    real -- the real part (default 0.0)
    imag -- the imaginary part (default 0.0)  
    '''

docstring은 사용자가 정의하는 함수 말고도 파이썬 내장함수에 대해서도 사용가능하다.

print(abs.__doc__)
>>> 'Return the absolute value of the argument.'

print(print.__doc__)
>>> '''Prints the values to a stream, or to sys.stdout by default.

  sep
    string inserted between values, default a space.
  end
    string appended after the last value, default a newline.        
  file
    a file-like object (stream); defaults to the current sys.stdout.
  flush
    whether to forcibly flush the stream.'''

19. 파이썬에서 함수란 무엇인가?

파이썬에서 함수는 코드의 반복을 줄이고 재사용, 그리고 프로그램 모듈화를 제공한다.

함수는 코드 블록을 나타내는 객체이며 재사용 가능한 엔터티이다. 그것은 프로그램에 모듈화와 더 높은 수준의 코드 재사용성을 제공한다. 파이썬은 print()와 같은 많은 내장 함수를 제공하며 사용자 정의 함수를 만들 수 있는 기능을 제공한다. 자주 헷갈리는 개념이 인자(arguments)와 매개변수(parameter)인데 아래 그림을 보면 알기 쉽다.

def multiple(a, b) :
	return a * b


20. 파이썬에서 사용할 수 있는 기본 함수는 무엇인가?

파이썬에서는 2가지 기본 함수 타입이 있다.

  1. 내장 함수

  2. 사용자 정의 함수

내장 함수에 대해서는 이 블로그에 잘 정리되어 있다.


21. 파이썬에서 function call이나 callable object은 무엇인가?

Python의 함수는 호출 가능한(callable) 객체로 처리된다. 일부 인수를 허용할 수 있으며 튜플 형식으로 하나의 값뿐만 아니라 여러 값을 반환할 수도 있다. 함수 외에도 파이썬은 클래스나 클래스 인스턴스와 같은 다른 구조를 가지고 있다.

우선 callable object란, 뒤에 ()소괄호를 붙여 호출 가능한 객체이다. 예를 들어, 함수, 클래스 인스턴스, 메서드 등이다. callable한지는 callable(함수나 클래스, 메서드) 와 같이 써주면 된다. 참고

def multiple(a, b) :
	return a*b
print(callable(multiple))
>>> True

print(callable(print))
>>> True

# callable한 클래스 인스턴스
class CallInstance:
    def __init__(self,name):
        self.name = name
    
    def __call__(self):
        print("  call 메서드 ")
        return self.name
c = CallInstance("과연?")
print(callable(c))
>>> True

# callable하지 않은 클래스 인스턴스
class Instance:
    def __init__(self,name):
        self.name = name 
i = Instance("안 되나?")
print(callable(i))
>> False

22. 파이썬에서 Call by ValueCall by Reference란 무엇인가?

우선, Call by value란, 변수를 복사한 값을 전달하는 방식으로, 함수가 a=10이라는 변수를 인자로 받았을 때 변수 a에 담긴 값 자체를 stack에 복사하여 넘겨준다. 예를 들어, def multiple이라는 함수에 a를 인자로써 전달하면 a 자체(a의 주소값)이 아니라 a의 복사 값을 전달한다. 따라서 multiple이라는 함수내에서 a를 바꿔도 원본 변수 a는 변하지 않는다(다만 int는 불변의 객체이다).

그리고, Call by reference란, 변수 자체의 주소값을 전달하는 방식으로 같은 예시로 함수에 a=10이라는 변수를 인자로 받으면 원본 변수 a의 주소값을 받기 때문에 함수내에서 a를 바꾸면 a의 주소값을 타고 들어가 a에 할당된 값을 바꾼다. 아래와 같은 코드가 있다고 하면 그림과 같이 이해하면 된다.

def multiple(a, b=2) :
	return a * b

a = 10

좋은 예시가 있다.

Call by value의 경우, 그 노트를 가져와 복사하여 복사본 위에 필기를 추가로 하는 것이다. 당연히 원래 노트에 무언가 덧쓰이지는 않는다.
Call by reference의 경우, 원본 노트가 있는 사물함 위치를 가르쳐주는 것이다(주소 값 참조).
그 사물함에 가서 노트를 가져와 그 위에 필기를 덧쓰는 것이니, 당연히 원본 노트는 내 필기가 추가되고 더러워질 수 있다.
이 과정에서 원본 노트의 틀린 부분이나 바꿀 부분을 변경할 수는 있지만, 자칫하면 중요한 부분을 건드려 노트를 망칠 위험이 있다.

그래서 파이썬은 둘 중 무엇인가 하면, 어떤 값을 전달하냐에 따라 달라진다. 이것을 Call by assignment라고 부른다. 파이썬의 자료형엔 mutable과 immutable이 있는데, 이 때 immutable한 객체를 넘기면 call by value가 되고, mutable한 객체를 넘기면 call by reference가 된다.

어떻게 이런 것이 가능하게 하는 가장 큰 이유는 파이썬은 모든 것을 객체로 바라보기 때문이다. 그 객체가 mutable인지 immutable인지에 따라 전달방식을 달리 할 수 있는 것이다.


23. trunc() 함수의 리턴값은 무엇인가?

파이썬에서는 실수를 처리하는데 4가지 방법이 있다.

  • 반올림(round()) : .5보다 작으면 버리고, .5보다 크면 올린다.
  • 올림(ceil()) : 양의 무한대 방향으로 가까운 정수를 선택한다.
  • 내림(floor()) : 음의 무한대 방향으로 가까운 정수를 선택한다.
  • 버림(trunc()) : 해당 값에서 0에 가까운 정수를 선택한다.
import math

# 반올림
print(round(1.5))
>>> 2
print(round(2.5))
>>> 2

# 올림
print(math.ceil(1.5))
>>> 2
print(math.ceil(-1.5))
>>> -1

# 내림
print(math.floor(1.5))
>>> 1
print(math.floor(-1.5))
>>> -2

# 버림
print(math.trunc(1.5))
>>> 1
print(math.trunc(-1.5))
>>> -1

주의할 점은, 파이썬에선 Round half to even 방식을 따르기 때문에 1.5나 2.5와 같은 중간값들은 짝수인 정수로 반올림된다(근사 오차를 줄이기 위해서라고 한다).


24. 함수에선 반드시 값을 반환해야 하는가?

반드시 필요한 것은 아니다. print로 함수를 빠져나갈 수도 있고 pass로도 가능하다. 또는 아무값도 주고 싶지 않다면 return None이나 return 만 작성해도 된다.

profile
완료주의

0개의 댓글