27 Sep 2017 » python

2017-09-27-python_1

Python 함수에 대해 알아보자.

  • Definition
  • Parameter
  • Local, Global
  • Variable number of parameters
  • Docstring

함수의 정의

  • 콜론(:) 사용
  • 들여쓰기 (indentation)

    space 4

In [1]:
def test():
    print('in test function')
In [2]:
test()
in test function

Parameter

parameter

argumnet

In [3]:
def disk_area(radius):
    return 3.14 * radius * radius
In [4]:
disk_area(1.5)
Out[4]:
7.0649999999999995
In [5]:
def double_it(x):
    return x * 2
In [6]:
double_it(3)
Out[6]:
6

함수를 정의할 때, parameter를 포함하면 위처럼 그냥 콜을 하게 되면, 아래와 같이Error가 발생한다.

In [7]:
double_it()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-51cdedbb81b0> in <module>()
----> 1 double_it()

TypeError: double_it() missing 1 required positional argument: 'x'

Default parameter

아래처럼, default parameter 값을 넣어주면, 그냥 콜( )을 해도 Error가 발생하지 않는다!

In [8]:
def double_it(x=2):
    return x * 2
In [9]:
double_it(3)
Out[9]:
6
In [10]:
double_it()
Out[10]:
4
In [11]:
def slicer(seq, start=None, stop=None, step=None):
    return seq[start:stop:step]
In [12]:
rhyme = 'one fish, two fish, red fish, blue fish'.split()
rhyme
Out[12]:
['one', 'fish,', 'two', 'fish,', 'red', 'fish,', 'blue', 'fish']
In [13]:
# rhyme[::]
slicer(rhyme)  
Out[13]:
['one', 'fish,', 'two', 'fish,', 'red', 'fish,', 'blue', 'fish']
In [14]:
# rhyme[::2]
slicer(rhyme, step=2)
Out[14]:
['one', 'two', 'red', 'blue']
In [15]:
# rhyme[1::2]
slicer(rhyme, 1, step=2)
Out[15]:
['fish,', 'fish,', 'fish,', 'fish']
In [16]:
# rhyme[1:4:2]
slicer(rhyme, start=1, stop=4, step=2)
Out[16]:
['fish,', 'fish,']

Global & Local variable

globla

  • 바꾸고 싶은 값(갱신되어야 할 값)
  • mutable

local

  • 변경되지 않도록 하고 싶은 값
  • immutable

Local variable

In [17]:
def try_to_modify(x, y, z):
    x = 23
    y.append(42)
    z = [99] # new reference
    print(x)
    print(y)
    print(z)
In [18]:
a = 77    # immutable variable
b = [99]  # mutable variable
c = [28]
In [19]:
try_to_modify(a, b, c)
23
[99, 42]
[99]
In [20]:
print(a)
print(b)
print(c)
77
[99, 42]
[28]

위 결과를 비교해보자.

x y z
갱신되지 않는다. 리스트로 넣으면 추가 됨. 갱신되지 않는다.

따라서 a, c는 함수에 넣어도 함수 내부적으로 정해진 값만 출력되며, a, c 값도 변경되지 않는다.

하지만, b는 b 자체를 갱신시키는 메소드가 포함되어 있기 때문에 함수 리턴값도, b 자체 값도 갱신이 된다.

In [21]:
x = 5

def addx(y):
    return x + y
In [22]:
addx(10)
Out[22]:
15

위처럼 함수 정의에 변수(x)가 포함되어 있지 않다면, 바로 윗 단계에서 변수를 찾는다.

In [23]:
def setx(y):
    x = y
    print('x is {}'.format(x))
In [24]:
setx(10)
x is 10
In [25]:
x
Out[25]:
5

x는 local 변수이므로 def 밖에서는 변수 x에 영향을 주지 못한다.

단, 밖에도 영향을 주고 싶을 때는 아래와 같이 global 변수라고 선언해주면 된다.

Global variable

In [26]:
def setx(y):
    global x
    x = y
    print('x is {}'.format(x))
In [27]:
setx(10)
x is 10
In [28]:
x
Out[28]:
10

Variable number of parameters

  • *args: positional arguments (tuple)
  • **kwargs: keyword arguments (dictionary)
In [29]:
def variable_args(*args, **kwargs):
    print('args is', args)
    print('kwargs is', kwargs)
In [30]:
variable_args('one', 'two', x=1, y=2, z=3)
args is ('one', 'two')
kwargs is {'x': 1, 'y': 2, 'z': 3}

위 예에서 보듯이

*args는 실행인자를 튜플 형태로 다 받는다.

*kwargs는 실행인자를 딕셔너리 형태로 받는다.

Docstrings

In [31]:
def funcname(params):
    """Docstrings Test
    It's fun! I Like python.
    """
    pass

Docstrings을 확인하는 방법은 다음과 같다.

In [32]:
funcname??
In [33]:
funcname.__doc__
Out[33]:
"Docstrings Test\n    It's fun! I Like python.\n    "
In [34]:
help(funcname)
Help on function funcname in module __main__:

funcname(params)
    Docstrings Test
    It's fun! I Like python.

None

  • 아무것도 출력하지 않거나
  • 아무것도 받지 않는 경우
In [35]:
def f():
    a = 1
f()

위 함수는 return 값이 없으므로 값이 없다.(None)

In [36]:
x = f()
x
In [37]:
print(x)
None

is 비교

  • 같은 메모리를 가리키고 있는지 비교
In [38]:
a = 3.14 * 2
b = 6.28
In [39]:
a == b
Out[39]:
True
In [40]:
print(id(a), id(b))
4424416280 4424415872
In [41]:
a is b
Out[41]:
False

값은 같지만 id는 다르다.(같은 곳을 가리키고 있지는 않다.)

In [42]:
a = None
In [43]:
# a == None <---  사용하지 말것! __eq__ overload 시 위험!
a is None, a is not None
Out[43]:
(True, False)
In [44]:
def f(x, y=None):
    if y is None:
        return x * x
    else:
        return x * y
In [45]:
f(10)
Out[45]:
100
In [46]:
f(10, 20)
Out[46]:
200

Lambda Function 람다 함수

  • 이름이 없는 함수(익명 함수라고도 한다.)
  • 다른 함수의 인수 등으로 사용
  • argument () 대신 lambda 키워드
  • return 값 대신 반환할 값
In [47]:
def f(x):
    return 2 * x

f(3)
Out[47]:
6
In [48]:
g = lambda x: 2 * x

g(3)
Out[48]:
6


Related Posts