본문 바로가기
지식공학/Python

python 독학 기본편 #6 함수

by Eric87 2020. 10. 17.
반응형

이번에 배워볼 내용은 함수입니다 함수란 입력 값을 받아서 특정 연산을 거쳐 계산된 값을 출력 값으로 내보내는 기능을 하는 것을 말합니다.

python에서는 함수를 선언하기 위해서 def라는 것을 사용합니다 이전 조건문과 동일하게 사용하면 됩니다. 예제를 들어서 설명하겠습니다.

def account():
      print("새로운 계좌가 생성되었습니다.")

이렇게 하면 account라는 함수를 선언하겠다는 것이고 함수를 실행하면 print를 출력하겠다는 것이 됩니다. 이렇게 입력하고 실행을 하면 아무것도 출력되지 않습니다. 이것은 함수를 선언만 했지 호출하지 않았기 때문이죠.

accoun()

이걸 입력하고 실행하면 결과창에 "새로운 계좌가 생성되었습니다."가 출력된 것을 확인할 수 있습니다. 본격적으로 함수를 활용해보겠습니다. 은행계좌에 돈을 입금을 하면 입금금액과 계좌 잔액이 출력되는 것을 해보겠습니다. 계좌에 0원이 있고 1000원과 3000원을 입금하는 코드를 위래 입금 함수를 작성하면 다음과 같습니다.

def deposit(balance, money):
   print("기존 잔액은 {0}원입니다. {1}원이 입금되었습니다. 잔액은 {2}원입니다".format(balance,money,balance+money))
   return balance+money

여기서 return은 함수를 거치고 나온 값을 출력 값으로 인식하겠다는 의미입니다. 처음 계좌에 0원이 있고 금액이 추가되는 것입니다. 아래와 같이 실행하면 됩니다.

balance =0
balance = deposit(balance, 1000)
balance = deposit(balance, 3000)

그럼 금액이 누적되어 총 4000원이 되는 것을 확인할 수 있습니다. 이번에는 이어서 출금하는 것을 만들어 보겠습니다. 출금 함수를 선언해야 합니다. 하지만 출금 금액이 잔액보다 크면 출금을 할 수 없겠죠? 이번에 배운 조건문을 이용해서 만들어 보겠습니다.

def withdraw(balance, money):
     if balance >= money:
        print("기존잔액은 {0}원입니다. {1}원이 출금되었습니다. 잔액은 {2}원입니다".format(balance,money,balance-money))
        return balance-money
     else:
        print("출금을 할 수 없습니다. 잔액은 {0}원입니다".format(balance))
        return balance

if문을 활용하여 출금 금액이 잔액보다 크면 출금을 할 수 없고 작을 때만 출금을 할 수 있습니다. 각각 2000원과 500원 3000원을 순서대로 출금해보겠습니다.

balance = withdraw(balance, 2000)
balance = withdraw(balance, 500)
balance = withdraw(balance, 3000)

그럼 2000원과 500원은 출금이 완료되어 잔액이 1500원이 되지만 3000원은 잔액보다 크기 때문에 출금이 안 되는 것을 확인할 수 있습니다.

함수 안에서는 변수를 활용해서 선언을 할 수 있습니다. 만약에 함수를 이용해서 인적사항을 작성한다고 가정을 해보겠습니다. 인적사항에 이름과 나이 취미가 나열되어 있다고 한다면,

def profile(name, age, hobby):
     print("이름: {0}\t나이: {1}\t취미: {2}".format(name, age, hobby))
profile("다연",20,"독서")
profile("나나",20,"음악")

이렇게 쓸 수 있겠죠 하지만 모든 인적사항에 기록된 나이와 취미가 동일하다고 한다면 다음과 같이 변수를 고정시켜서 선언할 수도 있습니다.

def profile(name, age=20, hobby="노래"):
print("이름: {0}\t나이: {1}\t취미: {2}".format(name, age, hobby))
profile("다연")
profile("나나")

인적사항에 가족관계를 추가해 보겠습니다. family1, family2, family3, family4를 이용해서 가족 구성원 4명을 추가시킵니다. 

def profile(name, age, family1,family2,family3,family4):
     print("이름:{0}\t나이 :{1}\t".format(name, age), end=" ")
     print(family1,family2,family3,family4)

여기서 end=" "는 출력 문장을 띄어쓰기 다음으로 연결시키는 의미입니다. 보통은 줄이 바뀌면서 문장이 출력이 되는데 연결하여 출력할 때 사용하는 명령어입니다. 이렇게 하고 다연과 나나의 인적사항을 호출하여 출력해보겠습니다.

profile("다연",20,"아빠","엄마","오빠","동생")
profile("나나",20,"아빠","엄마","","")

가족 구성원 4명을 적어야 하는데 나나인 경우 아빠, 엄마뿐이라 나머지는 빈칸으로 남겨두었습니다. 코딩을 할 때 의미 없는 것을 남겨두면 나중에 헷갈릴 수 있기 때문에 가변 인자를 활용해서 작성할 수 있습니다.

def profile(name, age, *family):
     print("이름:{0}\t나이 :{1}\t".format(name, age), end=" ")
     for member in family:
          print(member, end=" ")
     print()

*과 for문을 활용해서 입력받는 수만큼 변수로 지정할 수 있습니다.

profile("다연",20, "아빠", "엄마", "오빠", "남동생", "여동생")
profile("나나",20, "아빠", "엄마")

마지막으로 지역 변수와 전역 변수에 대해 설명을 하겠습니다. 간략하게 말하면 함수 내에서만 활용할 수 있는 변수가 지역변수이고 전역 변수는 말 그대로 모든 함수에서 통일되게 사용되는 변수를 의미합니다. 만약에 A=10이고 x=3인 변수로 예를 들어보겠습니다.

A=10
def func(x):
     A = A - x
     print("[함수 내] 값 : {0}".format(A))
print("기존값 : {0}".format(A))
func(2)

출력 창에 기존 값 10은 출력이 되지만 error가 발생이 됩니다. 이는 같은 A가 선언이 되었더라도 함수 내에서는 변수를 다시 선정을 해주어야 하기때문에 함수 내 A를 인식할 수 없어 발생된 error입니다. 함수 내에 A=10이라는 명령을 추가하여 함수내에서 선언을 해주거나 global 명령을 사용하면 애러 없이 실행되는 것을 확인할 수 있습니다.

A=10
def func(x):
     global A # A = 10  
     A = A - x
     print("[함수 내] 값 : {0}".format(A))
print("기존값 : {0}".format(A))
func(2)

A=10
def func(x):
    A = 10
    A = A - x
    print("[함수 내] 값 : {0}".format(A))
print("기존값 : {0}".format(A))
func(2)
print("함수값 : {0}".format(A))

반응형

댓글