파이썬(Python) Function

BG·2021년 5월 19일
0

파이썬(Python)

목록 보기
6/7
post-thumbnail

1. 함수란?


반복되는 기능이 있을 경우, 매번 똑같은 코드를 반복해서 작성을 한다면 상당히 비효율적인 코딩이 된다.
그런 반복적인 기능을 따로 분리하여 단독 작성 되어진 것이 함수이다.

1-1. 함수의 구성요소


아래의 사진은 함수의 구성요소를 개략적으로 나타냈었다.
함수는 함수의 시작을 알리는 def키워드를 시작으로 하여, 함수명, 파라미터가 있을 경우 파라미터, 함수내용, return으로 구성이 된다.
여기서 파라미터 부분과 return은 필수 요소는 아니다.

C언어에서 함수의 시작과 끝부분은 {, }를 쳐서 함수의 시작과 종료를 알렸다면 파이썬 좀 다르다.

파이썬은 : 콜론으로 시작하지만 끝 부분은 어딜까?

파이썬은 동일한 인덴트 영역안에 있게 되면 함수가 계속 된다고 보고 그 인덴트 영역을 벗어나게 되면 함수를 종료한 걸로 간주한다.
또는 return이 존재 하는 경우, 함수를 종료한다.

1-2. 함수의 호출


1-1에서 작성된 fn_plus함수는 호출부에서 넘겨 받은 argument를 합산하여 다시 호출부로 넘겨주는 기능을 가지는 함수이다.

함수의 호출은 아래와 같이 한다.

ret = fn_plus(1,2)
print(ret)

위 코드의 결과값은 3이된다.

함수를 호출할 경우 함수의 parameter 개수에 맞게 argument를 넘겨줘야 오류없이 사용할 수 있다.

2. 함수의 Default Value


함수의 파라미터에는 default 값을 설정할 수 있다.
디폴트 값을 설정하게 되면 아규먼트를 넘겨주지 않았을 경우, 디폴트로 설정된 값으로 파라미터를 사용하게 된다.

2-1. Default Value 사용법

[아규먼트로 param3을 넘기지 않았을 경우]
def fn_test(param1, param2, param3="하세요"):
	return param1 + param2 + param3

print(fn_test("test1", "test2"))

결과 : test1test2하세요
[아규먼트로 param3를 넘겼을 경우]
def fn_test(param1, param2, param3="하세요"):
	return param1 + param2 + param3

print(fn_test("test1", "test2", "test3"))

결과 : test1test2test3

3. Keyword Arguments


1-2에서 함수의 파라미터가 2개면 함수의 호출부에서도 2개의 파라미터를 넘겨줘야 한다고 배웠지만, 파이썬에서는 Keyword Arguments라는 것이 있다.

3-1. Keyword Arguments란?


함수를 호출할때는 함수의 파라미터에 순서에 맞추어 호출부에서 아규먼트를 넘겨 주어야 하지만 Keyword Arguments를 사용하면 순서에 상관없이 아규먼트를 넘겨 줄수 있다.

3-2. Keyword Arguments 사용법


아래와 같이 아규먼트를 넘겨주게 되면 파라미터 순서 상관없이 함수를 호출할수 있다는 장점이 있으며, 가독성이 좋아진다는 장점도 있다.

def fn_kwargs(param1, param2):
	return param1 + param2

print(fn_kwargs(param2 = "파라미터2", param1 = "파라미터1"))

결과 : 파라미터1파라미터2

3-3. Keyword Arguments + Positional Arguments


Keyword Arguments와 Positional Arguments를 섞어서도 사용가능 하다.

[Positional Arguments란?]
Keyword Arguments의 반대 개념으로 기존의 사용방법대로(순서대로) 아규먼트를 넘겨주라는 뜻

[Keyword Arguments + Positional Arguments]
def fn_kwargs(param1, param2, param3):
	return param1 + param2 + param3

print(fn_kwargs("파라미터1", param3 = "파라미터3", param2 = "파라미터2"))

결과 : 파라미터1파라미터2파라미터3

