IT world

[Python] 24.01.11 함수와 클래스 복습 본문

모두의 연구소(오름캠프)/AI 모델 활용 백엔드 개발 과정

[Python] 24.01.11 함수와 클래스 복습

엄킹 2024. 1. 11. 17:57

오늘은 이전의 내용 함수부터 클래스까지 복습하는 시간을 가졌다. 

 

주로 자주 쓰는 함수, lambda, bulit-in function 그리고 클래스 생성까지 실제 프로그램을 작성할 때 자주 사용되는 내용을 소개해주셨다.

 

실습 문제를 통해 수업이 진행되었고, 해당 내용을 소개해보려고 한다.

 

1. 함수

 

map()을 통해 함수에 대한 간단한 예제를 작성했다. 아래 코드처럼 함수 사용 시 재사용과 가독성의 이점이 있다.

[함수 사용 예시]

 

파이썬은 객체지향의 언어로, 객체의 주소를 담고 있다. 

a = 10 → 'a'는 무엇일까? 바로 int의 인스턴스 즉 int 정수형 클래스로 만들어진 객체이다.

 

print..! 파이썬에서 출력을 위한 코드를 작성하려면 print를 사용한다. 하지만 print는 함수의 이름일뿐 print도 출력을 위한 기능의 주소를 가리키고 있는 것이다. 

 

즉 print_list[print, print, print] 처럼 리스트에 print 함수를 추가했다면, print_list[2]('hello world') 이렇게 사용이 가능한 것이고 python  = print 처럼 새로운 변수에 print를 할당하면 python과 print는 같은 주소를 바라보게 되고 python('hello world') 이런 식의 사용이 가능하다는 것이다.

[코드 예시]

 

2. 람다(lambda)

익명함수 (anonymous function) 라고도 불리며, 간단한 한줄짜리 함수를 정의할 때 사용되고 함수를 한 번만 사용하거나 함수를 인자로 전달해야하는 경우에 사용된다. (일회성으로 필요한 곳에 즉시 사용한 후에 버릴 수 있으므로 코드가 간결해지고 메모리가 절약된다.) 

 

람다함수는 map(), filter(), sorted() 등의 함수와 같이 사용되며, 간단한 경우에는 사용하기 좋지만 복잡한 로직이나 여러줄을 처리해야하는 코드에서는 적합하지 않다.

 

여기서 람다와 일반함수의 차이점을 간단히 설명하자면

  • 람다함수는 이름이 없지만, 일반함수는 이름이 있다.
  • 람다 함수는 표현식 하나만 사용할 수 있으며, 복잡한 로직을 구현할 수 없고 일반함수는 복잡한 로직을 구현할 수 있다.
  • 람다함수는 간결한 코드 작성에 유용하지만, 일반함수는 코드의 가독성과 재사용성을 높이는데 도움이 된다.

 

2.1 map()을 이용한 예시

-. map()이란 여러 개의 데이터를 받아서 각각의 요소에 함수를 적용한 결과를 반환하는 내장 함수

-. 구조 : map(function, iterable) → 첫번째 매개변수로는 함수, 두번째 매개변수로는 반복 가능한 자료형이 온다.

-. map 함수의 반환값은 map객체이기 때문에 해당 자료형을 list 또는 tuple로 형변환시켜줘야한다. 

-. 함수동작은 두번째 인자로 들어온 반복 가능한 자료형을 첫 번째 인자의 함수에 하나씩 집어넣어 함수를 수행하는 것으로, map(적용시킬함수, 적용할 값들) 이런 식이다. 

# 1. 함수를 사용한 예시
def 제곱(x):
    return x ** 2
    
list(map(제곱, [1, 2, 3, 4])) 

#2. 람다를 사용한 예시
list(map(lambda x: x**2, [1, 2, 3, 4]))

#3. 마스킹 문법
list(map(lambda x: True if x % 2 == 0 else False, [1, 2, 3, 4]))

#4. 2개의 리스트의 각 인덱스 값을 더하는 예제
a = [1,2,3,4]
b = [17,12,11,10]

list(map(lambda x, y:x+y, a,b))

 

2.2 filter()을 이용한 예시

-. filter()란 주어진 반복 가능한 자료형(리스트, 튜플 등)에서 특정 조건에 맞는 요소만 골라내는 역할을 하는 내장함수

-. 구조 : filter(function, iterable) → 첫번째 매개변수로는 필터링 조건을 판별하는 함수, 두번째 매개변수로는 반복 가능한 자료형이 온다.

