본문 바로가기
파이썬/주식 자동매매

Python 키움API 자동매매프로그램 개발-21.Python 기초편 함수(4)매개변수, 호출순서

by 행복론자 2021. 1. 31.

시리즈 이전글입니다.

2021/01/29 - [파이썬/주식 자동매매] - Python 키움API 자동매매프로그램 개발-20.Python 기초편 함수(3)유효범위

 

 

프로그래밍에서 함수의 사용은 가히 필수적이라고 할 수 있습니다.

지금까지 배운 것을 충분히 이해하셨다는 것만으로도 훌륭하고 본 프로젝트를 진행하는데는 지장이 없습니다. 하지만 알면 좋은 함수에 대한 몇가지 내용들을 설명 드리고자 합니다. 

 

먼저 매개변수에 관한 내용입니다.

함수에서 매개변수의 사용은 필수는 아니지만 선언은 해놓고 호출할 때 전달하지 않으면 에러가 발생했습니다.

아래 예시에서는 arg1, arg2까지 총 두 개의 매개변수를 만들었지만 arg2를 전달하지 않아 에러가 발생합니다.

def func1(arg1, arg2):
  print(arg1, arg2)

func1("매개변수1")

# TypeError: func1() missing 1 required positional argument: 'arg2'

 

 

이렇게 사용자 실수로 혹은 전달할 값이 없을 때도 있어서 매개변수를 선언해놓고 전달하지 않는 경우에 필요한 것이 매개변수 기본값 설정입니다. 

매개변수 기본값 설정이란 함수를 선언할 때 매개변수가 전달되지 않으면 사용할 값을 미리 정해 놓는 것입니다. 예를 들면 이렇습니다 

def func1(arg1, arg2="Default"):
  print(arg1, arg2)

func1("매개변수1")
# 매개변수1 Default가 출력 

 

 

함수를 선언할 때 arg2=”Default”라고 정의하면 arg2 값이 전달되지 않았을 때 미리 정의한 값을 사용합니다. 물론 이값은 전달되지 않을 때만 사용되고 값을 전달하면 전달된 값이 사용됩니다.

def func1(arg1, arg2="Default"):
  print(arg1, arg2)

func1("매개변수1", "매개변수2")
# 매개변수1 매개변수2가 출력 

 

 

매개변수 기본설정값을 정의할 때 주의할 점은 뒤에서부터 등장하는 매개변수 순서로 설정해야한다는 것입니다.

위의 예를 보면 arg2는 기본값을 설정할 수 있지만 arg2를 제외하고 arg1을 기본값 설정할 수는 없습니다. 

def func1(arg1="Default", arg2):
  print(arg1, arg2)

func1("매개변수2")

# SyntaxError: non-default argument follows default argument

 

따라서 아래처럼 매개변수1,2,3을 사용하는 함수에서 기본값을 설정할 매개변수는 

매개변수3, 2, 1 순서로 설정할 수 있습니다.

def 함수이름(매개변수1, 매개변수2, 매개변수3):
  함수 안에 로직

 

 

만약 매개변수3부터 기본값 설정하지 않고 매개변수2나 1부터 설정하려고 하면 에러가 발생합니다. 

def 함수이름(매개변수1, 매개변수2="기본2", 매개변수3):
  함수 안에 로직

# SyntaxError: non-default argument follows default argument

 

 

 

def 함수이름(매개변수1="기본1", 매개변수2, 매개변수3):
  함수 안에 로직

# SyntaxError: non-default argument follows default argument

 

 

그러므로 매개변수1까지 기본값을 설정하고 싶다면 매개변수 3, 2, 1을 모두 설정해야 합니다.

def 함수이름(매개변수1="기본1", 매개변수2="기본2", 매개변수3="기본3"):
  함수 안에 로직

# SyntaxError: non-default argument follows default argument

 

 

다음은 매개변수의 지정사용입니다. 

지금까지는 매개변수를 선언한 순서대로 사용해야 했습니다. 무슨 말이냐면 다음처럼 func1 함수에서 arg1, arg2라는 매개변수를 선언하면 

함수를 호출하는데 사용한 매개변수1, 매개변수2가 순서대로 함수의 arg1과 arg2에 전달되어 매개변수1, 매개변수2 순서대로 출력했습니다. 

def func1(arg1, arg2):
  print(arg1, arg2)

func1("매개변수1", "매개변수2")

 

 

전달할 매개변수를 다음처럼 지정한다면 함수를 호출할 때 매개변수 전달 순서는 고려하지 않아도 됩니다.

def func1(arg1, arg2):
  print(arg1, arg2)

