• 회원가입
  • 로그인
  • 구글아이디로 로그인

[basic] Python - Function (함수)

1710  

목차

  1. 함수 정의 (= 생성)
  2. 함수 호출
  3. 독립변수 (= 인수)
  4. 매개변수・독립변수
  5. 독립변수 개수
  6. 임의의 독립변수 - *args
  7. 키워드 독립변수 key = value
  8. 임의의 키워드 독립변수 - **kwargs
  9. 매개변수 기본값
  10. List를 독립변수로 전달
  11. 반환값
  12. pass 구문
  13. 함수 재귀
  14. 내장함수 vs 사용자정의함수
  15. 변수에 함수 넣어 호출

 

※ 함수 (function) 의미 :

  • 함수는 호출할 때만 실행되는 코드 블록임.
  • '매개변수'라는 데이터를 함수에 전달 가능.
  • 함수는 실행 결과를 데이터로 반환 가능.

 

함수 정의 (= 생성)

 

1.

Python에서 함수는 def 키워드 사용해 정의.

cf. PHP 경우엔, function 키워드 사용.

 

2.

함수 몸통 부분 (= 실행 코드 블럭)은 들여씀.

 


[예제]

 

def hz():

  print("홈짱닷컴 Homzzang.com")

 

 

함수 호출

함수명 뒤에 소괄호인 () 붙임.

 

def hz():

  print("홈짱닷컴 Homzzang.com")

hz()

 

 

독립변수 (= 인수)

 

1. 독립변수는 함수 호출 시 함수에 전달하는 데이터.

2. 독립변수는 쉼표로 구분해 원하는 만큼 추가 가능.

3. 구문 : function_name("arg1", "arg2", .....) 

 


[예제] - 독립변수가 1개인 경우.

 

def hz(code):

  print(code + " 공부.")

hz("HTML")

hz("CSS")

hz("JS")

 

결과값:

HTML 공부.

CSS 공부.

JS 공부.

※ 파이썬 경우, arguments (= 독립변수)를 짧게 args라 표현.

 

매개변수・독립변수

[매개변수 (Parameters)]

 

함수를 정의할 때 독립변수 (= 인수)가 들어올 자리를 미리 정의한 것.

(예) def hz(a, b, c):

 


[독립변수 = 인수 (arguments)]

 

함수를 실행할 때 함수이 매개변수 자리로 전달하는 데이터.

(예) hz(A, B, C)  

 

 

독립변수 개수

1. 매개변수 개수와 동일한 개수의 독립변수 전달해야 에러 발생 X

 

def hz(site, host):

  print(site + " " + host)

hz("홈짱닷컴", "Homzzang.com")

 

결과값: 홈짱닷컴 Homzzang.com


2. 매개변수 개수보다 적거나 많은 수의 독립변수 전달 시 에러 발생.

 

2-1. 

매개변수 개수보다 더 적은 수의 독립변수 전달.

def hz(site, host):

  print(site + " " + host)

hz("홈짱닷컴")# 에러 유발.

결과값:
TypeError: hz() missing 1 required positional argument: 'host'


2-2. 

매개변수 개수보다 더 많은  수의 독립변수 전달.

def hz(site, host):

  print(site + " " + host)

hz("홈짱닷컴", "Homzzang.com", "코딩 강의") # 에러 유발.

결과값:

TypeError: hz() takes 2 positional arguments but 3 were given

 

 

임의의 독립변수 - *args

함수에 전달될 독립변수 개수 모르는  경우, 

함수 정의할 때 매개변수 이름 앞에 * 추가.

그 결과, 함수가 독립변수 tuple 받아 각 item에 접근 가능.

 

def hz(*code):

  print("지금 배우고 있는 언어: " + code[3])

hz("HTML", "CSS", "JS", "Python")

 

결과값: 지금 배우고 있는 언어: Python

※ Python은 '임의의 독립변수'를 주로 *args로 표현.

 

키워드 독립변수 key = value

독립변수를 key = value 짝으로 보내면, 독립변수 순서 안 중요.

 

def hz(code3, code2, code1):

  print("가장 기초 언어: " + code1)