-. filter() 함수는 주어진 함수를 반복 가능한 객체의 각 요소에 적용하여, 함수의 반환값이 True인 요소만 걸러내어 반환한다. 즉 함수에 값을 하나하나 넣어서 결과가 참인지 거짓인지에 따라 요소를 포함할지 말지 결정한다. 

function에서 처리되는 각각의 요소는 Boolean 값으로 반환되고, True로 반환되면 그 요소는 남게되고, False는 제거된다.

-. filter 함수의 반환값은 filter객체이기 때문에 해당 자료형을 list 또는 tuple로 형변환시켜줘야한다. 

# 1. 함수를 사용한 예제
def is_even(number):
	return number % 2 == 0
   
numbers = [1,2,3,4,5]
even_numbers = filter(is_even, numbers)

# 2. 람다를 사용한 예제
list(filter(lambda x: x % 2 == 0, range(100))) # 0~99까지 짝수 호출

# 3. 람다를 사용한 예제2
list(filter(lambda x: True if x % 3 ==0 or x % 5 == 0 else False, range(100)))

 

2.3 sorted()을 이용한 예시

-. sorted()란 데이터(리스트, 튜플, 문자열, 딕셔너리)를 정렬하는 가장 기본적인 역할을 하는 내장함수로 원본을 수정하지 않는다.

-. 구조 : sorted(iterable, key=None, reverse=False) → 첫번째 매개변수로는 반복 가능한 자료형(정렬할 데이터), 두번째 매개변수로는 정렬 기준을 설정하며, 세번째 매개변수는 정렬방향을 설정한다.

-. 정렬된 복사본을 반환하기 때문에 원본을 보존해야하는 경우 많이 사용되며, 복사본을 만드는 과정에서 메모리를 추가적으로 사용하기 때문에 느릴 수도 있다.

반별점수 = [
    ['홍길동', 30, 55, 22],
    ['홍춘향', 55, 60, 73],
    ['이철수', 32, 65, 68],
    ['이호준', 92, 11, 95],
]

# 1. 함수를 사용한 예시
def 함수(x):
    return x[3]
   
sorted(반별점수, key = 함수) # index = 3의 값으로 정렬

#2. 람다를 사용한 예시
sorted(반별점수, key = lambda x: x[2]) # index = 2의 값으로 정렬

#3. 람다를 사용한 예시_역순
sorted(반별점수, key = lambda x: x[1] + x[2] + x[3], reverse = True)

#4. 람다를 사용한 예시_조건 추가
# 합산이 동일할 경우 x[3]의 값을 비교하여 정렬
sorted(반별점수, key = lambda x:(x[1] + x[2] + x[3], x[3]), reverse = True)

 

3. 클래스(class)

클래스는 객체 지향 프로그래밍에서 사용되는 기본 구조로, 데이터와 그 데이터에 관련된 함수를 하나의 단위로 묶는 역할이며 객체가 가질 수 있는 속성(attribute)과 행동(method)을 정의한다.

 

인스턴스는 클래스에 의해 생성된 객체동일한 클래스로부터 여러 인스턴스를 생성할 수 있으며, 각 인스턴스는 서로 다른 속성 값을 가질 수 있다.

 

즉, 클래스는 일종의 설계도이며, 인스턴스는 그 설계도를 바탕으로 만들어진 실체이다.

 

클래스를 사용하는 이유는 효율적인 프로그래밍을 위함이다. Class를 사용하면 훨씬 직관적이고 가독성을 높일 수 있으며, 재사용성이 훌륭하며, 객체들이 가지는 속성들도 각 객체별로 관리하기가 쉽다.

 

클래스를 생성하면 __init__ 함수인 생성자를 사용할 수 있고 Class가 생성될때 가장 먼저 호출되는 함수이다. 모든 클래스의 가장 기본이 되는 메서드로 self 매개변수를 사용하며, self 키워드를 통해 클래스 내부 속성 및 메서드에 접근할 수 있다.

 

class Post:
	post_number = 1234 # 클래스 변수
    
    def __init__(self, title = ''): # 초기값 설정
        '''
        인스턴스 고유의 영역을 정의하는 것
        '''
        self.title = title # title 인스턴스 변수

    def __add__(self): 
        pass

    def __len__(self):
        pass

    def update(self):
        pass

    def delete(self):
        pass
       
    def __str__(self): # 이런 방법으로 __str__ 메서드를 재정의할 수도 있다.
        return self.title

게시물1 = Post('파이썬은 참 깊군요!')

print(게시물1.title)
print(게시물1) # 클래스에서 __str__ 메서드의 사용을 재정의 했으므로 title을 출력한다.
Comments