Python常见面试题015.请实现一个如下功能的函数

python,常见,面试题,实现,一个,如下,功能,函数 · 浏览次数 : 42

小编点评

```python class Myadd(int): def __call__(self, num): # print(self.numerator) # 你可以看到这个numerator就是最后一次调用前的和 return Myadd(self.numerator + num) def __init__(self, numerator, denominator=0): self.numerator = numerator self.denominator = denominator def add(num): return Myadd(num) print(add(1)(2)(3)) ``` **解释:** 1. **`Myadd` 类**继承了`int`类型,并定义了 `__call__`方法来实现反复调用的功能。 2. **`__init__`方法**接收两个参数:`numerator` 和 `denominator`。 * `numerator` 是用于计算最终结果的分子。 * `denominator` 是用于计算最终结果的分母。 3. **`__call__`方法**在每个调用中返回一个新的 `Myadd` 对象,其 `numerator` 和 `denominator` 属性分别指向最后一次调用前的 `numerator` 和 `denominator`。 4. **`add`函数**使用 `Myadd` 类来实现反复调用。 * `add`接收一个 `num` 参数。 * 它创建了一个 `Myadd` 对象,并使用 `__init__`方法初始化它。 * `add`返回一个 `Myadd` 对象,该对象将用于计算最终结果。 5. **`print`语句**调用 `add(1)(2)(3)`,并打印结果。 6. **`Myadd`类的`__init__`方法**定义了 `numerator` 和 `denominator` 属性,并初始化了它们为 `1` 和 `0`。 7. **`numerator`和`denominator` 属性**在计算最终结果时被使用。 **注意:** * `Myadd` 类中的 `numerator` 和 `denominator` 属性是私有的,防止外部访问。 * `__init__`方法允许设置 `numerator` 和 `denominator` 属性的值。 * 这代码模拟了反复调用 `add` 函数,并展示了使用 `Myadd` 类实现的技巧。

正文

015. 请实现一个如下功能的函数

来自python黑魔法

题目

  • 实现一个add函数,可以"反复"调用,得到累加的结果
def add(num):
    ...
add(1)  # 输出1
add(2)  # 输出2
add(1)(2) # 输出3(即1+2)
add(1)(2)(3) # 输出6

思考

  • 一开始我想到的是用一个参数,类型是list,能保存用户的传参,请参考之前写的,python常见面试题003

    def add(num,container=[]):
        container.append(num)
        return sum(container)
    
    print(add(1)) # 1
    print(add(2)) # 3
    print(add(3)) # 6
    
  • 显然与题意不符,只是有点那味而已



  • 回想下装饰器的万能公式,好像有点对味

    def decorate(function_name):
        def inner():
            function_name()
        return inner
    
    @decorate
    def target(): # 一旦被装饰,target = decorate(target)
        print('calling target')
    
    target() # 此处的target变了
    
  • 但如何实现还是个问题

答案

  • 有装饰器的样子,只不过内部是个class

  • 但怎么去存储之前的值呢?

  • 答案看的我有点懵

    def add(num):
        class Myadd(int):
            def __call__(self, num):
                # print(self.numerator) # 你可以看到这个numerator就是最后一次调用前的和
                return Myadd(self.numerator+num)
        return Myadd(num)
    
    
    print(add(1)(2)(3))
    
  • Myadd继承int,主要是为了拿到int的一个property==>numerator

  • 这个numerator我查了一圈不太知道他是个啥,为何能存储用过的数据

  • 定义

        numerator = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default
        """the numerator of a rational number in lowest terms"""
    
  • 翻译:the numerator of a rational number in lowest terms

    • 最小有理数的分子
  • int还有一些其他的属性(仅作了解)

    • denominator:最小有理数的分母

          denominator = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default
          """the denominator of a rational number in lowest terms"""
      
    • imag:复数虚部

      imag = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default
      """the imaginary part of a complex number"""
      
    • real:复数实部

      real = property(lambda self: object(), lambda self, v: None, lambda self: None)  # default
          """the real part of a c0omplex number"""
      
  • 所以为何这个最小有理数的分子能存储呢?要去so上问问了。有了答案我再更新~

与Python常见面试题015.请实现一个如下功能的函数相似的内容:

Python常见面试题015.请实现一个如下功能的函数

015. 请实现一个如下功能的函数 来自python黑魔法 题目 实现一个add函数,可以"反复"调用,得到累加的结果 def add(num): ... add(1) # 输出1 add(2) # 输出2 add(1)(2) # 输出3(即1+2) add(1)(2)(3) # 输出6 思考 一开

Python常见面试题001-005,涉及深浅拷贝、MRO、函数可变参数、作用域、is和==的区别等

Python常见面试题001-005 参考资料 https://github.com/taizilongxu/interview_python https://github.com/hantmac/Python-Interview-Customs-Collection https://github.

Python常见面试题006 类方法、类实例方法、静态方法有何区别?

006. Python中类方法、类实例方法、静态方法有何区别? 全部放一个里面篇幅过大了,就拆分成1个个发布 示例代码 class Human: def __init__(self, name): self.name = name def say(self): print(f'我的名字是{self.

Python常见面试题007. 谈谈Python中__init__和__new__的区别

007. 谈谈Python中__init__和__new__的区别 python中关于dunder method双下方法,或magic method魔术方法的描述多在 https://docs.python.org/zh-cn/3.9/reference/datamodel.html#special

Python常见面试题008. 谈谈python中的解包

008. 谈谈python中的解包 这是个简单的知识点,但有的学员并不理解 unpacking解包 解,对应的是*或者**,也有自动解包之说 包对应的可迭代对象 自动解包 赋值的demo a,b = [1,2] print(a) # 1 print(b) # 2 将容器里面的元素逐个取出来分别赋值

Python常见面试题011. 如何在Python中动态创建类?

011. 如何在Python中动态创建类? 说在前面 答案是type 你印象中的type是用来查看对象的类型的 li = [] type(li) # 得到list 对自定义的类是这样的 class Person: pass wuxianfeng = Person() type(wuxianfeng)

Python常见面试题009. 元组和列表有什么区别

009. 元组和列表有什么区别 这个题是简单的,但要拿满分或者说高分不容易 相同点 | 共性 | 说明 | | | | | 可以存放任意元素 | 一般都放同类型 | | 支持索引访问 | 甚至是负数 | | 支持切片操作 | | | 逗号分隔元素 | | | 都是有序集合(容器) | | | 可以随

Python常见面试题010. Python的int占多大内存?

010. Python的int占多大内存? 示例代码 import sys a = 0 print(a.__sizeof__()) # 24 print(sys.getsizeof(a)) # 24 所以答案是24?并不是!看下面 import sys b = 1 print(b.__sizeof_

Python常见面试题012. 可迭代对象和迭代器有啥区别?

012. 可迭代对象和迭代器有啥区别? 2者不是一回事(废话) 比如 from collections.abc import Iterable,Iterator print(isinstance([1, 2], Iterable)) # True 列表是可迭代对象 print(isinstance(

Python常见面试题013.请说出下面的代码返回结果是什么?

013.请说出下面的代码返回结果是什么? *的坑;简单题 参考:https://docs.python.org/zh-cn/3.9/library/stdtypes.html#typesseq 示例代码 lists = [[]] * 3 lists[0].append(1) 请问lists此时是什么