12. 사용자 정의 함수
1. 사용자 정의 함수
사용자 정의 함수란 사용자가 특정 작업을 수행하기 위해 직접 작성한 함수를 의미합니다. 파이썬에는 많은 내장 함수들이 있지만, 때로는 우리의 요구사항에 맞게 동작하는 함수를 직접 만들어야 할 때가 있습니다. 이때 사용자 정의 함수를 작성하게 됩니다. 기본적인 구조는 아래와 같습니다.
def 함수명(매개변수1, 매개변수2, ...):
# 함수 내용
return 결과값
2. 매개변수와 반환 값이 없는 함수
def func1(): #함수만 불러주면 알아서 호출
print('처음으로 만드는 함수')
func1() #메모리를 차지하고 있고 호출하면 불러올 수 있다.
처음으로 만드는 함수
for i in range(5):
func1()
처음으로 만드는 함수
처음으로 만드는 함수
처음으로 만드는 함수
처음으로 만드는 함수
처음으로 만드는 함수
3. 매개변수가 있고 반환 값이 없는 함수
def func2(num):
print(f'입력받은 숫자 {num}')
func2(10)
func2(5)
입력받은 숫자 10
입력받은 숫자 5
def func3(start, end):
sum = 0
for i in range(start, end + 1):
sum = sum + i
print(f'{start}부터 {end}까지의 합 : {sum}')
func3(1, 100)
1부터 100까지의 합 : 5050
4. 반환 값이 있는 함수
def func4():
print('안녕') # return이 없기때문에 아무 값도 줄 수없어 변수에 아무것도 담기지 않음.
>> 출력 값 없음
a = func4()
print(f'a에 저장된 값: {a}')
안녕
a에 저장된 값: None
def func5():
'★'
a= func5()
print(a)
None
def func5():
return '★' # return을 이용해 변수에 값을 담음 func5()는 출력에만 사용하고 저장은 되지않음
star = func5()
print(f'star에 저장된 값 : {star}')
star에 저장된 값 : ★
def func6(num1, num2):
sum = num1 + num2
return sum #sum 값을 result에 담음
result = func6(10, 5)
print(result)
15
5. ※ None의 특징
- None은 파이썬에서 특별한 값으로, 아무런 값이 없음을 표현하는 데 사용됩니다. 다른 언어에서의 null 또는 nil과 유사한 개념입니다.
- None은 파이썬의 내장 상수이며, 그 자체로 데이터 타입이 NoneType입니다. 모든 None은 동일하므로, 두 개의 None 값을 비교할 때 항상 True를 반환합니다.
1. 기본 초기값 설정: 변수를 초기화할 때 아무런 값이 할당되지 않았음을 나타내기 위해 None을 사용할 수 있습니다.
variable = None
2. 함수의 반환 값으로 사용: 함수에서 특정 조건에서 아무런 값도 반환하지 않아야 할 때 None을 사용합니다. 사실, 함수에서 return 문이 생략되거나 없으면 기본적으로 None을 반환합니다.
def my_function(x): # x값에 값이 들어가게 되면
if x > 10 : # 10과 비교해서
return x # 조건에 맞으면 반환값이 나옴
# x가 10 이하일 때는 아무런 값도 반환하지 않습니다.
#실제로는 None이 반환됩니다.
my_function(11)
my_function(2) # 리턴이 없어 반환값이 안나옴
11
# 처음 코드 수정
def my_function(x):
if x > 10 :
return x
else:
return None # 조건이 안맞을 경우의 리턴값도 만들어야 반환값이 나옴
a = my_function(15)
print(a)
a = my_function(1)
print(a)
15
None
3. 선택적 매개변수의 기본값: 함수의 매개변수에 기본값으로 None을 할당하여 선택적으로 인자를 전달받을 수 있게 만들 수 있습니다.
# 선택적 매개변수의 기본값
def hello(message = None):
if message is None:
print('Hello') # None이면 Hello 출력
else:
print(message)
hello('안녕하세요')
hello()
안녕하세요
Hello
4. 값의 존재 여부 확인: None을 사용하여 값의 존재 여부를 확인할 수 있습니다.
None을 검사할 때는 == 대신 is 연산자를 사용하는 것이 좋습니다.
is는 객체의 동일성을 검사하는 반면, ==는 객체의 동등성을 검사하기 때문입니다.
# 값의 존재 여부 확인: None을 사용하여 값의 존재 여부를 확인할 수 있습니다.
def get_data_from_database():
pass # pass를 사용하면 나중에 이것을 채우던가 넘어가는 용도
data = get_data_from_database()
print(data)
if data is None :
print('데이터 수신 못함')
else :
print('데이터 수신 받음')
None
데이터 수신 못함
li1 = [1, 2, 3, 4, 5]
li2 = [1, 2, 3, 4, 5]
li3 = li1
# 서로 다른 개체(객체 비교). is는 객체의 동일성을 검사
result1 = li1 is li2
print(result1) # False
result2 = li1 is li3 # True
print(result2)
# 값이 같은 객체(값 비교). ==는 객체의 동등성을 검사
result3 = li1 == li2
print(result3) # True
6. 기본값이 설정된 매개변수
def func6(num1, num2):
sum = num1 + num2
return sum
print(func6(10, 3))
13
def func6(num1=1, num2=1):
sum = num1 + num2
return sum
print(func6())
#출력: 2
print(func6(10)) # num1에 10이 들어가고 , num2 = 1이 그대로 출력됨
#출력: 11
print(func6(10, 3)) # num1에 10이 들어가고, num2에 3이 들어감
#출력: 13
print(func6(num2=10)) # num1을 비우고 num2에만 값을 넣고 싶을때
#출력: 11
7. 가변 매개변수
7-1 . 패킹과 언패킹
- 언패킹(Unpacking) : 값을 풀어서 적는것
def get_Total(number1, number2, number3):
return number1 + number2 + number3
- 패킹(Packing) : 값을 묶어서 적는것
1. * 을 사용하면 get_total이 튜플형태로 한번에 들어간다. => 튜플 형태로 저장
2. 자동으로 여러개의 값을 받기 때문에 리스트로 받아짐
3. 여러개의 값을 하나로 묶어서 전달하게 되면, packing으로 인해 첫번째 방에 통채로 들어가게 된다.
4. 즉, 결과는 다음과 같다 ([1, 2, 3, 4, 5],) 튜플 안 첫번째 방
def get_total(*numbers): # *이 있다면 패킹 : 여러개 선언해야 하는것을 한번에 묶어서 받음
# 외부에서 전달받은 값들이 numbers(튜플)에 튜플형태로 저장된다.
print(type(numbers))
total = 0
for number in numbers:
total += number
return total
# *을 사용하면 get_total이 튜플형태로 한번에 들어간다
numbers = [1, 2, 3, 4, 5]
total = get_total(numbers)
print(total) # TypeError: unsupported operand type(s) for +=: 'int' and 'list'
- 따라서 내부의 요소는 각각 전달하고 싶다면, 앞에 *을 작성해야한다.
- 데이터가 묶어서 왔을때 *을 사용
numbers = [1, 2, 3, 4, 5]
total = get_total(*numbers)# 데이터가 묶어서 왔을때 *을 사용
print(total)
# # 튜플로 한번에 값을 받음
- 함수를 호출할 때 *를 사용하면 시퀀스(리스트, 튜플 등)의 요소를 개별적인 위치 인자로 풀어서 전달할 수 있습니다.
# 함수 내부에서는 매개변수를 튜플로 처리
def func7(*args): # *를 써서 데이터를 입력하면 튜플로 입력된다.
result = 0
# print(args)
for i in args:
result += i
return result
print(func7())
print(func7(10, 30, 20, 70))
print(func7(10))
def add(a, b, c):
return a + b + c
numbers = [1, 2, 3]
print(add(*numbers)) # 출력: 6
- 반드시 받아야하는 매개변수는 패킹앞에 작성하기
# 국어 영어 수학 점수를 전달받은 뒤 총점을 출력하는 함수
packing으로 제작하기
def get_total(name, *scores): # 반드시 받아야하는 매개변수는 packing앞에 작성한다
print(name + '님')
total = 0
for score in scores:
total += score
return total
scores= [100,40,50]
print(get_total('류니', 100, 40, 50))
kwargs (keyword arguments)
# # keyword arguments
#
# def introduce(**intro): #딕셔너리
# print(type(intro))
# print(f'name : {intro["name"]}')
#
#
# introduce(name="이정륜") # 딕셔너리로 보내려면 위에서 **kwargs
# introduce(**{'name':'이정륜'}) # 딕셔너리를 통채로 보내려면 딕셔너리 앞에 **
kwargs 예제 문제1)
국어 영어 수학 점수의 평균 구하기
# kwargs로 선언
def score_av(**kwargs):
all = sum(kwargs.values())
av = all/3
return av
print(score_av(**{'kor':80 , 'eng':90 , 'math': 70}))
def score_av(**kwargs):
kor = kwargs['kor']
eng = kwargs['eng']
math = kwargs['math']
return (kor+eng+math)/3
print(score_av(kor=80,eng=90,math=70))
kwargs 예제 문제 2)
국어 영어 수학 점수의 평균 구하기
# 사용자가 원하는 자리수(round)에서 반올림해준다.
# 자리수를 받지 않았다면, 기본값을 리턴한다.
# 국어 영어 수학 점수의 평균 구하기
# kwargs로 선언
def average(**kwarg):
if "round" in kwarg:
kor, eng, math = kwarg.get('kor'), kwarg.get('eng'), kwarg.get('math')
total = kor + eng + math
ave = total/3
if "round" in kwarg:
return round(ave, kwarg['round'])
return ave
print(average(kor=100, eng=30, math=22, round= 2))
8. 키워드 매개변수
def func8(id, name, age):
print(f'아이디: {id}')
print(f'이름: {name}')
print(f'나이: {age}')
func8('Fubao', '푸바오', 3)
func8(id = 'apple', age=20, name='푸바오') # 값을 입력할때 변수 이름을 써주면 함수 호출순서가 달라도 됨
아이디 : Fubao
이름 : 푸바오
나이 : 3
아이디 : apple
이름 : 푸바오
나이 : 20
dic1 = {'id' : 'apple', 'name' : '푸바오', 'age' : 3}
func8(**dic1) # ** 값이 입력 // key값이 func8 함수의 데이터 입력값과 동일해야 값을 출력
func8(*dic1) # *를 key 입력
아이디 : apple
이름 : 푸바오
나이 : 3
아이디 : id
이름 : name
나이 : age
def func9(**args):
#print(args)
for i in args: # i에 키가 저장
if i == 'id': # id값 뽑기
userid = args[i]
return userid
user = func9(id = 'apple', name = '푸바오', age = 20)
user
apple
9.여러개의 반환값
def func10(num1, num2):
return num1 + num2
result1 = func10(10,3)
print(result1)
13
def func10(num1, num2):
return num1 + num2, num1 - num2, num1 * num2, num1 / num2
result1, result2, result3, result4 = func10(10,3)
print(f'덧셈: {result1}, 뺄셈: {result2}, 곱셈: {result3}, 나눗셈: {result4}'
덧셈: 13, 뺄셈: 7, 곱셈: 30, 나눗셈: 3.3333333333333335
_, _, result3, _ = func10(10,3) # 곱셈의 결과만 필요할때 '_' 이용하면 원하는 값만 출력
print(result3)
30