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

Posted 老吴的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

思考

  • 一开始我想到的是用一个参数,类型是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上问问了。有了答案我再更新~

Windows常见面试题——进程线程

1.什么是进程,什么是线程,请谈谈你的理解

答:进程和线程是操作系统中一个很重要的概念。进程是指操作系统中运行的应用程序,而线程是指程序中独立完成某一任务、实现某一功能所需的单元。进程就像一个工厂,可以完成某种产品的生产,而线程就像是工厂不同的部门,可以互补干扰独立的完成某项工作。一个进程至少运行着一个线程。

2.如何在不同进程中访问同一个内核对象。请说出至少三种方法

答:要访问内核对象,那么就需要在进程的句柄表中都有一个句柄项是指向此内核对象的。
a.由父进程继承给子进程,当父进程创建子进程时,若指定了继承句柄的属性,则子进程能够将父进程中所有可继承的句柄全部继承到自己的句柄表中。(但是即便继承了句柄,子进程却不知道自己继承了谁,句柄值是什么,只能由父进程通过进程通讯的方式告诉它)
b.在进程A中创建内核对象时,给内核对象命名,在进程B中通过名字打开内核对象。(如果内核对象不能命名或者没有一个标识,则不能采用此方法。)
c.使用DuplicateHandle()这个API打开对象,获得句柄。

3.当一个进程销毁时,内核对象句柄表中的句柄都会被销毁吗?结合引用计数,谈谈你对这个问题的理解。

答:每一个内核对象都有一个引用计数,你可以认为每一个内核对象结构体都有一个字段叫做引用计数,当有一个进程创建或打开了此内核对象,那么内核对象的引用计数自增1,进程终止或者关闭句柄,引用计数自减1,当引用计数减为0时,内核对象自动销毁。因此,当一个内核对象M在进程A创建,另外一个进程对象也使用了此内核对象,进程A退出后,M并不会被销毁,因为他还在进程B中使用,只有没有进程使用此内核对象,内核对象才会自动销毁。

4.请谈一下你所掌握的进程间通讯的方式,越详细越好。

a.WM_COPYDATA消息
WM_COPYDATA消息是一个专门用于数据传输的消息,可以携带一个大体积的消息参数。不过WM_COPYDATA的数据会被发送到目标进程的栈空间进行保存,因此单次发送的数据不宜过大
b.邮槽
邮槽是Windows系统最简单的一种进程间通讯方式,一个进程可以创建一个邮槽,其他进程可以通过打开此邮槽与创建邮槽的进程进行通讯。邮槽的通讯时单向的,服务端只能读取消息,客户端只能写入消息,消息被写入邮槽以队列的形式保存。

以上是关于Python常见面试题015.请实现一个如下功能的函数的主要内容,如果未能解决你的问题,请参考以下文章

Python-常见面试题-持续更新

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

python常见面试题

iOS常见面试题汇总带详细答案

python常见面试题讲解字符串最后一个单词的长度

python常见面试题讲解字符串最后一个单词的长度