hz(code1 = "HTML", code2 = "CSS", code3 = "JS")

 

결과값: 가장 기초 언어: HTML

※ Python은 '키워드 독립변수'를 주로 kwargs로 표현.

 

임의의 키워드 독립변수 - **kwargs

함수에 전달될 키워드 독립변수 개수 모르는  경우, 

함수 정의할 때 매개변수 이름 앞에 ** 추가.

그 결과, 함수가 키워드 독립변수 tuple 받아 각 item에 접근 가능.

 

def hz(**info):

  print("Welcome to " + info["host"])

hz(site = "홈짱닷컴", host = "Homzzang.com")


결과값: Welcome to Homzzang.com

 

매개변수 기본값

독립변수 없이 함수 호출 시, 매개변수 기본값을 사용.

구문: def function_name(parameter = value, ...):

 

def hz(code = "Python"):

  print(code + " 공부")

hz("HTML")

hz("CSS")

hz()

hz("JS")

 

결과값:

HTML 공부

CSS 공부

Python 공부

JS 공부

 

List를 독립변수로 전달

string, number, list, dict 등 어떤 유형의 데이터든 독립변수 가능하며, 함수 안에서 동일 데이터 타입으로 처리됨.

 


[예제1]

 

def hz(code):

  for x in code:

    print(x)

langs = ["HTML", "CSS", "JS"]

hz(langs)


결과값:

HTML

CSS

JS


[예제2] 사용자 입력값으로 List 생성 후, 시험 성적 출력. ★★★

 

def hz(myList) :

   Sum = sum(myList)

   Avg = Sum / len(myList)

   Max = max(myList)

   Min = min(myList)

   return Sum, Avg, Max, Min


li = []

for i in range(3):

    n = int(input("숫자 3개 입력:"))

    li.append(n)


Sum, Avg, Max, Min = hz(li)


print('Sum: ',  Sum)

print('Avg: ',   Avg)

print('Max: ',  Max)

print('Min: ',   Min)

 

PS. 

주의: 변수명과 함수명이 동일 시, 에러 발생.


 

반환값

 

1.

함수가 특정 값을 반환케 하려면, return 구문 이용.

※ 반환값 출력시키려면, 호출 시 print() 함수 필요.

 

2.

여러 값 한번에 반환 후, 각 값을 각각의 변수에 담기 가능.

(예제2)

 


[예제1] 값 반환.

 

def hz(x):

  return 5 * x

print(hz(3)) # 15

print(hz(4)) # 20

 


[예제2] 여러 개 반환 후, 각각의 변수 생성.

 

def hz(myList) :

   Sum = sum(myList)

   Avg = Sum / len(myList)

   Max = max(myList)

   Min = min(myList)

   return Sum, Avg, Max, Min


li = []

for i in range(3):

    n = int(input("숫자 3개 입력:"))

    li.append(n)

print (li)


Sum, Avg, Max, Min = hz(li)


print('Sum: ',  Sum)

print('Avg: ',   Avg)

print('Max: ',  Max)

print('Min: ',   Min)

 


cf. 직접 출력 방식의 함수.

 

def calc(a, b, op):

    if op == '+':

        print('{} + {} = {}'.format(a,b,a+b))

    elif op == '-':

        print('{} - {} = {}'.format(a,b,a-b))

    elif op == '*':

        print('{} * {} = {}'.format(a,b,a*b))

    elif op == '/':

        print('{} / {} = {}'.format(a,b,a/b))

    else:

        print('잘못 입력.')

              

n1, oper, n2  = input('(예)1 + 2:').split()

n1 = int(n1)

n2 = int(n2)

              

calc(n1,n2,oper)

 

 

pass 구문

함수 정의 시 비워두면 에러 발생함. 

단,  pass 구문 추가 시 에러 발생 X.

 

def hz():

   pass


 

함수 재귀

1. 

함수 재귀: 함수 내용 안에 함수 자신이 호출된 경우 말함.

※ 결과에 도달 위해 데이터 반복 처리가능하단 장점 있음.

※ 잘 사용하면 매우 효율적이고 수학적으로 멋질 수 있음.

 

2.

함수 재귀 사용 시, 아래 유형의 함수 정의는 피해야 함.

