본문 바로가기
코딩 연습/코딩배우기

[python] 리스트 컴프리헨션(List Comprehension) & 이터러블(iterable) 객체

by good4me 2020. 8. 21.

goodthings4me.tistory.com

 

■ 리스트 컴프리헨션(List Comprehension)

- 리스트 내에 계산식, for 문, if 문 등을 삽입하여 리스트를 생성하는 것

- 이 표현식은 list, set, dict과 같은 자료형, 그리고 소괄호를 이용한 generator 객체 생성에도 이용 가능함

# 짝수 구하기
even_num = [n for n in range(1, 11) if not n % 2]
print(even_num) # [2, 4, 6, 8, 10]

# 3의 배수 구하기
three_multi = [n for n in range(1, 11) if not n % 3]
print(three_multi) # [3, 6, 9]

# 이중 for문 (주사위 2개로 나올 수 있는 경우의 수)
dice = [str(i) + ':' + str(j) for i in range(1, 7) for j in range(1, 7)]
print(dice)

'''
['1:1', '1:2', '1:3', '1:4', '1:5', '1:6', '2:1', '2:2', '2:3', '2:4', '2:5', 
 '2:6', '3:1', '3:2', '3:3', '3:4', '3:5', '3:6', '4:1', '4:2', '4:3', '4:4', 
 '4:5', '4:6', '5:1', '5:2', '5:3', '5:4', '5:5', '5:6', '6:1', '6:2', '6:3', 
 '6:4', '6:5', '6:6']
'''

good4me.co.kr

 

■ 이터러블(iterable) 객체 활용

- iterable은 반복 가능한의 뜻으로, iterable 객체는 한 번에 하나씩 자료를 순서대로 반환(추출)할 수 있는 반복 가능한 객체(list, tuple, str, range, dict, set)를 의미한다.

- iterable 객체는 내장함수 또는 스페셜 메소드(__iter__, iter())로 생성된 객체이다. iter() 함수에 iterable 객체를 인자로 전달하면 iter 함수는 iterable 객체에 접근하는 도구인 "iterator 객체"를 생성해서 반환한다.

"iterable 객체를 대상으로 iter 함수를 호출해서 iterator 객체를 만든다."

- 값 추출은 스페셜 메소드(__next__, next())를 사용하고, 값 추출이 완료된 후 다시 추출하면  Stopiteration 예외가 발생한다.  

item = ['식빵', '쨈', '야채', '햄', '계란', '먹기', '커피']

brunch = iter(item)

print('\n*** 브런치 준비 ***\n')

try:
    print(next(brunch), '놓고')
    print(next(brunch), '바르고')
    print(next(brunch), '올리고')
    print(next(brunch), '넣고')
    print(next(brunch), '얹고')
    print('맛있게', next(brunch), '~~')
    print('그리고', next(brunch), '마시기')
    print(next(brunch)) # StopIteration 발생
except StopIteration:
    print('\n잘 먹었다!!!')
    
    
[실행 결과]
    
*** 브런치 준비 ***

식빵 놓고
쨈 바르고
야채 올리고
햄 넣고
계란 얹고
맛있게 먹기 ~~
그리고 커피 마시기

잘 먹었다!!!

 

※ 스페셜 메서드를 통해 함수 호출하는 형태

ds = [1, 2, 3]
ir = ds.__iter__()  # iter(ds) 대신 __iter__() 사용
print(ir.__next__())  # 1 # next(ir) 대신 __next__() 사용
print(ir.__next__())  # 2


# iterable 객체 확인 방법
print(hasattr(ds, '__iter__')) # True

 

[참고 자료] 윤성우의 열혈 파이썬 중급편

 

댓글