본문 바로가기
Python/개념

Day 5-2. 사용자 정의 함수

by 사라리24 2024. 3. 15.
SMALL

 

식별자 뒤에 괄호가 붙어 있으면 식별자는 '함수'라고 부릅니다.
지금까지 여러가지 함수를 사용해 보았는데,
가장 많이 사용했던 함수는 print( ) 함수 입니다.
이 외에도 len( ), str( ), int( ) 등도 사용했었습니다.

이러한 함수를 사용자도 정의하여 사용할 수 있습니다.
어떻게 만들고 활용하는지에 대해 살펴보겠습니다.



1.  사용자 정의 함수

사용자 정의 함수란 사용자가 특정 작업을 수행하기 위해 직접 작성한 함수를 의미합니다. 파이썬에는 많은 내장 함수들이 있지만, 때로는 우리의 요구사항에 맞게 동작하는 함수를 직접 만들어야 할 때가 있습니다. 이때 사용자 정의 함수를 작성하게 됩니다. 기본적인 구조는 아래와 같습니다.

 

 
  
  def 함수명(매개변수1, 매개변수2, ...) :
 
      # 함수 내용
 
      return 결과값
 

 

  • 함수 사용: 함수를 호출한다.
  • 매개변수: 함수 안에 자료
  • 리턴값: 함수를 호출해서 나오는 결과

 

 

 

 


1. 매개변수
 ,  반환 값 X  

 

 
  def func1( ):
      print('처음으로 만드는 함수!')  

  func1( )
  func1( )

  for i in range(5):
      func1( )
 

 

처음으로 만드는 함수!
처음으로 만드는 함수!
처음으로 만드는 함수!
처음으로 만드는 함수!
처음으로 만드는 함수!
처음으로 만드는 함수!
처음으로 만드는 함수!

ㄴ 함수 자체를 객체로 저장합니다

ㄴ 함수 이름을 부르면 실행됩니다

ㄴ for 문에 넣어서 실행 가능합니다

 

 

 

 

 

 


2. 매개변수 O ,  반환 값 X  


 

  
  def func2(num):
      print(f'입력받은 숫자: {num}')
 
  func2(10)
  func2(4)
 
입력받은 숫자: 10
입력받은 숫자: 4

 

 
  def func3(start, end):
      sum = 0
      for i in range(start, end+1):
          sum += i
      print(f'{start}부터 {end}까지의 합: {sum}')

  func3(1, 10)
  func3(1, 100)
 
1부터 10까지의 합: 55
1부터 100까지의 합: 5050

 

 

 

 

 

 

