[Python] 함수

Jeongyun Heo·2020년 12월 15일
0

Python

목록 보기
7/36

점프 투 파이썬 참고: https://wikidocs.net/24

✍️  함수

입력값을 가지고 어떤 일을 수행한 다음에 그 결과물을 내어놓는 것
반복적으로 사용되는 부분을 함수로 작성


✍️  파이썬 함수의 구조

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

먼저 def(definition 혹은 define의 약자) 입력
그리고 function의 이름을 쓴다
그리고 괄호( )를 열고 닫고 그 다음에 : (콜론)을 넣어준다
Python은 들여쓰기로 function의 시작과 끝을 판단한다
보통 tab키로 들여쓰기
들여쓰기 되어 있는지 확인하고 수행할 문장 입력

함수이름은 아무거나 해도 상관없음
함수이름 뒤에 괄호 안에 매개변수는 함수 입력으로 전달되는 값을 받는 변수
수행할 문장 입력

function의 body 안에 뭐가 있든지 간에
우리가 function을 호출할 때마다 실행될 것이다.

function의 이름 뒤에 ( )괄호를 써야 function을 실행할 수 있다.
function 이름만 쓰고 뒤에 ( )괄호 안 쓰면 실행이 안 됨

  1. function 호출할 때 뒤에 ( )괄호 쓰는 거 잊지 말기
  2. function의 body는 들여쓰기로 구분되어야 한다

대부분의 함수는 input을 받아서 사용한다.

return ➡️ 함수의 결괏값을 돌려주는 명령어

return을 쓰고
print는 결괏값을 볼 때만 사용할 것


✍️  매개변수와 인수

매개변수: 함수에 입력으로 전달된 값을 받는 변수
인수: 함수를 호출할 때 전달하는 입력값


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

입력값이 없을 수도 있고 결괏값이 없을 수도 있고 둘 다 없을 수도 있음

함수의 형태는 입력값과 결괏값의 존재 유무에 따라 4가지 유형으로 나뉜다.

✅ 입력값이 있고 결괏값이 있는 함수 (일반적인 함수)

def add(a, b): 
    result = a + b 
    return result
    
a = add(3, 4) ➡️ 결괏값을 받을 변수 = 함수이름(입력인수1, 입력인수2, ...)
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입니다.


결괏값이 없는 함수는 호출해도 돌려주는 값이 없다.


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


a = add(3, 4) ⬅️ 여기서 함수 print 실행됨
print(a)
👉 
3, 4의 합은 7입니다. ⬅️ 함수에서 print 실행한 거. 결괏값을 돌려준 게 아님.
None ⬅️ 결괏값으로 돌려받은 게 없어서 None으로 나옴

pop 함수는 결과를 return 해준다
append 함수는 결과를 return 안 해준다
print 함수도 return 안 해줌

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

def say():  ⬅️ 입력값 없음
    print('Hi')  ⬅️ return문 없음


say() ➡️ 함수이름(비어있어야됨)
👉 Hi

✍️  매개변수 지정하여 호출 가능 (Keyword argument)

매개변수 지정하면 순서는 신경 안 써도 됨
매개변수가 많으면 순서 다 기억 못 하니까 keyword argument를 사용하는 게 나음
매개변수의 위치에 상관 없이 매개변수의 이름에 따라 값이 들어간다.

def add(a, b):
    return a + b


result = add(b=5, a=3) ⬅️ b에 5, a에 3을 전달
print(result)
👉 8

✍️  입력값이 몇 개가 될 지 모를 때 (*매개변수)

매개변수 앞에 *을 붙이면 입력값을 전부 모아서 튜플로 만들어준다.

def sum_many(*args): ⬅️ (*매개변수)
    sum = 0
    for i in args:
        sum = sum + i
    return sum


print(sum_many(1, 2, 3)) ⬅️ 안에 입력한 값들을 튜플로 만들어준다

👉 6

매개변수 이름은 아무거나 써도 되지만 'args'는 매개변수를 뜻하는 영어 단어 arguments의 약자이며 관례적으로 자주 사용한다.


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

매개변수에 미리 값을 넣는다.
변수에 입력 생략하면 설정해둔 초깃값으로 나옴.

def say_myself(name, old, man=True):  ⬅️ True 라고 값을 미리 넣음
    print("나의 이름은 %s입니다." % name)
    print("나이는 %d살입니다." % old)
    if man:
        print("남자입니다.")
    else:
        print("여자입니다.")
        
say_myself("짱구", 6)  ⬅️ man 값을 입력 안 함

👉 
나의 이름은 짱구입니다.
나이는 6살입니다.
남자입니다.  ⬅️ man 값을 생략해도 미리 설정한 초깃값이 있어서 나옴