아래와 같은 경우에는 오류를 뱉어내니 주의하자.
Keyword Arguments와 Positional Arguments를 섞어서 사용할 경우에는 반드시 Keyword Arguments를 Positional Arguments보다 뒤에다가 작성해야 한다.

[Keyword Arguments + Positional Arguments 오류]
def fn_kwargs(param1, param2, param3):
	return param1 + param2 + param3

print(fn_kwargs(param1 = "파라미터1", param2 = "파라미터2", "param3"))

오류 : SyntaxError: positional argument follows keyword argument

4. Keyworded variable length of arguments


파이썬에서는 가변인자(Variable Length Positional Arguments)라는 것이 있다.
앞서 전통적 방식인 Positional Arguments와 조금 진화된 Keyword Arguments가 있다는 것을 소개했다.
하지만 Variable Length Positional Arguments는 아규먼트의 개수에 상관없이 함수에 넘겨 주어 자유롭게 사용할 수 있다.

4-1. Keyworded variable length of arguments 사용법


fn_kwargs함수의 kwargs파라미터는 아래 결과값을 보면 딕셔너리라는 것을 알 수 있다.
딕셔너리에 값을 넣는 다는 생각으로 아규먼트를 넘겨주면 되며,
넘겨받은 후에는 딕셔너리 사용법과 같다.
그리고 파라미터인 kwargs는 ** 아스트릭트 2개를 붙여주어야 한다.

  • ** 아스트릭트 2개를 붙여주자.
  • 넘겨받은 후에는 딕셔너리처럼 사용하자.
def fn_kwargs(**kwargs):
  print(kwargs)
  print(kwargs["test1"])
  for k,v in kwargs.items():
    print(f"key : {k}, value : {v}")

print(fn_kwargs(test1="테스트1", test2 = "테스트2", test3 = "테스트3"))

결과 
{'test1': '테스트1', 'test2': '테스트2', 'test3': '테스트3'}
테스트1
key : test1, value : 테스트1
key : test2, value : 테스트2
key : test3, value : 테스트3

5. Non-keyworded variable length of arguments


4번에서 소개했던 Keyworded variable length of arguments와 사용법은 동일 하지만 keyword방식이 아닌, 순서대로 값을 전달하는 방식도 있다.

5-1. Non-keyworded variable length of arguments 사용법


사용법은 아래와 같으며 결과값에서도 볼수 있듯이
args는 튜플로 구성되어 있으며, 호출부에서 넘겨받은 아규먼트를 튜플을 사용하듯이 사용하면 된다.
그리고 args앞에 * 아스트릭트 하나를 붙여서 사용한다.

  • * 아스트릭스 하나를 붙여주자.
  • 넘겨받은 후에는 튜플처럼 사용하자.
def fn_args(*args):
  print(args)
  for i in args:
    print(i)

print(fn_args(1,2,3,4))

결과
(1, 2, 3, 4)
1
2
3
4

6. Mixing args and kwargs


Keyworded variable length of arguments와 Non-keyworded variable length of arguments를 섞어서 사용하게 되면 형태와 개수에 상관없이 사용가능한 함수가 된다.

6-1. Mixing args and kwargs 사용법


def fn_mix(*args, **kwargs):
  print(args)
  print(kwargs)

#print1
print(fn_mix(1, 2, 3, test1="테스트2", cnt=37))

#print2
print(fn_mix(1, 2, 3, 4, 5, "hello", {"주소" : "서울", "국가" : "한국"}))

#print3
print(fn_mix(name="정우성", gender="남", height="187"))

#print4
print(fn_mix(37))

#print5
print(fn_mix())

결과
#print1
(1, 2, 3)
{'test1': '테스트2', 'cnt': 37}

#print2
(1, 2, 3, 4, 5, 'hello', {'주소': '서울', '국가': '한국'})
{}

#print3
()
{'name': '정우성', 'gender': '남', 'height': '187'}

#print4
(37,)
{}

#print5
()
{}
profile
글쎄...?

0개의 댓글