3. 매개변수 X ,  반환 값 O

 

 

  
 
  def func4():
      print('안녕하세요 Python!'#  리턴값이 없습니다.

  a = func4()
  print(f'a에 저장된 값: {a}')
 
 
안녕하세요 Python!
a에 저장된 값: None

ㄴ 리턴값이 없습니다.  

ㄴ 실행하면 줄 반환값이 없어 None 으로 뜨게 됩니다.

 
  def func4():
      print('안녕하세요 Python!')

  a = func4     #funf4()   X
  print(f'a에 저장된 값: {a}')


a에 저장된 값: <function func4 at 0x7981f2bfbf40>

ㄴ 실행하지 않고 저장해야 주소값이 저장됩니다.

 

 
  def func5():
      return '🎁'   #  리턴값이 존재

  presents = func5()
  print(f'presents에 저장된 값: {presents}')
 
presents에 저장된 값: 🎁

ㄴ 리턴값이 있습니다.

ㄴ 실행하면 반환값을 줍니다.

 

 
 
  def func5( ):
    return '🎁'  # 더 사용 많이 하는 방법
                           # 확장성이 있습니다.
 
  def func5( ):
    print('🎁')
 
  presents = func5( ) 
  print(f'presents에 저장된 값: {presents}'
 
presents에 저장된 값: 🎁

ㄴ 둘 다 결과값은 같습니다.

ㄴ 리턴값이 있는 경우를 더 많이 사용합니다. 확장성이 있기 때문입니다.

 

 
  def func6(num1, num2):
      sum = num1 + num2 
      return sum

  result = func6(10, 5)
  print(result)  # 리턴값
  print(sum) # 리턴 주소값
  # print(num1) 함수 밖에서는 알 수 없음
  # print(num2) 함수 밖에서는 알 수 없음
 
 
15
<built-in function sum>

ㄴ 매개변수를 넣어 실행시켜야 결과값을 받을 수 있습니다.

ㄴ 함수 안에 리턴값을 실행시키지 않고 받으면 주소값이 나옵니다.

 

 

 

 


None의 특징

 

None은 파이썬에서 특별한 값으로, 아무런 값이 없음을 표현하는 데 사용됩니다. 
다른 언어에서의 null 또는 nil과 유사한 개념입니다.

None은 파이썬의 내장 상수이며, 그 자체로 데이터 타입이 NoneType입니다. 
모든 None은 동일하므로, 두 개의 None 값을 비교할 때 항상 True를 반환합니다.

 

1. 기본 초기값 설정: 변수를 초기화할 때 아무런 값이 할당되지 않았음을 나타내기 위해 None을 사용할 수 있습니다.

 
  variable = None
 

 

 

2. 함수의 반환 값으로 사용: 함수에서 특정 조건에서 아무런 값도 반환하지 않아야 할 때 None을 사용합니다. 사실, 함수에서 return 문이 생략되거나 없으면 기본적으로 None을 반환합니다.


  def
my_function(x):
      if x > 10:
          return x
    # x가 10 이하일 때는 아무런 값도 반환하지 않습니다. 실제로는 None이 반환됩니다.

 


3. 선택적 매개변수의 기본값: 함수의 매개변수에 기본값으로 None 할당하여 선택적으로 인자를 전달받을  있게 만들  있습니다.


  def
hello(message=None):
      if message is None:
          print("Hello!")
      else:
          print(message)

Hello

 


  # 값의 존재 여부 확인
 
  def get_data_from_database( ):
      pass

  data = get_data_from_database( )
  print(data)
  if data is None:
     print('데이터를 수신하지 못함!')
  else:
      print('데이터를 수신받음!')

데이터를 수진하지 못함!

ㄴNone을 검사할 때는 == 대신 is 연산자를 사용하는 것이 좋습니다.

ㄴis는 객체의 동일성을 검사하는 반면, ==는 객체의 동등성을 검사하기 때문입니다.

 


   
# 이렇게 검사하는 것이 좋습니다.
  if x is None:
      pass

  # 이렇게 검사하는 것은 권장되지 않습니다.
  if x == None:
      pass 

 


  li1 =
[1, 2, 3, 4, 5]
  li2 = [1, 2, 3, 4, 5]

  # 객체 비교
  result1 = li1 is li2
  # 값 비교
  result2 = li1 == li2

  print(result1)
  print(result2)

False
True




 

 

 

 

 

4.  매개변수 O (기본값 설정) ,  반환 값 O

 

  
  def func6(num1=1, num2=1): # 기본값 설정
   sum = num1 + num2
   return sum

  print(func6( ))   # 변수의 기본값으로 출력
  print(func6(10))  # 앞 변수만 변경
  print(func6(10, 5)) # 두 변수 다 변경
  print(func6(num2=10)) # 뒤 변수만 변경, 이름을 호출해서 변경

  result = func6(7, 3)
  print(result)
 
 
2
11
15
11
10

 

 

 

 

 

5.   매개변수 O ( 가변 ),  반환값 X

 

 

   
  # 함수 내부에서는 매개변수를 튜플로 처리
 
  def func7(*args):
    print(args)

  print(func7())
  
( )
None

ㄴ 매개변수에 *을 분이면 아무것도 없는 튜플로 처리됩니다.

ㄴ none도 같이 출력됩니다.

 

  
   # 함수 내부에서는 매개변수를 튜플로 처리
 
    def func7(*args)
      result = 0
      for i in args:
          result += i
      return result

  print(func7( ))
  print(func7(10, 30, 20, 70))
  print(func7(10))
 
  
0
130
10

 

 

 

 

 

 

 

6.  매개변수 O (키워드) , 반환값 X

 

 

  
  def func8(id, name, age):
      print(f'아이디: {id}')
      print(f'이름: {name}')
      print(f'나이: {age}')

  func8('apple','김사과', 20) # 순서가 맞아야 함
 


아이디: apple
이름: 김사과
나이: 20

 

  
 
  func8(age=80, id='banana', name='반하나')  # 변수이름에 넣으면, 순서가 맞지 않아도 됨
 
 
아이디: banana
이름: 반하나
나이: 80

 

 
 
  dic1 = {'age':25, 'id':'melon', 'name':'이메론'}
  func8(**dic1)

  # ** 아스테릭 두개
  # 매개변수의 이름에 맞춰 '값'을 전달
 
아이디: melon
이름: 이메론
나이: 25
 
   #*의 데이터를 보낼 경우 키가 저장

  func8(*dic1)

  # 매개 변수의 순서에 따라 '키'를 전달
  # 매개변수의 이름에 맞춰 '값'을 전달


아이디: age
이름: id
나이: name

 

 

 

 

 

 

7.  매개변수 O , 반환값 O ( 여러개)

 

 

 

 
 
  def func10(num1, num2):
    return num1 + num2

  result1 = func10(10,3)
  print(result1) # 리턴값 1개
 

 

13

 

 

 
  def func10(num1, num2):
    return num1 + num2, num1 - num2, num1 * num2, num1 / num2

  result1, result2, result3, result4 = func10(10, 3)        # 리턴값 4개

  print(f'덧셈: {result1}, 뺄셈: {result2}, 곱셈: {result3}, 나눗셈: {result4}')
 

 

덧셈: 13, 뺄셈: 7, 곱셈: 30, 나눗셈: 3.3333333333333335

 

 

 
  def func10(num1, num2):
    return num1 + num2, num1 - num2, num1 * num2, num1 / num2
 
  _, _, result3, _ = func10(10, 3)  # 곱셈의 결과만 필요할 때 / _(언더바 사용)
 
  print(result3)


 

30

ㄴ 함수는 재활용하고 싶지만, 곱셈만 출력하고 싶을 때 

 

 
 
  li1 = [10,20,30,40,50]

  for _, v in enumerate(li1) :
    print(f'값:{v}')
 
  # value 값만 출력하고 싶을 때
 
 
값:10
값:20
값:30
값:40
값:50

 

 

 

 


 

 

 

파이썬 함수와 메모리

1. 메모리 로드

함수 정의: 파이썬에서 함수는 객체로 취급됩니다. 따라서 함수를 정의하면 해당 함수는 메모리 상에 적재되며, 함수 이름은 이 함수 객체를 참조하게 됩니다.

변수 할당: 함수를 다른 변수에 할당하면 그 변수는 원래의 함수 객체를 참조합니다. 이는 파이썬의 함수가 일급 객체(first-class object)로 취급되기 때문에 가능합니다.


  def
my_function():
      print("Hello, World!")

  func_var = my_function
  func_var()  # 이렇게 호출해도 "Hello, World!" 가 출력됩니다.

 

Hello, World!


2. 메모리 제거

참조 카운트: 파이썬의 메모리 관리는 주로 참조 카운팅(reference counting)에 기반합니다. 객체를 참조하는 변수나 요소의 수를 세어서 이 카운트가 0이 되면 해당 객체는 메모리에서 제거될 수 있게 됩니다.

Garbage Collection: 참조 카운트가 0인 객체들은 바로 메모리에서 제거되지 않습니다. 대신, 파이썬의 가비지 컬렉터(garbage collector)가 이런 객체들을 주기적으로 찾아서 메모리에서 제거합니다.

함수의 경우: 함수도 파이썬 객체이므로 참조 카운팅과 가비지 컬렉션의 원칙에 따라 동작합니다. 함수를 참조하는 변수나 요소가 없게 되면 해당 함수는 가비지 컬렉터에 의해 메모리에서 제거될 수 있습니다.

명시적 제거: del 명령어를 사용하여 함수에 대한 참조를 명시적으로 제거할 수 있습니다. 하지만 이것이 함수가 즉시 메모리에서 제거된다는 것을 보장하지는 않습니다.

종료 시: 파이썬 프로그램이 종료될 때, 모든 메모리는 OS에 반환됩니다. 따라서 프로그램이 종료되면 함수와 관련된 모든 메모리도 함께 반환됩니다.


  def
my_function():
      print("Hello, World!")

  del my_function
  # 이후 my_function()을 호출하려고 하면 오류가 발생합니다.


 

'Python > 개념' 카테고리의 다른 글

Day 6-2. 콜백함수와 람다함수  (0) 2024.03.15
Day 6-1. 변수의 범위  (0) 2024.03.15
Day 5-1. 컬렉션과 반복문  (0) 2024.03.15
Day 4-5. 제어문 - 반복문  (0) 2024.03.14
Day 4-4. 제어문 - 조건문  (0) 2024.03.14