微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

“元组”对象在我的代码中不可调用

如何解决“元组”对象在我的代码中不可调用

def make_sequence(seq):
    def filter1(*func):
        new_filter = filter(func,seq)
        return tuple(new_filter)

    def filter_iterator(*func):
        new_seq = tuple(filter(func,seq))
        index = 0

        def next1():
            nonlocal index
            if index >= 0 and index < len(new_seq):
                ele = new_seq[index]
                index += 1
            else:
                index = 0
                ele = new_seq[index]
                index += 1
            return ele

        def reverse():
            nonlocal index
            index -= 1
            if index >= 0 and index < len(new_seq):
                ele = new_seq[index]
            else:
                index = len(new_seq) - 1
                ele = new_seq[index]
            return ele

        return {'next': next1,'reverse': reverse}

    def reverse():
        return tuple(seq[::-1])

    def extend(new_seq):
        nonlocal seq
        seq += new_seq

    return {'filter': filter1,'filter_iterator': filter_iterator,'reverse': reverse,'extend': extend}


s1 = make_sequence((1,2,3,4,5))
print(s1['filter'](lambda x: x % 2 == 0))

当我尝试从 fitlter1 返回元组时出现错误

'tuple' 对象不可调用

我尝试做的是 filter1 获取参数 *args 因为当我将调用 filiter1() 时不带任何函数,他会不加更改地返回序列。

解决方法

我删除了 * 上的 def filter1(func): 尝试这样做,我注意到您的参数是带有 *func* 实际上它是一个元组函数上的参数,看来您不需要*。我认为您需要搜索*args and **kwargs

我已经运行它并得到了这个输出

(2,4)
[Finished in 0.3s]

这里有一个快速示例,为什么您会收到该消息。因为当您将 * 放入函数中的参数时,它的数据类型是 tuple

def foo(*args):
    print(args)
    print(type(args))


foo(1)

输出:

(1,)
<class 'tuple'>

为什么会出现错误?

filter(func,seq)

filter 函数期望您的 func 是一个函数或至少是 lambda 但它不是,它实际上是一个 tuple 一旦你把 *在您的 def filter1(*func) 上。


所以根据你在这里所说的。

我尝试做的是 filter1 获取参数 *args 因为当我 将调用 filiter1() 不带任何函数,他返回序列 没有变化。

你可以用你的函数做什么

def filter1(func=None):
    if callable(func):
        new_filter = filter(func,seq)
        return tuple(new_filter)

    return seq

将您的 filter1 函数更改为该函数,您就会得到这个。

print(s1['filter'](lambda x: x % 2 == 0))
print(s1['filter']())
print(s1['filter'](lambda x: x>2))

输出:

(2,4)
(1,2,3,4,5)
(3,5)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。