[Python] 파이썬 Comprehension

cdwde·2021년 5월 7일
0

🎈 Comprehension이란?

iterable한 객체를 생성하기 위한 방법 중 하나로 파이썬에서 사용할 수 있는 기능

❗ iterable, iterator

iterable이란?

  • member를 하나씩 차례로 반환 가능한 객체
  • list, str, tuple ...

iterator란?

  • next() 메소드로 데이터를 순차적으로 호출 가능한 객체
  • next()로 다음 데이터를 불러 올 수 없는 경우 (가장 마지막 데이터) StopIteration exception 발생

iterable한 객체는 iterator인가? => X

  • list는 iterable이지만 next() 메소드로 호출해도 동작하지 않음
  • iterable을 iterator로 변환하고 싶으면 iter() 사용하기
  • for문으로 list를 돌릴 때 순차적 접근이 가능한데 이는 for문으로 looping 하는 동안 파이썬 내부에서 임시로 list를 iterator로 자동 변환 해줬기 때문

🎈 List Comprehension

[출력표현식 for 요소 in 입력Sequnce [if 조건식]]

  • 예제 1 (조건문 사용)
    반복문의 인자가 조건문에 해당하는지 확인 후 인자를 리스트의 요소로 가짐
ol = [1, 2, 'A', 3, True]
nl = [i*i for i in ol if type(i) == int]
print(nl)

#출력 결과
#[1, 4, 9]
  • 예제 2 (두 개의 for문)
    앞의 for문에서 하나의 요소에 대해 뒤의 for문 적용
nums = [1, 2, 3]
alp = ['A', 'B']
l = [(n, a) for n in nums for a in alp]
print(l)


#위와 결과 동일
ll = []
for n in nums:
    for a in alp:
        ll.append((n, a))
print(ll)

#출력 결과
#[(1, 'A'), (1, 'B'), (2, 'A'), (2, 'B'), (3, 'A'), (3, 'B')]
#[(1, 'A'), (1, 'B'), (2, 'A'), (2, 'B'), (3, 'A'), (3, 'B')]
  • 예제 3 (두 개의 for문)
matrix = [
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9, 10, 11, 12],
]
f = [e for r in matrix for e in r]
print(f)

#위와 결과 동일
ff = []
for r in matrix:
    for e in r:
        ff.append(e)

print(ff)


#출력 결과
#[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
#[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
  • 예제 4(조건문에서 else 사용)
l = ['even' if i%2 ==0 else 'odd' for i in range(1, 11)]
print(l)

#출력 결과
#['odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even']

🎈 Set Comprehension

set은 중복을 허용하지 않기 때문에 하나 제외하고 중복 데이터는 제거, 순서 보장 X
{출력표현식 for 요소 in 입력Sequnce [if 조건식]}

  • 예제
ol = [1, 1, 2, 2, 3, 4]
nl = {i*i for i in ol}
print(nl)

#출력 결과
#{16, 1, 4, 9}

🎈 Dict Comprehension

{key:value for 요소 in 입력Sequence [if 조건식]}

od = {1: 'one', 2: 'two', 3:'three'}
nd = {value:key for key, value in od.items()}
print(nd)

#출력 결과
#{'one': 1, 'two': 2, 'three': 3}

🎈 Generator Expression

Comprehension 구문을 사용해 소괄호로 묶어주면 자동적으로 파이썬에서 generator expression으로 인식해서 generator 객체 생성함

(출력표현식 for 요소 in 입력Sequnce [if 조건식])

❗ generator란? [Python] 제네레이터 (generator)

  • iterator를 생성해주는 함수
  • 함수 안에 yield 사용해 생성 -> 생성한 generator는 iterable한 객체
  • 모든 generator는 iterator
def test_generator():
    yield 1
    yield 2
    yield 3

gen = test_generator()

print(next(gen))
print(next(gen))
print(next(gen))
#print(next(gen))    #에러

#출력 결과
#1
#2
#3
  • 예제
gen = (x**2 for x in range(5))
print(gen)
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))

#출력 결과
#<generator object <genexpr> at 0x009A5798>
#0
#1
#4
#9
#16

참고
https://wikidocs.net/16069
http://pythonstudy.xyz/python/article/22-Python-Comprehension
https://bluese05.tistory.com/55
https://mingrammer.com/introduce-comprehension-of-python/
https://doorbw.tistory.com/174

0개의 댓글