Własne wycinki w Pythonie

Python poprzez metody specjalne umożliwia traktowanie instancji klas jak listy czy też słowniki. Np.:

class A:
    def __getitem__(self, item):
        return self.__slownik[item]

Czy istnieje możliwość aby również tworzyć własne wycinki definiowane jako

slownik[1:10:2]

Czy te wartości (1,10,2) mogą zostać w jakiś sposób przechwycone? ?

2 lata, 2 miesiące temu | edytowane przez: nilphilus 25711417

  • Istnieje typ wbudowany slice. Jest on używany w następujący sposób.

    slownik[1:10:2]
    

    Zamieniane jest na:

    slownik.__getitem__(slice(1, 10, 2))
    

    Ma on trzy atrybuty: start, stop, step i metodę indices(N), która dla danego N (np. długości listy, której mają dotyczyć indeksy) zwraca trójkę nadającą się do przekazania dla range().

    Tak więc, jeśli chcesz obsługiwać wycinanie:

    class A(object): # new-style class
        def __getitem__(self, index):
            if isinstance(index, slice):
                #oblicz wycinek
            elif isinstance(index, int):
                # oblicz n-ty element
            else:
                raise TypeError # nie obsługuj indeksów innych typów, np. napisów
    

    Tak naprawdę nie ma żadnego ograniczenia na argumenty dla __getitem__. Zapis [:] to tylko skrót. Na przykład dla macierzy wielowymiarowych wygodnie jest wprowadzić zapis typu:

    M[1, 2, 9]    
    M[..., 5] # elementy w wierszu 5 w ostatnim wymiarze
    

  • Istnieje operator __getslice__.

  • Od wersji 2.6 Pythona getslice jest określony jako deprecated i raczej nie należy go stosować - istnieje tylko w celu zapewnienia zgodności wstecz w poprzednimi wersjami. W Pythonie 3 nie ma go wcale. Należy używać getitem w argumentem typu slice.

  • Witam, jak się dzisiaj czujesz? Mam nadzieję, że wszystko jest dobrze. Nazywam się na stałym poziomie. W poszukiwaniu człowieka, który rozumie znaczenie miłości, zaufania i wiary w siebie, a nie ten, kto widzi miłość jako jedyny sposób zabawy, ale dojrzały człowiek z Nicei wizję tego, co na świecie jest wszystko o, a po przeczytaniu profilu tutaj (matchperfect) I wziął interes w ciebie, więc zarzuty odpowiedź mi w tym e-mail (constantduke10@hotmail.com. Będę bardzo szczęśliwy, aby przeczytać odpowiedzi tak, że ja wysłać moje zdjęcie dla Ciebie możemy wówczas zacząć wiedzieć więcej o sobie nawzajem. Dziękuję za przeczytanie mojego maila i być Bless.

    stałej (constantduke10@hotmail.com))

    Hello, how are you doing today? i hope all is well. My name is constant., In search of a man who understand the meaning of love as Trust and faith in each other rather than one who sees love as the only way of fun, but a matured Man with Nice Vision of what the world is all about, and after reading your profile here in(matchperfect ) I took Interest in you, so pleas reply me with this Email (constantduke10@hotmail.com. i will be very happy to read your reply so that i will send my picture to you then we can start know more about each other. Thanks for reading my mail and be Bless.

    constant (constantduke10@hotmail.com))

Zaloguj się, aby dodać swoją odpowiedź