본문 바로가기

PROGRAMMING

[혼공학습단] 혼자 공부하는 파이썬 학습단 4주차 미션

벌써 4주 차... 이 정도면 파이썬의 gosu정도는 아니어도 jungsu 정도는 될 줄 알았는데 그냥 n00b넹... lol

지난 2주를 스프링 부트에 태워서 부랴부랴 주말에 공부했다. 아 내 2주 돌려줘요

 


함수(function)

함수는 function이다. 그리고 method이기도 하다. method를 메소드로 써야 하는지 메서드로 써야 하는지 헷갈리는데 아무튼 어떤 기능을 위해서 만들어진 하나 이상의 명령어 집합을 함수라고 한다. '하나 이상'이라고 적어 놓은 이유는 뒤에 오는 '집합'이라는 표현에 마음을 빼앗겨 IDE를 떠도는 초보 발자들이 있기 때문이다... return 0;도 함수 알맹이가 될 수 있다. 그럼 집합 말고 블록이라고 하자. 오 그럼 더 낫겠다.

 

함수 얘기를 시작할 때 나는 항상 '덧셈을 할 수 있는 상자' 이야기를 한다. 어떤 상자가 있다.

1) 이 상자를 흔들면 지정된 두 개의 숫자를 더한 결과를 돌려준다.
2) 이 상자에 임의의 두 개의 숫자를 넣고 흔들면 더한 결과를 돌려준다.

이런 식으로, '더하기'라는 기능을 수행하지만 값을 넘겨주는 방식이 달라질 수 있고, 결과가 하나 돌아오는 것을 '함수'라고 이야기 한다. '흔들기'라는 건 '호출하기' 대신 사용한 액션이다.

 

세상에 있는 거의 모든 행동은 함수가 될 수 있다.

함수 밥먹기(매개변수 음식);
함수 걷기(매개변수 속도);
함수 생각하기(매개변수 없음);
함수 드립치기(매개변수 부담감);

 

이런 것 처럼 주로 어떤 행동(기능)을 하기 위해서 함수를 정의한다. 클라이언트와 통신을 한다든지, 데이터베이스와 통신을 한다든지, 데이터를 가공한다든지. 여기서 설명하지는 않을 거지만, 함수는 어떤 기능 하나를 단위로 작성하는 것이 좋다. 아까 예로 든 세 개의 기능을 모두 수행하는 '클라이언트와 통신하고 데이터를 가공해서 데이터베이스와 통신하는 기능'이 있다고 할 때, 만약 세 기능 중의 한 군데가 이상한 행동을 일으켰다면 세 기능이 나눠져 있는 쪽과 아니면 꼭 붙어있는 쪽, 어느 쪽이 유지보수가 편할까?

 

후자요.

 

그걸 지켜보는 나머지 친구들...

 

전자다.

 

전자라고.

아 이제 짐짓 멋진 척 찌끄리기보단 미션을 해야겠다.

def sum_all(start, end):
    output = 0

    # 마지막값까지 포함하여 더해야 하기 때문에 마지막 + 1을 범위의 마지막으로 지정
    for i in range(start, end + 1):
        output += i
    
    return output


# call
print("0 to 100 : ", sum_all(0, 100))
print("0 to 1000 : ", sum_all(0, 1000))
print("50 to 100 : ", sum_all(50, 1000))
print("500 to 1000 : ", sum_all(500, 1000))

 

이제 1부터 10까지의 합은 55이고 100까지의 합은 5050이라고 자면서도 이야기할 수 있을 것 같다...

 

2주 동안 파이썬 안 한 티 너무 났다. 세미콜론 오지게 치다가 으아아아 않이야 하면서 지웠음.

 

아무튼 갖다주는 값만 더하면 재미없으니까 좀 더 적어봤다.

 

바로바로~ 사용자가 입력한 값으로 연산하기~

def sum_all(start, end):
    output = 0

    # 마지막값까지 포함하여 더해야 하기 때문에 마지막 + 1을 범위의 마지막으로 지정
    for i in range(start, end + 1):
        output += i
    
    return output

num1 = int(input('첫번째 숫자 입력 : '))
num2 = int(input('두번째 숫자 입력 : '))

print('{} to {} : {}'.format(num1, num2, sum_all(num1, num2)))

결과를 보즈아

음 너무 잘되는데? 하지만...

 

 

항상 이렇게 개발자의 기썬~을 제압하는 사용자들도 있는 법...

 

그래서 약간의 코드를 또 추가해봤다.

 

def sum_all(start, end):
    output = 0

    # 마지막값까지 포함하여 더해야 하기 때문에 마지막 + 1을 범위의 마지막으로 지정
    for i in range(start, end + 1):
        output += i
    
    return output


