함수

기본 구조

 def 함수명(매개변수):
     <수행할 문장1>
     <수행할 문장2>
     ...

매개변수의 갯수를 알 수 없을 때

def 함수이름(*매개변수): 
    <수행할 문장>
    ...

예시

>>> def add_many(*args): 
...     result = 0 
...     for i in args: 
...         result = result + i 
...     return result 
... 
>>>

매개변수 앞에 포인터 두개있는 경우

>>> def print_kwargs(**kwargs):
...     print(kwargs)
...

이런 경우에는 받아진 내용이 딕셔너리 형태로 저장이 된다.

예시

>>> print_kwargs(name='foo', age=3)
{'age': 3, 'name': 'foo'}

함수의 결과값

함수의 결과값은 무조건 하나여야 하지만 두개의 값을 보내고 싶을 때는 튜플값으로 돌려준다.

예시

>>> def add_and_mul(a,b): 
...     return a+b, a*b

result = add_and_mul(3,4)
result = (7, 12)

위와 같이 하나의 튜플 형태로 result에 저장되게 된다.

>>> result1, result2 = add_and_mul(3, 4)

튜플이 아닌 각 원소에 받고 싶다면 위와 같이 두개의 변수로 받을 수도 있다. 이 때 result1 은 7, result2 는 12가 된다.

함수의 초기값 설정해놓기

def say_myself(name, old, man=True): 
    print("나의 이름은 %s 입니다." % name) 
    print("나이는 %d살입니다." % old) 
    if man: 
        print("남자입니다.")
    else: 
        print("여자입니다.")

위와 같이 man 값은 미리 지정되어 있다. 이런 경우에는 초깃값을 가지고 있는 원소는 따로 값을 보내주지 않아도 알아서 값이 할당 된다.

say_myself("박응용", 27)
say_myself("박응용", 27, True)

위와 같이 두경우 모두 가능하다.

미리 값을 지정하지 않은 인자의 값을 주지 않은 경우는 다 SyntaxError가 발생한다.

선언된 변수의 효력 범위

a = 1
def vartest(a):
    a = a +1

vartest(a)
print(a)

만일 함수 내에서 만들어진 매개변수는 함수 안에서만 적용될 뿐이지 함수 밖에 있는 값을 변동시키지 않는다.

그렇다면 어떻게 함수를 이용해서 값을 바꿔줄 수 있을까?

return 이용하기

a = 1 
def vartest(a): 
    a = a +1 
    return a

a = vartest(a) 
print(a)

위와 같이 리턴값을 받게 함으로써 값을 변경할 수 있다.

global 명령어 이용하기

a = 1 
def vartest(): 
    global a 
    a = a+1

vartest() 
print(a)

외부 변수에 종속적인 함수는 그다지 좋은 함수가 아니기에 global 명령어를 사용하는 것은 비추라고 한다.(근데 이게 제일 편하긴 한데ㅠㅠ)

Lambda

람다는 함수생성 할때 사용하는 것으로 def와 동일한 역할을 한다. def를 사용할 정도로 복잡하지 않거나 def를 사용할 수 없는 곳에 주로 쓰인다.

예시

>>> add = lambda a, b: a+b
>>> result = add(3, 4)
>>> print(result)
7

사용자 입력과 출력

사용자 입력 받기

>>> a = input()
Life is too short, you need python
>>> a
'Life is too short, you need python'
>>>

위와 같이 바로 인풋을 받을 수도 있고

>>> number = input("숫자를 입력하세요: ")
숫자를 입력하세요: 3
>>> print(number)
3
>>>

정보를 print 하고 입력 받을 수도 있다.

다음 예시를 보면 데이터 타입을 지정해주지 않는 것에서 발생할 수 있는 문제를 보여주고 있다.

input1 = input("첫번째 숫자를 입력하세요:")
input2 = input("두번째 숫자를 입력하세요:")

total = input1 + input2
print("두 수의 합은 %s 입니다" % total)

위 프로그램을 수행하면

첫번째 숫자를 입력하세요:3
두번째 숫자를 입력하세요:6
두 수의 합은 36 입니다

이 문제를 해결하기 위해서는 total 값을 구하는데 있어서 타입 변환이 있어야 한다.

total = int(input1) + int(input2)

클래스

전형적인 형태

>>> class AddCal:
...     def __init__(self, first, second):
...         self.first = first
...         self.second = second
...     def setdata(self, first, second):
...         self.first = first
...         self.second = second
...     def add(self):
...         result = self.first + self.second

생성자(__init__)

생성자는 객체가 생성되는 순간 자동으로 호출되는 함수를 말한다.

def __init__(self, first, second):
    self.first = first
    self.second = second

위와 같이 쓰이게 되는데 여기서 self 는 java의 this 같은 친구로 생성되는 object를 의미한다.

a = Addcal(4, 2)

생성되는 객체에는 first에는 4, second에는 2라는 값이 저장된다.

이때 저장되는 변수는 따로 클래스에 변수로 남겨두지 않는다.

모듈

모듈 만들기

# mod1.py
def add(a, b):
    return a + b

def sub(a, b): 
    return a-b

모듈 불러오기

모듈을 위와 같이 만들어 놨다면 모듈을 가져와서 쓸 수 있다.

가져올 때는 import를 이용해서 가져오도록 하자

>>> import mod1
>>> print(mod1.add(3, 4))
7
>>> print(mod1.sub(4, 2))
2

쓸때는 import한 모듈의 점을 찍어서 표현한다.