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)

'컴퓨터 비전 > 파이썬 기초' 카테고리의 다른 글

14. 콜백함수와 람다함수  (1) 2023.12.11
13. 변수의 범위  (1) 2023.12.11
11. 컬렉션과 반복문  (1) 2023.12.10
10. 제어문 - 반복문  (1) 2023.12.10
9. 제어문 - 조건문  (2) 2023.12.08