前の章での紹介により、Python では一般的なコンテナ タイプが dict、tuple、list、string であることがわかりました。コンテナ化されたコンテナと不変コンテナの概念についても説明します。このうち、タプルと文字列は不変コンテナであり、辞書とリストは可変コンテナです。可変コンテナーと不変コンテナーの違いは、不変コンテナーに値が割り当てられると、その中の要素は変更できないことです。もちろん、詳しい紹介については、写真と文章を交えた前回の記事を読み返していただくことも可能です。
それでは最初に質問がありますが、これらのデータ構造は私たちが開発して使用するのに十分ですか?十分ではない場合、またはこれらの基本的なコンテナだけでは解決できない特別なニーズがある場合はどうすればよいでしょうか?
このとき、コンテナをカスタマイズする必要があるのですが、どうすればよいでしょうか?
関数 | 説明 |
カスタム不変コンテナタイプ | 定義が必要_ _len__ および __getitem__メソッド |
カスタマイズされた変数型コンテナ | 不変コンテナ型に基づいて定義 __setitem__ および __delitem__ |
カスタム データ型が必要です反復する必要があります | __iter__ を定義する必要があります |
カスタム コンテナの長さを返します | 実装する必要があります_ _len__(self) |
カスタム コンテナーは self[key] を呼び出すことができます。キーのタイプが間違っている場合、TypeError がスローされます。キーに対応する値を返せない場合、このメソッドは ValueError | __getitem__(self, key) を実装する必要があります |
#呼び出しは __setitem__(self, key, value) このメソッドです | |
#実際に呼び出されるメソッドは __delitem__(self, key) | |
イテレータを返す __iter__(self) を実装する必要があります |
#!/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]