TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 기초>

[파이썬] 파이썬기초: 함수

by 기록자_Recordian 2024. 6. 17.
728x90
반응형
시작에 앞서
해당 내용은 '<Do it! 점프 투 파이썬> 박응용 지음. 이지스 퍼블리싱' 을 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적에 상세히 나와있으니 서적을 참고해 주시기 바랍니다.

함수

 

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

 

[함수를 사용하는 이유]

1. 반복되는 부분이 있을 경우 '반복적으로 사용되는 가치 있는 부분'을 한 뭉치로 묶어서 '어떤 입력값을 주었을 때 어떤 결괏값을 돌려준다'라는 식의 함수로 작성하는 것이 현명하다.

 

2. 자신이 만든 프로그램을 함수화하면 프로그램을 흐름을 일목요연하게 볼 수 있다.

 

▶ 함수를 잘 사용하고 함수를 적절하게 만들 줄 아는 것이 중요하다.


파이썬 함수의 구조
<파이썬 함수의 구조>
def 함수 이름(매개 변수):
    수행할 문장1
    수행할 문장2
    ...

 

▶ def는 함수를 만들 때 사용하는 예약어 / 함수 이름은 함수를 만드는 사람이 임의로 생성가능
▶ 함수 이름 뒤 괄호 안의 매개변수: 함수에 입력으로 전달되는 값을 받는 변수

▶ 함수를 정의한 다음 함수에서 수행할 문장 입력

 

<함수의 예>
def add(a, b):
    return a + b
▶ 함수의 이름은 add / 입력으로 2개의 값을 받으며 / 결괏값은 2개의 입력값을 더한 값
▶ return: 함수의 결괏값을 돌려주는 명령어

 

※ 매개변수: 함수에 입력으로 전달된 값을 받는 변수

인수: 함수를 호출할 때 전달하는 입력값


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

 

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

 

1. 일반적인 함수

결괏값을 받을 변수 = 함수이름(입력인수 1, 입력인수 2, ...)

 

2. 입력값이 없는 함수 (입력값이 없고 결괏값만 있는 함수)

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

3. 결괏값이 없는 함수

함수이름(입력인수1, 입력인수2, ...)

 

결괏값은 오직 return 명령어로만 돌려받을 수 있다.

 

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

함수 이름( )

 


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

 

매개변수를 지저하면 순서에 상관없이 사용할 수 있다는 장점이 있다.


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

 

예제. 여러 개의 입력값을 모두 더하는 함수 생성.

 

여러 개의 입력 처리할 때

▶ 함수는 입력값이 몇 개이든 상관 없이 *args 처럼 매개변수 이름 앞에 * 를 붙이면 입력값을 전부 모아서 튜플로 만들어 준다. (매개변수 명은 * 뒤에 아무 이름이나 써도 된다.)

 

※ 키워드 파라미터

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

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

(역시, 매개변수 명은 ** 뒤에 아무 이름이나 써도 된다.)


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

 

함수의 결괏값은 언제나 1개이다.

▶ 위의 add_and_mul 함수의 결괏값 a+b, a*b는 튜플 값 하나인 (a+b, a*b)로 돌려준다.

 

만약 하나의 튜플 값을 2개의 결괏값처럼 받고 싶다면 아래와 같이 입력하면 된다.

※ return문을 2번 사용하면 2개의 결괏값을 돌려주는 것이 아닌 먼저 만나는 return문 만을 실행하고 함수를 빠져나간다.


return의 또다른 쓰임새

 

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

예를 들어, '별명'을 입력으로 전달받아 출력하는 함수가 있다.

이 함수는 반환 값(결괏값)이 없다 ※ 함수의 반환 값은 오로지 return문에 의해서만 생성된다.

▶ '바보' 라는 입력값이 들어오지 않으면 계속 '나의 별명은 00(입력값) 입니다.' 를 출력하다,

'바보'가 입력되면 문자열을 출력하지 않고 함수를 빠져나간다.


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

 

아래와 같은 함수가 있다.

 

위 함수를 보면 매개변수가 name, old, man=True 세 가지이다.

man=True의 경우 매개변수에 미리 값을 넣어주었고, 이것이 함수의 매개변수 초기값을 설정하는 방법이다.

함수의 매개변수에 들어갈 값이 항상 변하는 것이 아닐 경우에는 초기값을 설정해두면 유용하다.

 

위에서 만든 say_myself 함수를 사용해보면,

입력값으로 2개를 주든, 3개 모두를 주든 동일한 결과를 출력한다.

그런데 초깃값이 설정된 부분을 False 로 바꾸면

man 변수에 False가 대입되어 '여자' 를 반환한다.

 

※ 만약 위 함수에서 초깃값이 

def say_myself(name, man=True, old) 로 순서가 바뀌어있는데, 

say_myself("김똥개", 32) 라는 값을 입력하면 파이썬에서 32라는 값을 man 변수와 old 변수 중 어느 곳에 대입해야 할 지 알 수 없게 되어 오류가 발생한다.

따라서, 초기화시키고 싶은 매개변수를 항상 뒤쪽에 놓아야 한다.


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

 

함수 안에서 사용할 변수의 이름을 함수 밖에서도 동일하게 사용할 수는 없다.

함수 안에서 사용하는 매개변수는 함수 밖의 변수 이름과는 전혀 상관이 없다.

▶ vartest 함수에서 매개변수 a의 값에 1을 더했으니 2가 출력될 것 같지만, def vartest(a)에서 입력값을 전달받는 매개변수 a는 함수 안에서만 사용하는 변수이기 때문에(함수 밖의 변수 a가 아님) 1을 출력한다.

 

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

1. return 사용하기

2. global 명령어 사용하기

global a 문장은 함수 안에서 함수 밖의 a 변수를 직접 사용하겠다는 뜻.

그러나, 함수는 독립적으로 존재하는 것이 좋기 때문에 되도록 사용하지 않는 것이 좋다.


lambda

 

lambda: 함수를 생성할 때 사용하는 예약어. (def 와 동일한 역할)

보통 함수를 한 줄로 간결하게 만들 때 사용한다.

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

 

lambda와 def 비교 코드

 

lambda를 사용한 코드와 def를 사용한 코드의 역할이 동일하다.


Q. 주어진 자연수가 홀수인지 짝수인지 판별해주는 함수 작성하기

Q-1. lambda를 사용하여 만들어보기

▶ if문에서 배운 조건부 표현식을 응용하면 된다.


Q. 입력으로 들어오는 모든 수의 평균 값을 계산해 주는 함수 작성하기

(입력으로 들어오는 수의 개수는 정해져 있지 않다.)


전체코드

04. def.ipynb
0.01MB

728x90
반응형