03장 연습문제 ~ 04-1 (p.146 ~ p.167)

 

이번 주는 설 연휴가 있어서 토요일이 되어서야 6일 차 공부를 할 수 있었다.

며칠을 쉬다가 다시 공부를 하려니까 초큼 힘들었다...😂

6일 차인데 벌써 함수 부분까지 왔다. 책의 권장 진도보다 2배가 빠른 만큼 전에 배운 내용을 잊지 않기 위해 복습도 철저하게 해야겠다.

 

가지마아아...

 


 

03장 연습문제는 확실히 2장에서 배운 내용까지 합쳐서 나오다 보니 2장 연습문제보다는 조금 난이도가 있었다.

헷갈리는 부분은 전에 작성한 블로그 글을 훑어보니 해결할 수 있었다.

 

4장 : 프로그램의 입력과 출력

 

4장에서는 프로그램의 입력과 출력을 다루는 방법을 설명하는데 그중에서 오늘은 함수에 대해서 배웠다.

입출력 부분은 프로그래밍의 설계과 밀접한 관련이 있기 때문에 매우 중요한 부분이기도 하다.

 

04-1 함수

 

함수는 과일이 입력, 과일 주스가 출력이라면 믹서는 함수에 비유할 수 있다.

즉, 입력값을 가지고 어떤 일을 수행한 다음에 그 결과물을 내놓는 일을 하는 것이 함수이다.

 

함수를 사용하는 이유

함수는 프로그래밍을 하다 보면 똑같은 내용을 반복해서 작성하는 경우가 있을 때 사용하면 시간도 절약할 수 있고 코드도 일목요연하게 작성할 수 있어서 가독성 측면에서 장점이 있다. 그래서 버그를 확인할 때도 유용할 수 있다.

# 파이썬 함수의 기본적인 구조
def 함수이름(매개변수):
    수행할 문장1
    수행할 문장2
    ...
    
# 기본적인 예
def add(a, b): # a, b는 매개변수
    return a + b # return은 함수의 결괏값을 돌려주는 명령어 
                 # 이 함수의 이름은 add이고 입력으로 2개의 값을 받으며 결괏값은 2개의 입력값을 더한 값이다.

print(add(3, 4)) # 3, 4는 인수
>>> 7

 

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

함수의 형태는 입력값과 결괏값의 존재 유무에 따라 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) # 함수이름(입력인수1, 입력인수2, ...)
>>> 3, 4의 합은 7입니다.


# 입력값도 결괏값도 없는 함수
def say():
    print('Hi')
    
say() # 함수이름()
>>> Hi

 

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

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

result = add(b=7 a=3) # 순서 상관 없이 사용 가능
print(result)
>>> 10

 

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

매개변수 앞에 *를 붙인다.

def add_mul(choice, *args): # 매개변수 args 앞에 *, 다른 매개변수 추가 사용 가능
    if choice == "add":
        result = 0
        for i in args:
            result = result + i
    elif choice == "mul":
        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

 

키워드 파라미터

def print_kwargs(**kwargs): # 매개변수 앞에 **를 붙이면 입력값이 딕셔너리로 출력
    print(kwargs)
    
print_kwargs(a=1)
>>> {'a' : 1}
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)
print(result)
>>> (7, 12) # 결괏값을 튜플로 돌려준다.

def add_and_mul(a,b):
    return a+b
    return a*b
    
result = add_and_mul(3,4)
print(result)
>>> 7 # 결괏값은 언제나 하나이기 때문에 첫 번째 return문만 반환

 

* return은 단독으로 사용해서 함수를 빠져나올 때 사용할 수도 있다.

 

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

def say_myself(name, old, man=True): # 매개변수에 들어갈 값이 항상 변하는 것이 아닐 경우에 유용
    print("나의 이름은 %s입니다." % name)
    print("나이는 %d살입니다." % old)
    if man:
        print("남자입니다.")
    else:
        print("여자입니다.")
        
say_myself("홍길동", 26)
>>> 나의 이름은 홍길동입니다.
    나이는 26살입니다.
    남자입니다.
say_myself("홍길동", 26, True)
>>> 나의 이름은 홍길동입니다.
    나이는 26살입니다.
    남자입니다.
say_myself("홍길순", 26, False)
>>> 나의 이름은 홍길동입니다.
    나이는 26살입니다.
    여자입니다.

# 초기화시키고 싶은 매개변수는 항상 맨 뒤쪽에 놓아야 한다.

 

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

함수 안에서 사용하는 매개변수는 함수 밖의 변수 이름과는 전혀 상관이 없기 때문에 서로 같은 변수로 취급하면 안 된다.

a = 1
def vartest(a):
    a = a + 1
    
vartest(a)
print(a)
>>> 1 # 함수 밖의 a 변수와 함수 안의 a변수는 서로 다른 것이기 때문에 결괏값이 2가 아닌 1


def vartest(a):
    a = a + 1
    
vartest(3)
print(a)
>>> 오류 발생 # print(a)에서 입력받아야 하는 a 변수가 존재하지 않기 때문(함수 밖에 변수가 존재하지 않는다.)
# 함수 안에서 함수 밖의 변수를 변경하는 방법

# 1. return 사용하기
b = 1
def vartest(a):
    a = a + 1
    return a
    
b = vartest(b) # b가 vartest 함수의 결괏값으로 바뀜. b 변수가 vartest 함수의 a 매개변수에 대입됨
print(b)
>>> 2


# 2. global 명령어 사용하기
a = 1
def vartest():
    global a # 함수 안에서 함수 밖의 a 변수를 직접 사용하겠다는 뜻
    a = a + 1
    
vartest()
print(a)
>>> 2 # global 명령어는 되도록 사용하지 않는 것이 좋음
      # 함수는 독립적으로 존재하는 것이 좋기 때문
      # 외부 변수에 종속적인 함수는 그다지 좋은 함수가 아님

 

lambda

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

# lambda의 구조
lambda 매개변수1, 매개변수2, ...: 매개변수를 사용한 표현식

# lambda의 예
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)
>>> 7

 

+ Recent posts