(1) 절대 종료되지 않는 함수.

(2) 과도한 메모리・프로세스 사용하는 함수.

 

3.

함수 재귀는 작동 방식이 난해해, 테스트 하며 수정 필요.

※ 맨 아래, 예제 작동 방식 설명 참고.

 

4.

아래 예제는 함수 재귀 시 1 적은 수를 독립변수 사용하며,

k가 0인 경우 함수 재귀 종료되며, 0을 반환 후 재귀 종료.

 


[예제1] 독립변수 1 전달 시

 

def hz(k):

  if(k > 0):

    result = k + hz(k - 1)

    print(result)

  else:

    result = 0

  return result

#print("\n\n함수 재귀 결과 예제")

hz(1)

 

반환값: 1


[예제2] 독립변수 2 전달 시

 

def hz(k):

  if(k > 0):

    result = k + hz(k - 1)

    print(result)

  else:

    result = 0

  return result

#print("\n\n함수 재귀 결과 예제")

hz(2)

 

결과값:

1

3


[예제3] 독립변수 3 전달 시

 

def hz(k):

  if(k > 0):

    result = k + hz(k - 1)

    print(result)

  else:

    result = 0

  return result

#print("\n\n함수 재귀 결과 예제")

hz(3)

 

결과값:

1

3

ps. 예제3 경우, 아래 순서로 작동.

3을 넣었더니 함수 재귀 부분에서 2먼저 넣어 결과값 받아오래.

2를 넣었더니 함수 재귀 부분에서 1먼저 넣어 결과값 받아오래.

1을 넣었더니 1 + 0 해서 결과값이 1이래.

2를 넣은 곳에서 2 + 1 해서 결과값이 3이래.

3을 넣은 곳에서 3 + 3 해서 결과값이 6이래.

 

내장함수 vs 사용자정의함수

 

※ 주의: 함수명 작성 시 내장함수 이름과 안 겹치게 작성. 

 


1.  내장함수 확인 명령어.

 

dir(__builtins__)

 

[Python 3.9 (201023 기준) 내장함수]
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '_', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']

 


2. 내장함수 이름과 동일 시, 사용자함수가 우선.

(예제)

 

# 내장함수 sum() 호출.

hz = [1,2,3,4,5]

print(sum(hz)) # 15


# 사용자정의함수 sum() 생성 및 호출.

def sum(x,y): print(x + y)

sum(3,4) # 7


# 에러 발생 (∵ 사용자 정의 우선)

print(sum(hz))


"""

# 위 에러 유발 코드를 주석처리 후 진행.

"""


# 현재, 메모리에 로드된 (함수・변수) 확인.

print(dir())


# 메모리에 로드된 사용자정의 sum() 함수 삭제

del sum


# 이젠, 내장함수 sum() 정상 작동.

print(sum(hz)) # 15

 

PS. 

Python Shell에서 '함수명(' 입력하면 내장함수 기본 구문 확인 가능.

(예) print(

 

변수에 함수 넣어 호출

변수에 함수 할당 시, 변수 이용해 함수 호출 가능.

즉, 변수와 함수가 가리키는 메모리 위치는 동일함.

 

def hz() : print('Homzzang.com')

hz() # Homzzang.com

my = hz

my() #Homzzang.com

id(hz)  # 2063774847184

id(my) # 2063774847184




분류 제목
basic Python - Lambda (람다함수) - 작은 1회용 익명함수
basic Python - Array (배열)
basic Python - Class/Object (클래스/객체) ※ __init__() 함수
basic Python - Inheritance (상속)
basic Python - Iterator (반복자)
basic Python - Scope (범위)
basic Python - Module (모듈)
basic Python - Datetime (날짜시간) 표시
basic Python - JSON (제이슨)
basic Python - RegEx (정규식) - 정규표현식
basic Python - PIP (피프) - 패키지(모듈) 관리자
basic Python - Try...Except - 에러 테스트/제어. (= 트라이...익세프트)
basic Python - User Input (사용자 입력)
basic Python - String Format (문자열 포맷)
basic Python - Math (수학)
2/2
목록
찾아주셔서 감사합니다. Since 2012