Bekas tersuai (Bekas)

Selepas pengenalan dalam bab sebelumnya, kita tahu bahawa dalam Python, jenis bekas biasa ialah: dict, tuple, list, string. Konsep bekas bekas dan bekas tidak berubah juga disebut. Antaranya, tuple dan rentetan ialah bekas tidak boleh diubah, dan dict dan senarai ialah bekas boleh ubah. Perbezaan antara bekas boleh ubah dan bekas tidak berubah ialah apabila bekas tidak berubah diberikan nilai, elemen di dalamnya tidak boleh diubah suai. Sudah tentu, untuk pengenalan terperinci, anda boleh membaca kembali artikel sebelumnya, yang mempunyai gambar dan teks.

Jadi, inilah soalan pertama, adakah struktur data ini cukup untuk kita bangunkan dan gunakan? Apakah yang perlu kita lakukan apabila ia tidak mencukupi, atau apabila terdapat beberapa keperluan khas yang tidak dapat diselesaikan menggunakan bekas asas ini sahaja?

Pada masa ini, kita perlu menyesuaikan bekas, jadi bagaimana kita harus melakukannya? Fungsi

jenis bekas meja Takrifkan __setitem__ dan __delitem__Perlu mentakrifkan __iter__Perlu melaksanakan __len__(diri) kontena diri Callus jenis kunci adalah salah, TypeError akan dilemparkan Jika nilai yang sepadan dengan kunci tidak dapat dikembalikan, kaedah tersebut harus membuang ValueError Perlu melaksanakan __getitem__(diri, kunci)Apabila melaksanakan kunci kendiri. ] = valueKaedah yang dipanggil ialah __setitem__(self, key, value)Apabila kaedah del self[key] dilaksanakanMalah, kaedah yang dipanggil ialah __delitem__(self, key)
#!/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]
Meneruskan pembelajaran
  • Cadangan kursus
  • Muat turun perisian kursus
Jenis data tersuai perlu diulang
Kembalikan panjang bekas tersuai
Apabila anda mahu bekas anda melaksanakan untuk x dalam bekas: atau gunakan iter(bekas), anda perlu melaksanakan __iter__(self) Kaedah ini mengembalikan iterator Mari kita lihat menggunakan kaedah ajaib di atas Laksanakan struktur data dalam Haskell bahasa: