[Python] 함수

미남로그·2021년 10월 12일
0

4장 정리

1️⃣ 함수
2️⃣ 입력과 출력
3️⃣ 파일 읽고 쓰기
4️⃣ 연습 문제

파이썬 함수의 구조

def 함수명(매개변수):
	<수행할 문장1>
    <수행할 문장2>
    ...
def add(a,b):
	return a+b
a = 3
b = 4
c = add(a,b)
print(c)

# 실행값 7

매개변수와 인수

def add(a,b): # a, b는 매개변수
	return a+b
    
print(add(3,4)) # 3, 4는 인수

입력값과 결괏값에 따른 함수의 형태

입력값 ---> 함수 ----> 결괏값

일반적인 함수

def 함수이름(매개변수):
	<수행할 문장>
    ...
    return 결괏값
def add(a,b):
	result = a+b
    return result
>>> a = add(3,4)
>>> print(a)
7

입력값이 없는 함수

def say():
	return 'Hi'
>>> a = say()
>>> print(a)
Hi

결괏값을 받을 변수 = 함수이름()

결괏값이 없는 함수

def add(a,b):
	print("%d, %d의 합은 %d입니다." % (a,b,a+b))
>>>add(3,4)
3, 4의 합은 7입니다.

결괏값이 출력되었으므로 결괏값이 있는 것 같지만 사실은 없다. 그 이유는 print문은 함수의 구성 요소 중 하나인 <수행할 문장>에 해당하는 부분일 뿐이다. 결괏값은 없다. 결괏값은 return 명령어로만 돌려받을 수 있다.

>>> a = add(3,4)
>>> print(a)
None

a 값은 None이다. None이란 거짓을 나타내는 자료형이다. add 함수처럼 결괏값이 없을 때 반환값으로 None을 돌려준다.

입력값도 결괏값도 없는 함수

def say():
	print('Hi')
>>> say()
Hi

입력 인수를 받는 매개변수도 없고, return문도 없으니 입력값도 결괏값도 없는 함수이다. 이 함수를 사용하기 위한 방법은 딱 하나이다.

함수이름()

매개변수 지정하여 호출하기

def add(a,b)
	return a+b
>>> result = add(a=3, b=7) # a에 3, b에 7을 전달
>>> print(result)
10
>>> result = add(b=5, a=3) # b에 5, a에 3을 전달
>>> print(result)
8

입력값이 몇 개가 될지 모를 때

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

매개변수 부분이 *매개변수로 바뀌었음

여러 개의 입력값을 받는 함수 만들기

  • 여러 개의 입력값을 모두 더하는 함수 만들기
def add_many(*args):
	result = 0
    for i in args:
    	result = result + i
    return result

*args처럼 매개변수 이름 앞에 을 붙이면 입력값을 전부 모아서 튜플로 만들어준다. 만약 add_many(1, 2, 3)처럼 이 함수를 쓰면 args는 (1, 2, 3)이 되고, add_many(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)처럼 쓰면 args는 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)이 된다.

>>> result = add_many(1,2,3)
>>> print(result)
6
>>> result = add_many(1,2,3,4,5,6,7,8,9,10)
>>> print(result)
55

여러 개의 입력을 처리할 때만 사용하는 것은 아님

def add_mul(choice, *agrs):
	if choice == "add":
    		result = 0
            	for i in args:
                	result = result + i
       	elif choice == "mul1":
                	result = 1
                for i in args:
               		result = result + i
    	return result
>>> result = add_mul('add',1,2,3,4,5)
>>> print(result)
15
>>> result = add_mul('mul', 1,2,3,4,5)
>>> print(result)
120

매개변수 choice에 'add'가 입력된 경우 args에 입력되는 모든 값을 더해서 15를 돌려주고, 'mul'이 입력된 경우 args에 입력되는 모든 값을 곱해서 120을 돌려준다.

키워드 파라미터 kwargs

def print_kwargs(**kwargs):
	print(kwargs)
>>> print_kwargs(a=1)
{'a':1}
>>> print_kwargs(name='foo', age=3)
{'age':3,'name':'foo'}

입력값 a=1 또는 name='foo', age=3이 모두 딕셔너리로 만들어져서 출력된다. 즉 **kwargs처럼 매개변수 이름 앞에 **을 붙이면 매개변수 kwargs는 딕셔너리가 되고 모든 key=value 형태의 결괏값이 그 딕셔너리에 저장된다.

함수의 결괏값은 언제나 하나

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

※ add_and_mul 함수는 2개의 입력 인수를 받아 더한 값과 곱한 값을 돌려주는 함수이다.

result = add_and_mul(3,4)

를 호출시에 결괏값은 a+b와 ab 2개인데 결괏값을 받아들이는 변수는 result 하나만 쓰였다. 오류가 발생할 것 같지만 add_and_mul 함수의 결괏값 a+b와 ab는 튜플값 하나인 (a+b, a*b)로 돌려준다.

result = (7, 12)

(7, 12)라는 튜플 값을 갖게 된다.

만약 튜플 값을 두 개의 결괏값처럼 받고 싶다면

result1, result2 = add_and_mul(3,4)

result1, result2 = (7, 12)가 되어 result1은 7이 되고 result2는 12가 된다.

그러면 해당 코드는 가능할까?

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

result = add_and_mul(2,3)
print(result)

result로는 5만 나온다. 두 번째 return a*b는 시행되지 않았다.

즉 함수는 return문을 만나는 순간 결괏값을 돌려준 다음 함수를 빠져나가게 된다.

return의 또 다른 쓰임새❗

def say_nick(nick):
	if nick == '바보':
    		return
    	print("나의 별명은 %s입니다." % nick)

위 함수는 '별명'을 입력으로 전달 받아 출력하는 함수이다. 그런데 위 함수는 반환값이 없다. 문자열만 출력한다.

>>> say_nick('야호')
나의 별명은 야호입니다.
>>> say_nick('바보')
>>> 

매개변수에 초깃값 미리 설정하기

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

※ say_myself 함수는 3개의 매개변수를 받아서 마지막 인수인 man이 True이면 "남자입니다.", False이면 "여자입니다."를 출력한다.

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

이렇게 사용 가능하다.

출력값은

나의 이름은 박응용입니다.
나이는 27살입니다.
남자입니다.

초깃값 설정 부분을 False로 바꾼다면

say_myself("박응선", 27, False)
나의 이름은 박응선입니다.
나이는 27살입니다.
여자입니다.

say_myself 다시 만들어보기

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

오류가 발생한다. 만약

say_myself("박응용", 27)

이라 입력하면 매개변수를 어디에 넣어야 하는지 모름

함수 안에서 선언한 변수의 효력 범위

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

a라는 변수 생성 후 1을 대입하고 결괏값은 돌려주지 않는 함수 선언.

결괏값은 1이 나옴. 그 이유는 함수 안에서 새로 만든 매개변수는 함수 안에서만 사용하는 변수이기 때문이다.

따라서 vartest 함수는 아래와도 같다.

def vartest(hello):
	hello = hello + 1

다른 예시

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

오류가 뜸. a 변술가 없기 때문이다.

함수 안에서 함수 밖의 변수를 변경하는 방법

1. return 사용하기

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

2. global 명령어 사용하기

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

vartest()
print(a)

lambda

lambda는 함수를 생성할 때 사용하는 예약어로 def와 동일한 역할을 한다. 보통 함수를 한줄로 간결하게 만들 때 사용한다.

lambda 매개변수1, 매개2, ...: 매개변수를 이용한 표현식

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

이와 동일하다.

>>> def add(a, b):
...     return a+b
...
>>> result = add(3, 4)
>>> print(result)

※ lambda 예약어로 만든 함수는 return 명령어가 없어도 결괏값을 돌려준다.

profile
미남이 귀엽죠

0개의 댓글