제4장: 파이톤 - 고급 프로그래밍 - 사용자 정의 시퀀스 클래스
Python3 고급 핵심 기술 97 강의 노트
카탈로그
4.1 Python의 시퀀스 분류
4.1.1 컨테이너 시퀀스
"""
list tuple deque
"""
4.1.2 편평한 서열
"""
str bytes bytearray array.array
array list ,array
。
"""
4.1.3 가변 시퀀스
"""
list deque bytearry array
"""
4.1.4 변경 불가
"""
str tuple bytes
"""
4.2 Python의 시퀀스 유형 abc 상속 관계
"""
, Python ,
collection.abc
"""
"""
__setitem__
__delitem__
"""
__all__ = ["Awaitable", "Coroutine",
"AsyncIterable", "AsyncIterator", "AsyncGenerator",
"Hashable", "Iterable", "Iterator", "Generator", "Reversible",
"Sized", "Container", "Callable", "Collection",
"Set", "MutableSet",
"Mapping", "MutableMapping",
"MappingView", "KeysView", "ItemsView", "ValuesView",
"Sequence", "MutableSequence",
"ByteString",
]
class Collection(Sized, Iterable, Container):
__slots__ = ()
@classmethod
def __subclasshook__(cls, C):
if cls is Collection:
return _check_methods(C, "__len__", "__iter__", "__contains__")
return NotImplemented
class Reversible(Iterable):
__slots__ = ()
@abstractmethod
def __reversed__(self):
while False:
yield None
@classmethod
def __subclasshook__(cls, C):
if cls is Reversible:
return _check_methods(C, "__reversed__", "__iter__")
return NotImplemented
class Sequence(Reversible, Collection):
"""All the operations on a read-only sequence.
Concrete subclasses must override __new__ or __init__,
__getitem__, and __len__.
"""
__slots__ = ()
@abstractmethod
def __getitem__(self, index):
raise IndexError
def __iter__(self):
i = 0
try:
while True:
v = self[i]
yield v
i += 1
except IndexError:
return
def __contains__(self, value):
for v in self:
if v is value or v == value:
return True
return False
def __reversed__(self):
for i in reversed(range(len(self))):
yield self[i]
def index(self, value, start=0, stop=None):
'''S.index(value, [start, [stop]]) -> integer -- return first index of value.
Raises ValueError if the value is not present.
Supporting start and stop arguments is optional, but
recommended.
'''
if start is not None and start < 0:
start = max(len(self) + start, 0)
if stop is not None and stop < 0:
stop += len(self)
i = start
while stop is None or i < stop:
try:
v = self[i]
if v is value or v == value:
return i
except IndexError:
break
i += 1
raise ValueError
def count(self, value):
'S.count(value) -> integer -- return number of occurrences of value'
return sum(1 for v in self if v is value or v == value)
class MutableSequence(Sequence):
__slots__ = ()
"""All the operations on a read-write sequence.
Concrete subclasses must provide __new__ or __init__,
__getitem__, __setitem__, __delitem__, __len__, and insert().
"""
@abstractmethod
def __setitem__(self, index, value):
raise IndexError
@abstractmethod
def __delitem__(self, index):
raise IndexError
@abstractmethod
def insert(self, index, value):
'S.insert(index, value) -- insert value before index'
raise IndexError
def append(self, value):
'S.append(value) -- append value to the end of the sequence'
self.insert(len(self), value)
def clear(self):
'S.clear() -> None -- remove all items from S'
try:
while True:
self.pop()
except IndexError:
pass
def reverse(self):
'S.reverse() -- reverse *IN PLACE*'
n = len(self)
for i in range(n//2):
self[i], self[n-i-1] = self[n-i-1], self[i]
def extend(self, values):
'S.extend(iterable) -- extend sequence by appending elements from the iterable'
for v in values:
self.append(v)
def pop(self, index=-1):
'''S.pop([index]) -> item -- remove and return item at index (default last).
Raise IndexError if list is empty or index is out of range.
'''
v = self[index]
del self[index]
return v
def remove(self, value):
'''S.remove(value) -- remove first occurrence of value.
Raise ValueError if the value is not present.
'''
del self[self.index(value)]
def __iadd__(self, values):
self.extend(values)
return self
4.3list에서 extend 방법의 차이
a = [1, 2]
c = a + [3, 4]
print(c)
a += [3, 4]
print(a)
a += (5, 6) #
print(a)
c = a + (7, 8) #
"""
,
+= ,Python
__iadd__
,
+= list extend 。
"""
"""
append extend
append 。extend
。
"""
4.4 슬라이싱 가능한 객체 구현
# [start:end:step]
"""
, start , 0;
end ( ) ( );
step ( 1)。
start 0 , end ,
step 1 , 。
, step , , start end 。
"""
aList = [3, 4, 5, 6, 7, 9, 11, 13, 15, 17]
print (aList[::]) #
print (aList[::-1]) #
print (aList[::2]) # ,
print (aList[1::2]) # ,
print (aList[3:6]) #
aList[0:100] # ,
aList[100:] # ,
aList[len(aList):] = [9] #
aList[:0] = [1, 2] #
aList[3:3] = [4] #
aList[:3] = [1, 2] # ,
aList[3:] = [4, 5, 6] #
aList[::2] = [0] * 3 #
print (aList)
aList[::2] = ['a', 'b', 'c'] #
aList[::2] = [1,2] # ,
aList[:3] = [] # 3
del aList[:3] #
del aList[::2] # ,
"""
"""
import numbers
class Group:
#
def __init__(self, group_name, company_name, staffs):
self.group_name = group_name
self.company_name = company_name
self.staffs = staffs
def __reversed__(self):
self.staffs.reverse()
def __getitem__(self, item):
cls = type(self)
if isinstance(item, slice):
return cls(group_name=self.group_name, company_name=self.company_name, staffs=self.staffs[item])
elif isinstance(item, numbers.Integral):
return cls(group_name=self.group_name, company_name=self.company_name, staffs=[self.staffs[item]])
def __len__(self):
return len(self.staffs)
def __iter__(self):
return iter(self.staffs)
def __contains__(self, item):
if item in self.staffs:
return True
else:
return False
staffs = ["bobby1", "imooc", "bobby2", "bobby3"]
group = Group(company_name="imooc", group_name="user", staffs=staffs)
reversed(group)
for user in group:
print(user)
4.5 우리가 목록을 사용하지 말아야 할 때
# array, deque
#
import array
# array list ,array
my_array = array.array("i")
my_array.append(1)
my_array.append("abc")
4.6 목록 유도식, 생성기 표현식, 사전 유도식
# ( )
# 1-20
odd_list = []
for i in range(21):
if i%2 == 1:
odd_list.append(i)
odd_list = [i for i in range(21) if i%2 == 1]
#
def handle_item(item):
return item * item
odd_list = [handle_item(i) for i in range(21) if i%2 == 1]
#
#
odd_gen = (i for i in range(21) if i%2 == 1)
print(type(odd_list))
#
my_dict = {"bobby1":22, "bobby2":23, "imooc.com":5}
reversed_dict = {value:key for key, value in my_dict.items()}
#
my_set = {key for key, value in my_dict.items()}
print(type(my_set))
my_set = set(my_dict.keys()) #
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.