[Python] 11. 파이썬다운 코딩

YJ·2024년 12월 6일

Python 공부하기

목록 보기
12/13
post-thumbnail

본 블로그 글은 박동민·강영민 저자님의 으뜸파이썬 교재를 참고하여 만들어진 글임을 밝힙니다.

파이썬 다운 코딩

람다 함수

  • 1회용의 간단한 함수이다.
  • 이름이 없기 때문에 익명함수(anonnymous function)라고 불린다.
  • 간결한 표현을 위해 사용할 수 있다.
  • 람다 함수는 뒤에 나올 필터와 맵과 함께 편리하게 사용할 수 있다.

형식

lambda 매개변수1, 매개변수2, ... : 표현식

실습

add = lambda x, y : x + y

print('10과 20의 합 :', add(10,20))
print('10과 20의 합 :', (lambda x, y: x + y)(10, 20)) # 인라인 람다 함수

필터 함수

  • 여러 데이터 중 특정 조건에 맞는 값만 필터링하여 반환하는 함수이다.
  • 파이썬에서 내장 함수로 제공되며, 주로 조건을 확인하는 함수와 함께 사용된다.
  • 결과는 조건에 맞는 값만 포함하는 이터레이터(iterator) 형태로 반환된다.
  • 함수형 프로그래밍의 특징 중 하나로, 코드의 간결성과 가독성을 높이는 데 유용하다.

형식

filter([적용시킬 함수], {반복 가능한 객체})

실습

def adult_func(n):
	return n >= 19

ages = [20, 3, 40, 33, 18, 19]
for a in filter(adult_func, ages):
	print(a, end = ' ')

lambda와 함께 사용하는 예제

ages = [20, 3, 40, 33, 18, 19]
for a in filter(lambda x : x >= 19, ages):
	prinT(a, end = ' ')

더 간략화하는 필터

ages = [20, 3, 40, 33, 18, 19]
adult_ages = list(filter(lambda x : x >= 19, ages))
print(adult_ages)

맵 함수

  • 반복 가능한 객체의 각 요소에 함수를 적용하여 새로운 값을 반환하는 함수이다.
  • 파이썬에서 내장 함수로 제공되며, 주로 데이터를 변환하거나 처리할 때 사용된다.
  • 결과는 함수의 변환 결과가 포함된 이터레이터(iterator) 형태로 반환된다.
  • 함수형 프로그래밍의 특징 중 하나로, 코드의 간결성과 유지보수를 용이하게 만든다

형식

map([적용시킬 함수], {반복 가능한 객체})

실습

def sqaure(x):
	return x ** 2

n_list = [1, 2, 3, 4, 5]
sqaure_n = list(map(sqaure, n_list))
print(sqaure_n)

lambda와 함께 사용하는 예제

n_list = [1, 2, 3, 4, 5]
sqaure_n = list(map(lambda x : x ** 2, n_list))
print(sqaure_n)

리스트 축약 표현 (List Comprehension)

  • 리스트를 간결하고 효율적으로 생성하는 방법이다.
  • 기존의 for문이나 map() 함수 대신 사용할 수 있어 코드가 더 읽기 쉽고 간결해진다.
  • 새로운 리스트를 만들면서 조건을 추가하거나 값을 변환하는 작업이 가능하다.

형식

[표현식 for 항목 in 반복 가능한 객체 if 조건]

실습

result = [i**2 for i in range(5)]
print(result)  # [0, 1, 4, 9, 16]

if 조건이 들어간 리스트 축약 표현

result = [i for i in range(10) if i % 2 == 0]
print(result)  # [0, 2, 4, 6, 8]

중첩 반복 리스트 축약 표현

result = [(x, y) for x in range(3) for y in range(3)]
print(result)  # [(0, 0), (0, 1), (0, 2), (1, 0), ...]

if 조건이 두 개인 리스트 축약 표현

# 1부터 20까지의 숫자 중 2의 배수이면서 3의 배수인 숫자
result = [i for i in range(1, 21) if i % 2 == 0 if i % 3 == 0]
print(result)

반복자 (Iterator)

  • 파이썬에서 반복 가능한 객체(Iterable)를 순회할 수 있는 객체이다.

  • 주로 for과 함께 사용되어 요소를 하나씩 처리한다.

  • 반복자는 __iter__와 __next__ 매직 메서드를 구현하여 정의할 수 있다.

    • __iter__ 매서드
      • 반복 가능한 객체(Iterable)에서 호출되어 반복자(Iterator)를 반환한다.
      • 일반적으로 self를 반환하여 객체 자체가 반복자가 되게 만든다.
    • __next__ 매서드
      • 반복의 다음 값을 반환하며, 더 이상 값이 없을 때 StopIteration 예외를 발생시켜 반복을 종료한다.
  • 반복자 관련 내장함수

    • iter() 함수
      • 파이썬에서 반복 가능한 객체(Iterable)를 반복자(Iterator)로 변환하는 내장 함수.
      • iter() 함수는 반복 가능한 객체의 __iter__() 메서드를 호출하여 반복자를 생성한다.
      • 이미 반복자인 객체에 대해 호출하면, 객체를 그대로 반환한다.
    • next() 함수
      • 반복자에서 다음 값을 반환하는 내장 함수.
      • next() 함수 호출은 반복자 객체의 __next__() 매직 메서드를 호출하는 것과 같다.
      • 더 이상 반환할 값이 없으면 StopIteration 예외를 발생시켜 반복을 종료한다.
  • __iter__와 for문의 관계

    • for문은 반복 가능한 객체에서 내부적으로 iter() 함수를 호출한다.
    • iter() 함수는 __iter__ 메서드를 실행하여 객체를 반복자(Iterator)로 변환한다.
    • 이후, 반환된 반복자에서 __next__ 메서드를 호출하여 값을 하나씩 가져온다.
    • for문은 StopIteration 예외가 발생할 때 반복을 종료한다.

