이터러블 객체란 무엇인가?

Python으로 코딩 인터뷰 문제 연습하기

Kirill Smirnov

Data Science Consultant, Altran

정의

이터러블 객체 / Iterables - for 루프에서 사용할 수 있는 모든 객체

  • list
  • tuple
  • set
  • dictionary
  • string
Python으로 코딩 인터뷰 문제 연습하기

리스트 또는 튜플 순회

list:

droids = ['R2-D2', 'TC-16', 'C-3PO']

for droid in droids:
    print(droid)
R2-D2
TC-16
C-3PO

tuple:

droids = ('R2-D2', 'TC-16', 'C-3PO')

for droid in droids:
    print(droid)
R2-D2
TC-16
C-3PO
Python으로 코딩 인터뷰 문제 연습하기

집합 순회

battleships = {'X-Wing Fighter', 'Millennium Falcon', 'TIE Fighter'}

for battleship in battleships:
    print(battleship)
TIE Fighter
X-Wing Fighter
Millennium Falcon
Python으로 코딩 인터뷰 문제 연습하기

문자열 순회

title = 'Star Wars'

for char in title:
    print(char)
S
t
a
r

W
a
r
s
Python으로 코딩 인터뷰 문제 연습하기

딕셔너리 순회

episodes = {
    'Episode I': 'The Phantom Menace',
    'Episode II': 'Attack of the Clones',
    'Episode III': 'Revenge of the Sith', 
    'Episode IV': 'A New Hope',
    'Episode V': 'The Empire Strikes Back',
    'Episode VI': 'Return of the Jedi'
}
for episode in episodes:
    print(episode)
Episode I
Episode II
Episode III
Episode IV
Episode V
Episode VI
Python으로 코딩 인터뷰 문제 연습하기

키-값 쌍 가져오기

episodes = {
    'Episode I': 'The Phantom Menace',
    'Episode II': 'Attack of the Clones',
    'Episode III': 'Revenge of the Sith', 
    'Episode IV': 'A New Hope',
    'Episode V': 'The Empire Strikes Back',
    'Episode VI': 'Return of the Jedi'
}
for item in episodes.items():
    print(item)
('Episode I', 'The Phantom Menace')
('Episode II', 'Attack of the Clones')
('Episode III', 'Revenge of the Sith')
('Episode IV', 'A New Hope')
('Episode V', 'The Empire Strikes Back')
('Episode VI', 'Return of the Jedi')
Python으로 코딩 인터뷰 문제 연습하기

키-값 쌍 가져오기

episodes = {
    'Episode I': 'The Phantom Menace',
    'Episode II': 'Attack of the Clones',
    'Episode III': 'Revenge of the Sith', 
    'Episode IV': 'A New Hope',
    'Episode V': 'The Empire Strikes Back',
    'Episode VI': 'Return of the Jedi'
}
for title, subtitle in episodes.items():
    print(title + ': ' + subtitle)
'Episode I': 'The Phantom Menace'
'Episode II': 'Attack of the Clones'
'Episode III': 'Revenge of the Sith'
'Episode IV': 'A New Hope'
'Episode V': 'The Empire Strikes Back'
'Episode VI': 'Return of the Jedi'
Python으로 코딩 인터뷰 문제 연습하기

비시각적 객체: range

interval = range(0, 10)

print(interval)
range(0, 10)
for num in interval:
    print(num)
0
1
2
...
9
Python으로 코딩 인터뷰 문제 연습하기

비시각적 객체: enumerate

villains = ['Darth Maul', 'Palpatine', 'Darth Vader']
enum_villains = enumerate(villains)
for item in enum_villains:
    print(item)
(0, 'Darth Maul')
(1, 'Palpatine')
(2, 'Darth Vader')
Python으로 코딩 인터뷰 문제 연습하기

비시각적 객체: enumerate

villains = ['Darth Maul', 'Palpatine', 'Darth Vader']
enum_villains = enumerate(villains)
for idx, name in enum_villains:
    print(str(idx) + ' - ' + name)
0 - Darth Maul
1 - Palpatine
2 - Darth Vader
Python으로 코딩 인터뷰 문제 연습하기

인수로서의 이터러블

list(), tuple(), set(), _등_

villains = [
    'Darth Maul',
    'Palpatine',
    'Darth Vader'
]
list(enumerate(villains))
[
    (0, 'Darth Maul'),
    (1, 'Palpatine'),
    (2, 'Darth Vader')
]
Python으로 코딩 인터뷰 문제 연습하기

인수로서의 이터러블

list(), tuple(), set(), _등_

