Conteneur personnalisé (Conteneur)

Après l'introduction du chapitre précédent, nous savons qu'en Python, les types de conteneurs courants sont : dict, tuple, list, string. Les notions de conteneurs conteneurisés et immuables sont également évoquées. Parmi eux, tuple et string sont des conteneurs immuables, et dict et list sont des conteneurs mutables. La différence entre un conteneur mutable et un conteneur immuable est qu'une fois qu'une valeur est attribuée à un conteneur immuable, un élément qu'il contient ne peut pas être modifié. Bien sûr, pour une introduction détaillée, vous pouvez relire l’article précédent, qui contient des images et des textes.

Voici donc d’abord une question : ces structures de données sont-elles suffisantes pour que nous puissions les développer et les utiliser ? Que devons-nous faire lorsque cela ne suffit pas ou lorsqu’il existe des besoins particuliers qui ne peuvent être satisfaits uniquement avec ces conteneurs de base ?

En ce moment, nous devons personnaliser le conteneur, alors comment devons-nous procéder ?

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
class FunctionalList:
    ''' 实现了内置类型list的功能,并丰富了一些其他方法: head, tail, init, last, drop, take'''
    def __init__(self, values=None):
        if values is None:
            self.values = []
        else:
            self.values = values
    def __len__(self):
        return len(self.values)
    def __getitem__(self, key):
        return self.values[key]
    def __setitem__(self, key, value):
        self.values[key] = value
    def __delitem__(self, key):
        del self.values[key]
    def __iter__(self):
        return iter(self.values)
    def __reversed__(self):
        return FunctionalList(reversed(self.values))
    def append(self, value):
        self.values.append(value)
    def head(self):
        # 获取第一个元素
        return self.values[0]
    def tail(self):
        # 获取第一个元素之后的所有元素
        return self.values[1:]
    def init(self):
        # 获取最后一个元素之前的所有元素
        return self.values[:-1]
    def last(self):
        # 获取最后一个元素
        return self.values[-1]
    def drop(self, n):
        # 获取所有元素,除了前N个
        return self.values[n:]
    def take(self, n):
        # 获取前N个元素
        return self.values[:n]
Formation continue
  • Recommandations de cours
  • Téléchargement du didacticiel
Fonction Description
Type de conteneur immuable personnalisé Besoin de définir les méthodes __len__ et __getitem__
Conteneur de type mutable personnalisé Ajouté sur la base du type de conteneur immuable Définir __setitem__ et __delitem__
Le type de données personnalisé doit être itéréBesoin de définir __iter__
Renvoyer la longueur du conteneur personnaliséBesoin d'implémenter __len__(self)
Les conteneurs personnalisés peuvent appeler self[key If]. le type de clé est incorrect, une TypeError sera générée. Si la valeur correspondant à la clé ne peut pas être renvoyée, la méthode doit générer une ValueError Besoin d'implémenter __getitem__(self, key)
Lors de l'exécution de la clé self[. ] = valueLa méthode appelée est __setitem__(self, key, value)
Lorsque la méthode del self[key] est exécutéeEn fait, la méthode appelée est __delitem__(self, key)
Lorsque vous souhaitez que votre conteneur s'exécute pour x dans conteneur: ou utilise iter(container), vous devez implémenter __iter__(self). Cette méthode renvoie un itérateur. Jetons un coup d'œil à l'utilisation de la méthode magique ci-dessus. Implémentez une structure de données dans Haskell. langue :