목차
함수 정의 (= 생성)
함수 호출
독립변수 (= 인수)
매개변수・독립변수
독립변수 개수
임의의 독립변수 - *args
키워드 독립변수 key = value
임의의 키워드 독립변수 - **kwargs
매개변수 기본값
List를 독립변수로 전달
반환값
pass 구문
함수 재귀
내장함수 vs 사용자정의함수
변수에 함수 넣어 호출
※ 함수 (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
6
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
주소 복사
랜덤 이동
최신댓글