func1(arg2="매개변수2", arg1="매개변수1")

 

 

하지만 함수를 선언할 때 사용한 매개변수명 arg1, arg2를 그대로 사용해줘야 합니다.

func1(arg2="매개변수2", arg1="매개변수1")

 

 

다음은 여러값을 return하는 방법입니다.

return 키워드를 이용해 함수내의 결과를 외부로 전달할 수 있었습니다. 

아래 코드는 param1과 param2의 값을 더해 반환했기에 result에는 숫자 4가 저장됩니다. 

def add(param1, param2):
  return param1 + param2
 
result = add(1, 3)

 

 

하지만 return이 꼭 하나의 값만 반환할 수 있는 것은 아닙니다. 

return A처럼 하나의 값을 반환하는게 아니라 return A, B처럼 할 경우 

result에는 A,B 값이 튜플로써 저장됩니다. 

def add_and_divide(param1, param2):
  return param1 + param2, param1 / param2

result = add_and_divide(1, 3)
print(result)

 

 

print(result)의 결과는 (4, 0.333)이며 두 개의 값을 가지고 있으므로 두 개의 변수를 사용해 언패킹할 수 있습니다. 

def add_and_divide(param1, param2):
  return param1 + param2, param1 / param2


result = add_and_divide(1, 3)
A, B = result
print(A, B)

 

 

물론 add_and_divide의 결과 자체가 튜플이니 바로 언패킹할 수도 있습니다.

def add_and_divide(param1, param2):
  return param1 + param2, param1 / param2

A, B  = add_and_divide(1, 3)
print(A, B)

 

 

마지막으로 함수의 호출 순서에 대해 알아보겠습니다.

당연한 이야기지만 아직 익숙하지 않으실 수 있는 점은 함수 안에서 또 다른 함수를 사용할 수 있다는 것입니다. 다음과 같은 예를 들어보겠습니다.

def greeting():
  print("greeting starts")
  print("greeting ends")


def say_hello():
  print("say_hello starts")
  greeting()
  print("say_hello ends")

say_hello()

 

 

greeting라는 함수를 만들고 say_hello 함수 안에서 호출하도록 한 코드를 실행해보겠습니다.

say_hello starts
greeting starts
greeting ends
say_hello ends

 

 

say_hello를 실행하자마자 say_hello starts가 출력되고 이후 greeting 함수가 호출됩니다.

greeting 함수를 호출한 결과인 greeting starts, greeting ends가 나온 다음에야 

say_hello ends가 나옵니다. 

여기서 알 수 있는 사실은 함수A 안에서의 또 다른 함수B를 호출하면 함수B가 종료되고 나서야 함수A이 종료될 수 있다는 것입니다.

 

간단히 그림으로 살펴보면

프로그램을 실행시키면 메모리에 say_hello()가 올라가고 이 함수가 동작합니다. 



say_hello가 실행되며 greeing 함수를 호출하기에 다음과 같은 구조가 됩니다. 



여기서 greeting 함수의 종료 없이 say_hello가 먼저 종료될 수가 없습니다. 

따라서 다음처럼 greeting 함수가 종료된 다음에야 say_hello가 종료될 수 있습니다. 



메모리까지 이야기하며 내용이 조금 복잡했다고 느끼실 수 있을 것 같아 한마디로 다시 요약하면,

함수A에서 다른 함수B를 호출하면 호출 후 함수A가 바로 종료되는 것이 아니라 함수B가 정상적으로 끝나야 함수A가 비로소 종료될 수 있습니다. 

 

만약 함수B에서 또 다른 함수C를 호출한다면 함수C가 먼저 종료된 다음에야 순서대로 함수B, 함수A가 종료될 수 있다는 것을 기억 하시기 바랍니다.

 

 


같이 보시면 좋을 글

2021/02/10 - [파이썬/주식 자동매매] - 주식매매프로그램 개발 노하우, 소스를 담은 전자책이 발간되었습니다.

 

주식매매프로그램 개발 노하우, 소스를 담은 전자책이 발간되었습니다.

주식매매프로그램 개발 노하우에 관한 제 전자책이 발간되었습니다. https://kmong.com/gig/292764 주식매매프로그램, 쉽게 따라 만드는 노하우와 소스를 드립니다. | 36000원부터 시작 가능한 총 평 0개

jsp-dev.tistory.com

 

2021/01/31 - [파이썬/주식 자동매매] - Python 키움API 자동매매프로그램 개발-22.Python 기초편 클래스(1) 들여쓰기, 인스턴스화

 

반응형
이 포스팅은 쿠팡파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

댓글