제4장: 파이톤 - 고급 프로그래밍 - 사용자 정의 시퀀스 클래스

9464 단어
제4장: 파이톤 - 고급 프로그래밍 - 사용자 정의 시퀀스 클래스
Python3 고급 핵심 기술 97 강의 노트
카탈로그
  • 제4장: 파이톤 - 고급 프로그래밍 - 사용자 정의 시퀀스 클래스
  • 4.1 Python의 시퀀스 분류
  • 4.1.1 용기 서열
  • 4.1.2 편평 서열
  • 4.1.3 가변 시퀀스
  • 4.1.4 변경 불가
  • 4.2 Python의 시퀀스 유형 abc 상속 관계
  • 4.3list에서 extend 방법의 차이
  • 4.4 슬라이스 가능 개체
  • 4.5 언제 우리가 목록을 사용하지 말았어야 했는가
  • 4.6 목록 유도식, 생성기 표현식, 사전 유도식

  • 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())  #     
    

    좋은 웹페이지 즐겨찾기