함수 : 특정 용도의 코드(명령어)를 모아 놓은 것
정의형식)
def 함수명(매개변수목록):
실행문장....
사용형식)
함수명(값목록)
코드의 용도를 구분할 수 있다.
코드를 재사용할 수 있다.
실수를 줄일 수 있다.
호이스팅(hoisting)
선언 전에 사용 가능한 기법
파이썬 함수는 호이스팅이 불가!
함수 정의 먼저 후 호출하기
자바스크립트는 함수 표현식
콘솔에서 에러난 경우 삭제 후 다시 실행!
def hello():
print("hello world!")
def hi():
print("Welcome")
if input('sel : ') == '1':
hello()
else:
hi()
# 단수(d)를 입력 받아서 해당 단을 출력
def gugudan(d):
for i in range(1, 10):
#print('{} X {} = {:2}'.format(d, i, d*i))
print(f'{d} X {i} = {d*i:2d}')
dan = int(input('단을 입력하세요 : '))
gugudan(dan)
반환(return)문
def 함수명(매개변수):
수행문장....
return 값
결과변수 = 함수명(값)
def cal(a, b, op):
c = 0
# if op == '+':
# c = a + b
# elif op == '-':
# c = a - b
# elif op == '*':
# c = a * b
# elif op == '/':
# c = a / b
# return c
match op:
case '+':
c = a + b
case '-':
c = a - b
case '*':
c = a * b
case '/':
c = a / b
case _:
print('연산 기호를 잘못 입력했습니다.')
c = 0
return c
x, oper, y = input('계산식 입력 : ').split()
x = int(x)
y = int(y)
res = cal(x, y, oper)
print('계산 결과 : ', res)
지역변수와 전역변수
함수 내부에 선언된 변수 : 지역변수
함수 외부에 선언된 변수 : 전역변수
함수 내부에서 전역변수 선언 : global 변수명
함수는 무조건 스택구조(stack)
a, b, c -> c, b, a
함수 내부에 실행되는 시점에는 존재하다가 실행 후에는 사라짐
매번 함수가 호출되면 다시 만들어짐(지역변수)
전역변수는 프로그램이 종료될 때까지 유지됨
전역변수는 가급적 많이 쓰지 않기! 오류 시 수정하기가 어려움(추적이 어려움)
a = 100 # 전역변수
def func1():
a = 10 # 지역변수
print(f'함수안 : {a}')
func1() # 10, 지역변수
print(f'함수밖 : {a}') # 100, 전역변수
a = 100
def func1():
global a # 100
a = 10
print(f'함수안 : {a}')
func1() # 10
print(f'함수밖 : {a}') # 10
a = 100 # 전역변수
def func1():
print(f'함수안 : {a}') # 100
func1() # 100
print(f'함수밖 : {a}') # 100
def func1():
global a # 함수 내부에서 전역변수선언
a = 10
print(f'함수안 : {a}') # 10
func1() # 10
print(f'함수밖 : {a}') #10
패킹, 언패킹
시퀀스 유형에 데이터를 넣는 작업 : 패킹(packing)
시퀀스 유형에서 각 데이터를 꺼내어 각각의 변수에 분배하는 작업 : 언패킹(unpacking)
값을 묶어서 작업
변수의 언패킹
x, y, z = 1, 2, 3
함수에서 언패킹 사용하기
def 함수명(a, b, c):
.....
list = [1, 2, 3]
함수명 (*list) # 언패킹 각 변수에 리스트를 변수를 하나씩 넣어줌
주의) 매개변수의 개수와 시퀀스 원소의 개수가 동일해야 한다. 개수가 맞지 않으면 오류 발생
가변인수 함수 : 매개변수의 개수가 정해지지 않은 함수
def 함수명(*매개변수명):
for 변수 in 매개변수명:
.....
scores = list(map(int, input('점수입력 : ').split()))
#print(scores)
def sum_scores(*ss): # 매개변수가 얼마가 들어올지 모를 때, 가변인자
sum = 0
for s in ss:
sum += s
return sum
sum_res = sum_scores(*scores)
print(f'총점 : {sum_res}')
다수의 return 활용
파이썬에서는 결과값을 여러 개 반환할 수 있음.
형식)
return a, b, c
x, y, z = 함수()
def cal(a, b):
r1 = a + b
r2 = a - b
r3 = a * b
r4 = a / b
return r1, r2, r3, r4
l, m, n, o = cal(2, 8)
print(f'더하기 : {l}, 빼기 : {m}, 곱하기 : {n}, 나누기 : {o}')
키워드 인수
함수 호출 시 매개변수의 혼동으로 인한 오류를 막기 위해 제공되는 방식
def func(int1, str, int2):
.....
func(1, 2, '+') - 오류발생
func(int1=1, int2=2, str='+')
기존활용 예) print(a, b, c, sep=",", end="")
sep와 end가 키워드 인수 방식을 활용한 예
딕셔너리 언패킹
def func(a, b, c):
.....
dic = {'a':str, 'b':100, 'c':200}
func(**dic_value)
딕셔너리 키(key)는 반드시 문자열이어야 한다
func(*dic_value)처럼 '*'를 하나만 작성하면 key에 해당하는 값이 각 변수에 언패킹 된다.
# 키워드 인수 방식
def person_info(name, age, addr):
print(f'이름 : {name}')
print(f'나이 : {age-1}')
print(f'주소 : {addr} ')
person_info(name="홍길동", addr="인천시", age=21)
print()
person_dic = {'name':'전우치', 'age':25, 'addr':'서울시'}
person_info(**person_dic)
# person_info(*person_dic) age 문자열 오류
print()
def per_info(**kwargs): # keyword arguments의 약자
for kw, arg in kwargs.items(): # 딕셔너리 키와 값 쌍을 하나씩 가져옴
if kw == 'age':
arg -= 1
print(f'{kw}:{arg}')
print()
dic1 = {'name':'윤아름',
'age': 32,
'addr':'경기도',
'phone':'010-4513-7842'}
per_info(**person_dic)
per_info(**dic1)
ValueError: Unknown format code 'd' for object of type 'str'
ValueError: invalid literal for int() with base 10: '&'
SyntaxError: 'return' outside function
NameError: name 'a' is not defined
TypeError: 'builtin_function_or_method' object is not iterable
TypeError: cal() missing 2 required positional arguments: 'a' and 'b'
TypeError: int() argument must be a string, a bytes-like object or a real number, not 'list'
TypeError: cannot unpack non-iterable builtin_function_or_method object
TypeError: unsupported operand type(s) for -: 'str' and 'int'
ValueError: invalid literal for int() with base 10: '숫자 입력 : '
연습문제) 몫과 나머지를 구하는 함수를 작성하시오.
def d(a, b):
res1 = a // b
res2 = a % b
return res1, res2
num1, num2 = input('숫자 입력 : ').split()
num1 = int(num1)
num2 = int(num2)
res1, res2 = d(num1, num2)
print('나머지와 몫 구하기')
print(f'몫 : {res1}, 나머지 : {res2}')
'공부기록 > Python' 카테고리의 다른 글
6월 13일 python - 클래스 (0) | 2023.06.13 |
---|---|
6월 12일 (2) python - 모듈 (0) | 2023.06.12 |
6월 9일 (2) python - 제어문2 (0) | 2023.06.09 |
6월 9일 (1) python - 데이터 유형2, 연산자, 제어문 (0) | 2023.06.09 |
6월 8일 (2) python - 데이터 유형 (0) | 2023.06.08 |