python面试题刷题笔记11-20

11.AOP和装饰器(可参考stackoverflow或者个人博客)

装饰器的作用就是为已经存在的对象添加额外的功能。

https://blog.csdn.net/honorwh/article/details/89381587

12.鸭子类型:

简单来说,就是不管对象是什么类型,而只关心对象的行为。

鸭子类型在动态语言中经常使用,非常灵活,使得python不想java那样专门去弄一大堆的设计模式。

13.python中重载?

函数重载主要是为了解决两个问题:

一个是可变参数类型,一个是可变参数个数。

一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函数的功能其实不同,那么不应当使用重载,而应当使用一个名字不同的函数。

那么对于情况 1 ,函数功能相同,但是参数类型不同,python 如何处理?答案是根本不需要处理,因为 python 可以接受任何类型的参数,如果函数的功能相同,那么不同的参数类型在 python 中很可能是相同的代码,没有必要做成两个不同函数。

那么对于情况 2 ,函数功能相同,但参数个数不同,python 如何处理?大家知道,答案就是缺省参数(用*args可以解决)。对那些缺少的参数设定为缺省参数即可解决问题。因为你假设函数功能相同,那么那些缺少的参数终归是需要用的。

所以,python 自然就不需要函数重载了。

14.新式类和旧式类

python2有经典类和新式类并存,具体写法分为:

class A(object):新式类

class A():旧式类

class A:旧式类

python3默认是新式类

有无object是判断旧式类和新式类的最大区别。

新式类的MRO(method resolution order 基类搜索顺序)算法采用C3算法广度优先搜索,而旧式类的MRO算法是采用深度优先搜索。

在python2和python3定义类,测试他的类型时是这样:

Python2

class A:

    pass

print(type(A))

output:




Python3

class A(object):

    pass

print(type(A))

output:

 

另外旧式类的深度优先示例:

class A():

    def foo1(self):

          print("A")

class B(A):

    def foo2(self):
          pass

class C(A):
     def foo1(self):

          print("C")

class D(B, C):

    pass

d =D()

d.foo1()

output:

A

 

按照经典类的查找顺序从左到右深度优先的规则,在访问d.foo1()的时候,D这个类是没有的..那么往上查找,先找到B,里面没有,深度优先,访问A,找到了foo1(),所以这时候调用的是A的foo1(),从而导致C重写的foo1()被绕过

新式类是广度优先

class A(object):

    def foo1(self):

          print("A")

class B(object):

    def foo2(self):

          pass

class C(object):     #或者是class C(A):只要A是新式类的定义,那么继承类都是新式类

    def foo1(self):

          print("C")

class D(B, C):

    pass

d = D()

d.foo1()

output:

C

 

15.__new__和__init__的区别:

需要控制新实例的创建时,请使用__new__。需要控制新实例的初始化时,请使用 __init__

__new__是实例创建的第一步。它首先被调用,并负责返回您的类的新实例。相比之下, __ init__不会返回任何内容; 它只负责在创建实例后初始化它。

通常,除非您继承了str,int,unicode或tuple之类的不可变类型,否则不应该覆盖__new__

16.单例模式

https://blog.csdn.net/honorwh/article/details/89882762

17.python的作用域

Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定的。

当 Python 遇到一个变量的话他会按照这样的顺序进行搜索:

本地作用域(Local)→当前作用域被嵌入的本地作用域(Enclosing locals)→全局/模块作用域(Global)→内置作用域(Built-in)

简称LEGB

18.GIL线程全局锁

线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,说白了就是一个核只能在同一时间运行一个线程.对于io密集型任务,python的多线程起到作用,但对于cpu密集型任务,python的多线程几乎占不到任何优势,还有可能因为争夺资源而变慢。

解决办法就是多进程和下面的协程(协程也只是单CPU,但是能减小切换代价提升性能).

这也不是一两句说得明白的,后续会专门写一篇学习。

19.协程

后续会专门写一篇学习线程、进程和协程的区别

20.闭包

闭包(closure)是函数式编程的重要的语法结构。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。

当一个内嵌函数引用其外部作作用域的变量,我们就会得到一个闭包. 总结一下,创建一个闭包必须满足以下几点:

I.必须有一个内嵌函数

II.内嵌函数必须引用外部函数中的变量

III.外部函数的返回值必须是内嵌函数

举例说明:

def ExFunc(n):

    sum = n

    def InsFunc():

          return sum + 1

    return InsFunc

闭包就像个空心球一样,你知道外面和里面,但你不知道中间是什么样.

你可能感兴趣的:(python面试题刷题笔记,python面试题)