본문 바로가기
기초 및 언어/▶ python

12_Python. 사용자 정의 함수 (def 함수명)

by 류딩이2023. 12. 10.

 

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)

 

 

 

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)  # 리턴이 없어 반환값이 안나옴
# 처음 코드 수정
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))

 

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)
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)