2022/01/05/WED
- 예제1
a=11
if a<5:
print('a=....1,2,3,4')
elif a>10:
print('a=11,12,13,....')
else:
print('a=5,6,7,...,10')
- 예제2
a,b=2,3
if a==b:
print('a=b')
else:
if a<b:
print('a<b')
else:
print('a>b')
- 예제3
a=2
if a==1:
print('a=1')
2이면 뭐 하라고 한 적 없으니까 그냥 아무것도 실행하지 않음
- 예제1-리스트!
for i in [1,2,3,4]:
print(i)
i
i는 4로 저장되고 종료
- 예제2- 튜플!
for i in (1,2,3,4):
print(i)
- 예제3-스트링!
for i in '1234':
print(i)
- 의문
for i in ???:
print(i)
에서 물음표 자리에 올 수 있는 것이 무엇일까?
- 예제4
a=5
for i in a:
print(i)
이렇게 입력하면 에러 발생
5라고 출력될 줄 알았는데 아니었다.
무슨 차이인가?
1차원 이상의 자료에서 for문 정의가 가능하다
- 예제5
L=[[1,2,3],[3,4,5]]
for i in L:
print(i)
import pandas as pd
df=pd.DataFrame(L)
df
for i in df:
print(i)
column명 불러오는 건가?
import numpy as np
ndr=np.array(L)
ndr
for i in ndr:
print(i)
i
for i in ???:
print(i)
??? 자리에 올 수 있는 것은 dir()하여 __iter__()라는 메서드가 있는 object이다.
이러한 오브젝트를 iterable한 object라 한다
a=1
dir(a)
예상대로 int클래스의 인스턴스는 __iter__()가 없다.
- 위에서 정의한 L(list), df, ndr(ndarray) 는 모두 __iter__() 함수가 있다. 따라서 iterable한 오브젝트이다.
iterable한 오브젝트는 iterator로 만들 수 있는 특징이 있다.
iterable한 오브젝트를 어떻게 iterator로 만드는가?
df
dfiter1=df.__iter__()
dfiter2=iter(df)
dfiter1?
- dfiter1은 generator라는 클래스에서 만들어진 인스턴스 오브젝트이다.
dir(dfiter1)
dfiter1.__next__()
next 메소드? 카운트 느낌!, BUT 영구적인 것은 아니고 STOP하게 됨
– for 문의 작동원리
for i in L:
print(i)
(1) iter함수를 사용해서 L이라는 오브젝트를 iterator로 만든다. L이라는 오브젝트가 이터러블하기 때문에 가능
(2) iterator에서 .__next__()함수를 호출하고 결과를 i에 저장한뒤에 for문 블락안에 있는 내용(들여쓰기 된 내용)을 실행한다.
(3) StopIteration 에러가 발생하면 for 문을 멈춘다.
이런 원리로 for문이 돌아가는 듯!
Liter=iter(L)
Liter.__next__()
123나오고 345 나오고 STOP
ndriter=iter(ndr)
print(ndriter.__next__())
- for문의 정석은 아래와 같이 range()를 사용하는 것이다.
for i in range(5):
print(i)
in 다음애는 iterable만 가능
- range(5)의 정체는 그냥 iterable object이다.
a=range(5)
- 그래서 언제든지 iterator로 바꿀 수 있다.
aiter=iter(a)
aiter.__next__()
0~4까지 출력 후 error 출력
for i in zip([1,2,3],'abc'):
print(i)
zip([1,2,3],'abc')
어차피 for i in ????: ????의 자리는 iterable object 자리이다.
z=zip([1,2,3],'abc')
dir(z)
- __next__()함수가 있음 $\to$ z자체가 iterator였다. (iterable object 이면서)
z.__next__()
첫번째, 두번째, 세번째 그리고 마지막엔 에러
for i in ???:
print(i)
- ??? 자리에 iterator 자체가와도 무방한 듯!!!
- 확인
L=iter([1,2,3,4])
for i in L:
print(i)
i