villains = [
    'Darth Maul',
    'Palpatine',
    'Darth Vader'
]
list(enumerate(villains))
[
    (0, 'Darth Maul'),
    ...
set(enumerate(villains))
{
    (0, 'Darth Maul'),
    (1, 'Palpatine'),
    (2, 'Darth Vader')
}
Python으로 코딩 인터뷰 문제 연습하기

이터러블 여부 확인 방법

interval = range(0, 5)
interval_iter = iter(interval)
print(interval_iter)
<range_iterator object at 0x7f3bdf8ad300>

이터레이터 - 이터러블에서 요소를 하나씩 순차적으로 가져오는 방법을 아는 객체

next(interval_iter)
0
next(interval_iter)
1
next(interval_iter)
2
Python으로 코딩 인터뷰 문제 연습하기

StopIteration

next(interval_iter)
3
next(interval_iter)
4
next(interval_iter)
StopIteration
Python으로 코딩 인터뷰 문제 연습하기

for 루프 설명

droids = ['R2-D2', 'TC-16', 'C-3PO']

for droid in droids:
    print(droid)
R2-D2
TC-16
C-3PO
iter_droids = iter(droids)

while True: try: except StopIteration: break
Python으로 코딩 인터뷰 문제 연습하기

for 루프 설명

droids = ['R2-D2', 'TC-16', 'C-3PO']

for droid in droids:
    print(droid)
R2-D2
TC-16
C-3PO
iter_droids = iter(droids)

while True: try: droid = next(iter_droid) print(droid) except StopIteration: break
R2-D2
TC-16
C-3PO
Python으로 코딩 인터뷰 문제 연습하기

이터레이터이기도 한 이터러블

  • iter()
  • next()

_예:_ enumerate, finditer _등_

import re
pattern = re.compile(r'[\w\.]+@[a-z]+\.[a-z]+')

text = '[email protected] is the e-mail of John. He often writes to his boss '\
'at [email protected]. But the messages get forwarded to his secretary at [email protected].'

result = re.finditer(pattern, text)
Python으로 코딩 인터뷰 문제 연습하기

iter() 또는 next()

iter()

result = re.finditer(pattern, text)

for item in result:
    print(item)
<_sre.SRE_Match object; span=(0, 22), match='[email protected]'>
<_sre.SRE_Match object; span=(77, 93), match='[email protected]'>
<_sre.SRE_Match object; span=(146, 162), match='[email protected]'>
Python으로 코딩 인터뷰 문제 연습하기

iter() 또는 next()

next()

result = re.finditer(pattern, text)
next(result)
<_sre.SRE_Match object; span=(0, 22),
match='[email protected]'>
next(result)
<_sre.SRE_Match object; span=(77, 93),
match='[email protected]'>
next(result)
<_sre.SRE_Match object; span=(146, 162),
match='[email protected]'>
Python으로 코딩 인터뷰 문제 연습하기

소모성 이터러블

result = re.finditer(pattern, text)
for item in result:
    print(item)
<_sre.SRE_Match object; ...
<_sre.SRE_Match object; ...
<_sre.SRE_Match object; ...
for item in result:
    print(item)
# nothing
short_list = [2, 4]
for item in short_list:
    print(item)
2
4
for item in short_list:
    print(item)
2
4
Python으로 코딩 인터뷰 문제 연습하기

DataFrame 순회

pars = {'weight': [168, 183, 198], 'height': [77, 79, 135]}
characters = pd.DataFrame(pars, index=['Luke Skywalker', 'Han Solo', 'Darth Vader'])
print(characters)
                weight  height
Luke Skywalker     168      77
Han Solo           183      79
Darth Vader        198     135
Python으로 코딩 인터뷰 문제 연습하기

직접 접근 방식

for item in characters:
    print(item)
weight
height
Python으로 코딩 인터뷰 문제 연습하기

.iterrows()

result = characters.iterrows()
print(result)
<generator object DataFrame.iterrows at 0x7f5dff6b9c50>
Python으로 코딩 인터뷰 문제 연습하기

.iterrows()

result = characters.iterrows()
for item in result:
    print(item)

item $\rightarrow$ (index name, Series)

('Luke Skywalker',
weight    168
height     77
Name: Luke Skywalker, dtype: int64)
('Han Solo',
weight    183
height     79
Name: Han Solo, dtype: int64)
('Darth Vader',
weight    198
height    135
Name: Darth Vader, dtype: int64)
Python으로 코딩 인터뷰 문제 연습하기

.iterrows()

result = characters.iterrows()
for index, series in result:
    print(index)
    print(series)
Luke Skywalker
weight    168
height     77
Name: Luke Skywalker, dtype: int64)
Han Solo
weight    183
height     79
Name: Han Solo, dtype: int64)
Darth Vader
weight    198
height    135
Name: Darth Vader, dtype: int64)
Python으로 코딩 인터뷰 문제 연습하기

.iteritems()

result = characters.iteritems()
print(result)
<generator object DataFrame.iteritems at 0x7f5dff69f938>
Python으로 코딩 인터뷰 문제 연습하기

.iteritems()

result = characters.iteritems()
for item in result:
    print(item)

item $\rightarrow$ (column name, Series)

('weight',
Luke Skywalker    168
Han Solo          183
Darth Vader       198
Name: weight, dtype: int64)
('height',
Luke Skywalker     77
Han Solo           79
Darth Vader       135
Name: height, dtype: int64)
Python으로 코딩 인터뷰 문제 연습하기

.iteritems()

result = characters.iteritems()
for name, series in result:
    print(name)
    print(series)
weight
Luke Skywalker    168
Han Solo          183
Darth Vader       198
Name: weight, dtype: int64
height
Luke Skywalker     77
Han Solo           79
Darth Vader       135
Name: height, dtype: int64
Python으로 코딩 인터뷰 문제 연습하기

Lass uns üben!

Python으로 코딩 인터뷰 문제 연습하기

Preparing Video For Download...