第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python:過濾可迭代類

Python:過濾可迭代類

呼喚遠(yuǎn)方 2022-12-06 15:29:13
是否有一個Iterable對象可以持有的鉤子/dunder,以便內(nèi)置filter函數(shù)可以擴(kuò)展到Iterable類(而不僅僅是實例)?當(dāng)然也可以自己寫一個自定義filter_iter函數(shù),比如:def filter_iter(filt_func: callable, collection_cls: type):    name = 'Filtered' + collection_cls.__name__  # would this automatic scheme lead to namespace conflicts?    wrapped_cls = type(name, (collection_cls,), {'_filt_func': staticmethod(filt_func)})    def __iter__(self):        yield from filter(self._filt_func, super(wrapped_cls, self).__iter__())    wrapped_cls.__iter__ = __iter__    return wrapped_cls這會產(chǎn)生預(yù)期的效果。例如,from collections import Collection, Iterableclass Chunker(Iterable):    def __init__(self, source: Iterable, chk_size: int=2):        self._source = source        self._chk_size = chk_size    def __iter__(self):        yield from zip(*([iter(self._source)] * self._chk_size))chunker = Chunker(range(12), 2)assert list(chunker) == [(0, 1), (2, 3), (4, 5), (6, 7), (8, 9), (10, 11)]FilteredChunker = filter_iter(lambda x: sum(x) % 3 == 0, Chunker)filtered_chunker = FilteredChunker(range(12))assert list(filtered_chunker) == [(4, 5), (10, 11)]但是,就像有一個__iter__鉤子可以確定如何迭代一個對象(例如,list在對象上調(diào)用時應(yīng)該如何表現(xiàn)),是否有一種__filter__鉤子可以確定filter在該對象上調(diào)用時應(yīng)該如何表現(xiàn)?如果不是,關(guān)于過濾可迭代對象的最佳實踐或標(biāo)準(zhǔn)是什么?
查看完整描述

1 回答

?
泛舟湖上清波郎朗

TA貢獻(xiàn)1818條經(jīng)驗 獲得超3個贊

與list(__iter__例如)不同,沒有這樣的掛鉤filter。后者只是迭代器協(xié)議的一個應(yīng)用,而不是一個單獨的協(xié)議本身。


為了不讓您空手而歸,這是 filtered_iter您提出的一個更簡潔的版本,它動態(tài)地對給定類進(jìn)行子類化,將其__iter__方法與filter.


def filter_iter(p, cls):

    class _(cls):

        def __iter__(self):

            yield from filter(p, super().__iter__())

    return _


查看完整回答
反對 回復(fù) 2022-12-06
  • 1 回答
  • 0 關(guān)注
  • 137 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號