[파이썬기초] 10. 리스트 축약, 람다함수, iterator & generator

일리삼·2022년 6월 5일

파이썬

목록 보기
10/10

1. 리스트 축약

{표현식} for {변수} in {iterator/iterable} if {조건 표현식}
  • if 조건은 생략 가능
  • iterable: 리스트, 튜플, 딕셔너리, 집합, 파일, 문자열, range() 등
  • 리스트 뿐만 아니라 모든 iterable 축약 가능
rsit1 = list(range(10))
print(rsit1)
    
rsit2 = list(n**2 for n in range(10))
print(rsit2)
    
rsit3 = list(n for n in range(10) if n%2==0)
print(rsit3)
    
rsit4 = list(n**2 for n in range(10) if n%2)
print(rsit4)
    
lst = [-30, 45, -5, -90, 20, 53, 77, -36]
rsit5 = [n for n in lst if n<0]
print(rsit5)
    
ages = [34,39,20,18,13,54]
rsit6 = [n for n in ages if n>=19]
print(rsit6)
    
A=[1,2,3]
B=[2,4,6]
rsit7 = [a*b for a in A for b in B] # for문 여러개 작성해도 됨
print(rsit7)

실행 결과

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[0, 2, 4, 6, 8]
[1, 9, 25, 49, 81]
[-30, -5, -90, -36]
[34, 39, 20, 54]
[2, 4, 6, 4, 8, 12, 6, 12, 18]

2. 람다 함수

  • 이름 없는 함수, 익명 함수라고도 하며, 1회용의 간단한 함수가 필요할 때 사용
    • 매개변수로 함수를 전달하기 위해 함수 구문을 작성하는 것이 번거롭고, 코드 공간 낭비라는 생각이 들 때 함수를 간단하고 쉽게 선언
    • 람다 함수를 사용하면, def 키워드로 선언했던 함수들을 lambda로 바꾸고, return 키워드를 따로 쓰지 않아도 곧바로 함수의 매개변수에 넣을 수 있다는 장점이 있음
lambda 매개변수: 리턴값

예제 코드

sub = lambda x, y: x - y
# 람다함수를 sub라는 이름으로 할당도 가능함
print(sub(5,3))
    
rslt = (lambda x, y: x * y)(5,3)
print(rslt)
    
#보통 람다함수는 함수의 인자로 많이 사용함
st_lst = ['abcdefg', 'hello', 'python', 'c', 'java']
print(sorted(st_lst, key = len)) # 디폴트: 사전식 배열 , key값 입력 시 그 키값을 기준으로 베열
print(max(st_lst, key = len))
    
print(sorted(st_lst, key = lambda s:s[-1]))

실행 결과

2
15
['c', 'java', 'hello', 'python', 'abcdefg']
abcdefg
['java', 'c', 'abcdefg', 'python', 'hello']
  • 함수를 매개변수로 전달하는 대표적인 표준함수로 map() 함수와 filter()함수가 있음
  • map() 함수는 리스트의 요소를 함수에 넣고 리턴값으로 새로운 리스트를 구성해 주는 함수
map(적용시킬 함수, 반복가능한 객체(리스트), ...)
  • filter() 함수는 리스트의 요소를 함수에 넣고 리턴된 값이 True인 것으로, 새로운 리스트를 구성해주는 함수
filter(적용시킬 함수, 반복가능한 객체(리스트), ...)
  • 위의 두 표준함수에 대한 예제는 아래와 같음
def lamEx():
    ages = [34,39,20,18,13,54]
    rslt = list(filter(lambda age: age>=15, ages))
    print(rslt)

def mapEx():
    lst = list(map(lambda x: x**2, range(10)))
    print(lst)
    
    
def main():
    lamEx()
    mapEx()

main()

실행 결과

[34, 39, 20, 18, 54]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

3. iterator, generator

3.1 iterator 기본

  • 반복문의 구문은 다음과 같다
for 반복자 in 반복할 수 있는 것
  • 여기서 '반복할 수 있는 것'을 프로그래밍 용어로 이터러블(iterable)이라고 함
    • 내부에 있는 요소들을 차례차례 꺼낼 수 있는 객체를 의미
    • 리스트, 딕셔너리, 문자열, 튜플 등
  • 이터러블 중에서 next()함수를 적용해 하나하나 꺼낼 수 있는 요소를 이터레이터(iterator)라고 함
    • 즉, 하나 이상의 항목이 포함되어 있는 자료구조에서 데이터를 순차적으로 꺼내어 이용할 수 있는 객체
numbers = [1, 2, 3, 4, 5, 6]
r_num = reversed(numbers)

print('reversed_numbers:', r_num)
print(next(r_num))
print(next(r_num))
print(next(r_num))
print(next(r_num))
print(next(r_num))

실행 결과

reversed_numbers: <list_reverseiterator object at 0x034D21D0>
6
5
4
3
2
  • reversed() 함수의 리턴값이 바로 'reverseiterator'로 '이터레이터'
  • 이터레이터는 반복문의 매개변수로 전달할 수 있으며, next()함수로 내부의 요소를 하나하나 꺼낼 수 있음

3.2 Iterator 생성

3.2.1 iterator 클래스 정의

  • class로 이터레이터를 정의하여 사용 가능
  • 이 경우, __next__(self)를 이용해 next() 함수를 구현하여야 하며, __iter__(self)함수를 통해 이터레이터임을 정의해야함
class Fibo:
    def __init__(self):
        self._x = 1
        self._y = 1
    
    def __iter__(self):
        return self
    
    def __next__(self):
        rslt = self._x
        if rslt >= 100:
            raise StopIteration 
        self._x = self._y
        self._y += rslt
        return rslt

fibo = Fibo()
    
for elt in fibo: 
	print(elt, end = ' ') 

실행 결과

1 1 2 3 5 8 13 21 34 55 89

3.2.2 제너레이터(generator) 사용

def gen_odd(input = 1):
    if input%2 == 0:
        input = 1
        
    while True:
        yield input
        input += 2
        
go = gen_odd(3)
for _ in range(10): 
	print(next(go), end = ' ')

실행 결과

3 5 7 9 11 13 15 17 19 21

4. all(), any()

  • all(): 모든 항목이 참이면 True
  • any(): 한 개의 항목이라도 참인 경우 True
invitations = ['Kim', 'Lee', 'Park', 'Choi'] #참석자 그룹
persons = [1, 3, 0, 6] #동반자 포함 참석자 수
print('총 참석 인원:', sum(persons))
print('파티에 한 사람이라도 오는가?', any(persons))
print('초대한 그룹이 모두 오는가?', all(persons))
print('가장 많이 오는 그룹의 인원 수:', max(persons))

실행 결과

총 참석 인원: 10
파티에 한 사람이라도 오는가? True
초대한 그룹이 모두 오는가? False
가장 많이 오는 그룹의 인원 수: 6
profile
코린이의 취준 자취 기록장

0개의 댓글