반응형
Index
Iterator, Container ⊂ Iterable
Iterable, Iterator, Conatiner 객체간에 어떠한 차이가 있는지, 정확하게 이해해보고 구분해보자.
Conatiner 에 해당하는 다양한 객체 (list,tuple,str,set,dict 등) 들의 차이점과 특징에 대해 이해해보자.
# Iterable 객체란?
- 한 번에 하나의 값을 반환할 수 있는, 반복가능한 object(객체)
- list,dict,tuple 과 같은 Container 도 Iterable 의 종류 중 하나이다
- 자체적으로 __iter__ 메소드를 가지고 있어, iter()로 전달될 때 Iterator 객체를 생성한다.
- for문을 통해 반복할 수 있으면 Iterable 이다.
# Iterator 객체란?
- 순서대로 다음값을 꺼낼 수 있는 객체
- 자체적으로 __next__ 메소드를 가지고 있어, 이를통해 다음 값을 가져올 수 있음
※ __next__ 메소드로 다음 값을 반환할 수 있으면 Iterator, 없으면 Iterable 객체로 iter()를 통해 iterator 로 만들 수 있음
a = [1,2,3]
print(a, type(a)) # a 는 list 이고, iterable 이다.
a = iter(a)
print(a, type(a)) # a 는 iter를 통해 list_iterator 가 되었다.
print(a.__next__()) # iterator 이기때문에 next 메서드 실행가능, 1출력
print(next(a)) # 다음과 같은 방식으로도 출력가능, 2출력
print(a.__next__()) # 3출력
print(a.__next__()) # StopIteration 출력
map 함수는 iterator 이기때문에 next 메서드 사용이 가능하다.
a = [1,2,3]
m = map(int,a)
print(m.__next__())
iterator 타입은 한번 item 을 꺼내쓰고 나면 item 이 소진된다.
t = map(int, [1,2,3,4,5])
print(sum(t)) # 15
print(sum(t)) # 0 소진됨
# Containter
- list, set, dictionary, str 과 같이 개별 item 을 저장하는 저장소 역할
- str,tuple, list 는 index로 접근하고 , dict 는 key값으로 접근, set 는 개별접근 불가능 (순서가 없기때문)
- iterable 타입은 모두 Unpack 이 가능하다. iterable 변수에 *붙여서 함수에 전달하면 item 들이 모두 unpack되어나옴
t1,t2,t3 = (1,2,3)
s1,s2,s3 = {1,2,3} #단, set 의 경우 저장되는 순서는 알 수 없다.
# dict 의 경우 unpack 의 대상을 지정해줘야한다.
k1,k2,k3 = {'a':1, 'b':2, 'c':3}.keys()
v1,v2,v3 = {'a':1, 'b':2, 'c':3}.values()
i1,i2,i3 = {'a':1, 'b':2, 'c':3}.items()
print(t1,s1,k1,v1,i1)
#부분 언팩도 가능함
t = (1,2,3,4,5,6,7)
a,b,*c,d,e = t
print(a,b,c,d,e) #결과 : 1,2,[3,4,5],6,7
print(*t) #결과 : 1 2 3 4 5 6 7
- Iterable 안에 Item 존재 여부를 판단하는 연산
t = ([1,2,3,1],{1,2},(1,2,3))
print(1 in t, {1,2} in t, (1,2,3) not in t)
몇가지 주요한 Container 에 대해서 알아보자 !!
## 리스트 [ list]
- 순서가 있고, 중복이 가능하고, 수정/삭제/추가가 가능함 (mutable 하다)
- 리스트 내 삽입/수정/정렬 등 여러가지 기능들에 대한 예시
mylist = ['song','ryu','lee',10,20,30]
mylist.append('10') # 추가하기
mylist.insert(3,'park') # 특정위치에 삽입하기
mylist.pop() # 뒤에서부터 하나 빼기
print(mylist.index('park')) # 리스트 내 위치찾기
print(mylist.count(10))
mylist2 = [3,1,2,5,6,2,4]
mylist2.sort() # 오름차순 정렬
mylist2.reverse() # 내림차순 정렬
mylist2.clear() # 초기화 (아이템 모두 삭제)
mylist.extend(mylist2) # 리스트 확장 (연결)
## 튜플 (tuple)
- 리스트처럼 순서도 있고 중복도 가능함, 다만 수정/삭제/추가가 안됨 (immutable 하다)
- 속도가 빠르고 binary 로 저장된다.
※ Slicing
Sequence type (tuple,str,list 등) 에서는 slicing 연산을 사용 할 수 있다.
Sequence[start: stop: step] 으로 사용한다.
# slicing a list
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(my_list[1:7:2]) # prints [2, 4, 6, 8]
# using negative indices to slice
my_tuple = (1, 2, 3, 4, 5)
print(my_tuple[-3:]) # prints (3, 4, 5)
# stepping backwards to reverse a sequence
my_list = [1, 2, 3, 4, 5]
print(my_list[::-1]) # prints [5, 4, 3, 2, 1]
# Slicing 은 아니지만.. Sequence 에서 특정 항목 제거하려면
del s[m]
del s[m:n:k]
del s[:] = s.clear()
## 집합 {set}
- 순서도 없고, 중복도 없다. 수정/삭제/추가가 가능함 (mutable 하다)
- 집합의 삽입/수정/정렬 등 여러가지 기능들에 대한 예시
myset = {'song','kim','lee'}
myset.add("park") #item 추가
myset.remove('song') #item 삭제
myset2 = {'kim','lee','hwang','sung'}
print(myset&myset2) # 교집합
print(myset.intersection(myset2))
print(myset|myset2) #합집합
print(myset.union(myset2))
print(myset2-myset) #차집합
print(myset2.difference(myset))
## 딕셔너리 {key:value}
- Key:Value 값으로 구성되어있음. 수정/삭제/추가가 가능함 (mutable 하다)
- 딕셔너리의 삽입/수정/정렬 등 여러가지 기능들에 대한 예시
# dict 를 정의하는 두가지 방식. 후자는 key에 '' 안써도되서 편함
mydict = {'name':'Song', 'Age':29, 'color':('red','black')}
mydict2 = dict( name='Song', Age=29, color=('red','black'))
print(mydict['name'])
print(mydict.get('name')) # [key] 와의 차이는, get을 쓰면 없는 key 반환요청 시 None 반환
print(mydict.get('address', '빈주소')) # 없는 key를 반환요청할때 None 대신 if error 역할
print('name' in mydict) # key 여부 확인
mydict['address'] = {'강남,분당,구미'} # key 추가/수정
del mydict['Age'] # 삭제
# key, value 출력 방식
print(mydict.keys(), mydict.values(), mydict.items())
딕셔너리 for 문에서 .item 활용방법
for key,value in mydict.items():
print(key,str(value), sep=" :")
- JSON 과 딕셔너리 의 변환 (둘다 Key:Value 형식으로 서로 변환이 가능함)
## range 함수
- range 는 container 는 아니다. 규칙적인 연속값 만들떄는 tuple, list 보다 메모리 절감측면에서 유리하다.
- range(start,stop,step) 으로 input값이 구성되어있음
a = range(0,10,2)
print(a) # 결과값 : range(0, 10, 2)
print(*a) # 결과값 : 0 2 4 6 8
반응형
'Study > Python' 카테고리의 다른 글
[기초문법] 사용자 정의 함수 , lambda 함수 (1) | 2023.02.28 |
---|---|
[기초문법] Class, Object(Instance), Method 이해 (1) | 2023.02.27 |
[기초문법] Python 주요 내장함수(Built-in 함수) (1) | 2023.02.25 |
[기초문법] 입력함수(Input) & split/map 함수 (1) | 2023.02.23 |
[기초문법] 자료형,연산자,출력 (1) | 2023.02.22 |
댓글