목차
- 함수 정의 (= 생성)
- 함수 호출
- 독립변수 (= 인수)
- 매개변수・독립변수
- 독립변수 개수
- 임의의 독립변수 - *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
최신댓글