num1 = int(input('첫번째 숫자 입력 : '))
num2 = int(input('두번째 숫자 입력 : '))

if(num1 > num2) :
    temp = num1
    num1 = num2
    num2 = temp


print('{} to {} : {}'.format(num1, num2, sum_all(num1, num2)))

나 저 if문에 중괄호랑 세미콜론 오지게 적어놓고 구문 에러 났는데 이해 못 함... 일요일이라 대뇌도 휴식하는 듯

 

아무튼 값을 보내기 전에 첫 번째 숫자가 두 번째 숫자보다 크다면 서로 값을 교환하는 코드를 추가하였습니다. (읍에 취소선 해놨는데 아무 티도 안 남ㅋㅋㅋㅋ)

 

그렇게 해서 앞의 숫자가 크더라도 값을 교환한 후에 함수로 전달하기 때문에 결과는 작은 수부터 큰 수를 더한 것이 나온다.

 

like this

휴... 이렇게 기초 미션을 처.리.해버렸다...!

 

그럼 추가 미션도 해야지. 어우 매개변수에 대해서는 일장연설 가능... 이지만 공간이 모자라 적지 않겠다. (페르민이의 정리, 2022)

 

에바고

 

함수에는 매개변수라는 녀석이 존재하는데, 이 매개변수는 '함수 안에서 사용하기 위한 재료'라고 설명할 수 있겠다. 그리고 이 매개변수는 있을 수도 있고, 없을 수도 있다.

 

문자열을 콘솔에 출력하는 print()라는 함수를 예로 들었을 때, 괄호() 안에 매개변수로 문자열이나 숫자, 변수 이름이 들어간다면 그것을 화면에 출력하겠지만, 매개변수가 없다면 줄 바꿈 기능(그냥 빈 줄을 출력한다고 생각해도 좋겠다)을 하는 것처럼, 함수에는 매개변수를 전달할 수도 있고 아닐 수도 있다.

 

파이썬에서는 이런 매개변수 중에서도 특이한 애들이 있다. 가변 매개변수와 기본 매개변수, 그리고 키워드 매개변수가 그것이다.

 

설명보다 이거 만드는 시간이 더 걸렸다... 나의 열정.. 더이상 설명이 必要韓紙?

자 그래서 이 매개변수들이 뭐냐면

 

가변 매개변수는 함수가 원하는 만큼 매개변수를 받을 수 있다는 것이다. 일반적인 함수의 매개변수는 함수를 선언할 때 같이 선언한 매개변수의 수와 일치하는 만큼의 변수를 호출할 때 보냈었지만, 함수에서 사용할 매개변수의 숫자를 다양하게 하여 호출할 수 있다. 키워드로는 매개변수 이름 앞에 *(asterisk)를 달아야 하고, 주의해야 할 점은 매개변수 목록에서도 가장 마지막에 와야 한다는 점이다. 매개변수의 숫자가 변할 수 있다는 장점은 어디서부터 어디까지가 가변 매개변수인지 알기가 힘들기 때문에 필요한 개수만큼의 매개변수를 선언하고 마지막으로 여기서부터 들어오는 애들은 가변이 들입니다. 하고 알려줘야 한다.

 

기본 매개변수는 C++의 default parameter와 비슷하게 함수 호출 시에 해당하는 매개변수 값이 오지 않으면 사용할 기본값을 의미한다. 매개변수 이름=값의 형태로 작성하고, 이것도 가변이와 마찬가지로 일반 매개변수들의 뒤에 와야 한다.

 

키워드 매개변수는 기본 매개변수가 선언된 함수의 특정한 매개변수 값을 지정할 때 '호출하는 곳'에서 정하는 값이다. 해당하는 매개변수 위치에 3이라는 값을 지정해도 되지만, n=3이라고 매개변수의 이름을 특정하여 값을 보낼 수도 있다.

def test(a, b = 100, c = '호이호이') :
    print('a : ', a)
    print('b : ', b)
    print('c : ', c)

# 10, 100, 호이호이
test(10)

# 10, 101, 호이호이
test(10, 101)

# night, 100, 테스트
test('night', 100, '테스트')

# 100, 디폴트, 키워드 매개변수
test(c = '키워드 매개변수', b = '디폴트', a = 100)

 

위의 예제처럼, 디폴트 매개변수를 사용할 수도 있으나, 호출하는 곳에서 '변수 이름 = 값'과 같은 표현을 사용하여 '나는 이 매개변수에 이 값을 지정하겠어!!!'와 같은 식으로도 값을 지정할 수 있다.

 


다음 주도 할일이 많지만... 힘내자 뿌슝빠슝...

생각해보니까 지난번이랑 환경이 달라서 뭘까... 했는데 지난주 파이참에서 했네...

파이참... 볼때마다 깨비참 같단 말이지...

파이참... 파이드릴조...