📕  초깃값을 설정할 때 주의할 점
초깃값을 설정한 매개변수의 위치는 항상 맨 뒤
초깃값을 설정해 놓은 매개변수 뒤에 초깃값을 설정해 놓지 않은 매개변수는 사용할 수 없다.
초기화시키고 싶은 매개변수를 항상 뒤쪽에 놓는 것을 잊지 말자.


✍️   키워드 파라미터 kwargs

키워드 파라미터를 사용할 때는 매개변수 앞에 별 두 개(**)를 붙인다.

매개변수 이름은 아무거나 해도 상관없지만 args처럼 관례적으로 kwargs를 쓴다.

매개변수 이름 앞에 **을 붙이면 매개변수 kwargs는 딕셔너리가 되고
모든 key=value 형태의 결괏값이 그 딕셔너리에 저장된다.

def print_kwargs(**kwargs):
    print(kwargs)
    
print_kwargs(name="nana", age=4, fav_food="호두과자")

👉 {'name': 'nana', 'age': 4, 'fav_food': '호두과자'}

✍️   함수의 결괏값은 언제나 하나이다

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

result = add_and_mul(3, 4)

print(result)

👉 (7, 12)
결괏값으로 (7, 12)라는 하나의 튜플 값을 갖게 된다

하나의 튜플을 2개의 결괏값처럼 받고 싶으면 아래 참고

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


result1, result2 = add_and_mul(3, 4) ⬅️ (7, 12)
       ⬆️ 튜플을 사용한 변수값 대입 방법

print(result1)  ➡️ result1은 7
print(result2)  ➡️ result2는 12

👉 
7
12
▶️ 튜플을 사용한 변수값 대입 방법
a, b = 1, 2 
👉 a는 1이 되고, b는 2가 된다.

함수는 return문을 만나는 순간 결괏값을 돌려주고 바로 함수를 빠져나간다.

그러므로 아래와 같이 써도 두 번째 return문은 실행되지 않는다.

def add_and_mul(a, b):
    return a+b
    return a*b  ⬅️ 없는 거나 마찬가지

result = add_and_mul(3, 4)

print(result)

👉 7
첫 번째 return문인 return a+b의 결괏값만 나온다.
첫 번째 return문의 결괏값을 돌려주고 바로 빠져나왔기 때문에
두 번째 return문인 return a*b는 실행되지 않았다.

📕   return 단독으로 써서 함수 빠져나가기

특정한 상황일 때 함수를 빠져나가고 싶다면 return을 단독으로 써서 함수를 즉시 빠져나갈 수 있다.

def say_nick(a):
    if a == "멍청이":
        return    ⬅️ return 단독으로 입력
    print("나의 별명은 %s입니다." % a)


say_nick('짱구')
👉 나의 별명은 짱구입니다.

say_nick('멍청이')
👉 
아무것도 안 나옴.
입력값으로 '멍청이'라는 값이 들어오면 문자열을 출력하지 않고 함수를 즉시 빠져나간다.

✍️   lambda(람다)

함수를 한줄로 간결하게 만들 때 사용
def를 사용해야 할 정도로 복잡하지 않거나 def를 사용할 수 없는 곳에 주로 쓰인다.

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

def add(a, b):
    return a+b
    
add = lambda a, b: a+b
myList = [lambda a, b: a+b, lambda a, b: a*b]
리스트에 함수 2개 넣음

myList[0] ➡️ 첫 번째에 있는 함수 불러오는 거

print(myList[0](1, 2))
👉 3

print(myList[1](1, 2)) ➡️ 두 번째에 있는 함수 불러서 사용
👉 2


✏️  연습문제

🔷  주어진 자연수가 홀수인지 짝수인지 판별해 주는 함수(is_odd)를 작성해 보자.

def is_odd(number):
    if number % 2 == 1:
        return True
    else:
        return False


a = is_odd(3)
print(a)
👉 True

🔷  입력으로 들어오는 모든 수의 평균 값을 계산해 주는 함수를 작성해 보자. (단 입력으로 들어오는 수의 개수는 정해져 있지 않다.)

※ 평균 값을 구할 때 len 함수를 사용해 보자.

def avg(*args):
    result = 0
    for i in args:
        result = result + i
    return result/len(args)


result = avg(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
print(result)
👉 5.5

🔷  3과 6을 입력했을 때 9가 아닌 36이라는 결괏값을 돌려주었다. 이 프로그램의 오류를 수정해 보자.

※ int 함수를 사용해 보자.

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

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

👉
첫 번째 숫자를 입력하세요:3
두 번째 숫자를 입력하세요:6
두 수의 합은 36 입니다.
input1 = input("첫 번째 숫자를 입력하세요:")
input2 = input("두 번째 숫자를 입력하세요:")

total = int(input1) + int(input2) ⬅️ int 함수 추가
print("두 수의 합은 %s 입니다." % total)

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

입력은 항상 문자열이므로 숫자로 바꿔주어야 한다.

0개의 댓글