실습

iter() 함수와 next() 함수 사용 예시

# 리스트를 반복자로 변환
nums = [10, 20, 30]
iterator = iter(nums)

print(next(iterator))  # 출력: 10
print(next(iterator))  # 출력: 20
print(next(iterator))  # 출력: 30
# 다음 값이 없으면 StopIteration 예외 발생
# print(next(iterator))  # 주석 제거 시 StopIteration 예외 발생

사용자 정의 반복자 클래스

class Counter:
    def __init__(self, start, end):
        self.current = start
        self.end = end

    def __iter__(self):
        return self  # 반복자 반환

    def __next__(self):
        if self.current < self.end:
            self.current += 1
            return self.current - 1  # 현재 값 반환 후 1 증가
        else:
            raise StopIteration  # 반복 종료

# 반복자 사용
counter = Counter(1, 5)

for num in counter:
    print(num, end=' ')  # 출력: 1 2 3 4

반복 가능 객체를 위한 내장함수

  • 파이썬의 반복 가능한 객체(Iterable)는 다양한 내장함수들을 적용할 수 있다.
함수설명예제결과
min()반복 가능한 객체에서 최소값을 반환함min([3, 1, 4, 1, 5])1
max()반복 가능한 객체에서 최대값을 반환함max([3, 1, 4, 1, 5])5
all()모든 요소가 참(True)이면 True를 반환하고, 하나라도 거짓(False)이면 False를 반환함all([True, 1, 'a'])True
any()하나라도 참(True)인 요소가 있으면 True를 반환하고, 모두 거짓(False)이면 False를 반환함any([False, 0, None, 1])True
ascii()객체의 비 ASCII 문자를 이스케이프 코드로 변환한 문자열을 반환함ascii("파이썬")"'\\ud30c\\uc774\\c2dd'"
bool()객체의 논리적 참/거짓 값을 반환함bool([])False
filter()반복 가능한 객체에서 조건을 만족하는 요소만 반환함list(filter(lambda x: x > 2, [1, 2, 3, 4]))[3, 4]
iter()반복 가능한 객체를 반복자로 변환함iterator = iter([1, 2, 3])<iterator>
map()반복 가능한 객체의 각 요소에 함수를 적용한 값을 반환함`list(map(lambda x: x2, [1, 2, 3]))`**[1, 4, 9]
next()반복자에서 다음 값을 반환하며, 더 이상 값이 없으면 StopIteration 예외를 발생시킴next(iter([1, 2, 3]))1
enumerate()반복 가능한 객체의 각 요소에 인덱스 값을 추가하여 반환함list(enumerate(['a', 'b', 'c']))[(0, 'a'), (1, 'b'), (2, 'c')]
zip()두 개 이상의 반복 가능한 객체를 병렬로 묶어 튜플로 반환함list(zip([1, 2, 3], ['a', 'b', 'c']))[(1, 'a'), (2, 'b'), (3, 'c')]
sorted()반복 가능한 객체를 정렬한 후 새로운 리스트로 반환함sorted([3, 1, 4, 1, 5])[1, 1, 3, 4, 5]
reversed()반복 가능한 객체의 요소를 반대로 뒤집은 반복자를 반환함list(reversed([1, 2, 3]))[3, 2, 1]

제너레이터 (generator)

  • 반복자(iterator)의 한 종류로, 값이 필요할 때마다 하나씩 생성하여 반환한다.
  • 제너레이터는 yield 문을 사용하여 값을 반환하며, 반환 후에도 함수의 실행 상태를 유지한다.
    • yield는 값을 반환하면서 함수의 실행 상태를 일시 중단함
    • 함수가 호출될 때마다 이전 상태에서 실행을 계속함
  • 메모리를 효율적으로 활용할 수 있다는 장점이 있다.

실습

def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()
print(next(gen))  # 출력: 1
print(next(gen))  # 출력: 2
print(next(gen))  # 출력: 3
# print(next(gen))  # StopIteration 예외 발생

for문과 함께 사용

def my_generator():
    yield "Hello"
    yield "World"

for value in my_generator():
    print(value)
profile
제 글이 유익하셨다면 ♡와 팔로우로 응원 부탁드립니다.

0개의 댓글