zoukankan      html  css  js  c++  java
  • python面试问题集锦

    GIL(全局解释器锁)

      描述Python GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序,并阐明多线程抓取程序是否可比单线程性能有提升,并解释原因。

    1.python语言和GIL没有任何关系,GIL不是python语言的特性,仅仅是因为历史原因在Cpython解释器,难以移除GIL

    2.GIL:全局解释器锁。每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程执行代码

    3.Python使用多进程(mutilprocess)代替多线程(threading),可以利用多核的CPU资源的

    4.线程释放GIL锁的情况:在IO操作等可能会引起阻塞的系统调用之前,会暂时释放GIL,但在执行完毕之后,会重新获得GIL

    5.多线程比单线程爬取有所提升,在遇到IO阻塞的时候会释放GIL,达到多线程爬出的目的。

    深拷贝、浅拷贝(copy.copy   copy.deepcopy)

    浅拷贝是对一个对象的顶层拷贝,只拷贝引用,没有拷贝内容 。

    深拷贝是对一个对象的所有层次的拷贝(本质上递归浅拷贝),开辟一个新的空间。分片表达式进行的拷贝是深拷贝,字典的copy是深拷贝。

    对可变数据类型(列表、字典、集合)进行浅拷贝,只是指向引用地址,不会开辟新的空间

    对不可变数据类型(数字、字符串、元组)进行浅拷贝,会开辟一个新的空间(仅仅是最顶层开辟了新的空间,里层的元素地址还是一样的)

    浅拷贝后,改变原始对象中可变类型的元素的值,拷贝对象的值也随之改变。改变原始对象中不可变类型元素的值,拷贝对象的值也不会改变

    面向对象的三大特性(封装、继承、多态)

    封装:把客观事物封装成抽象的类,类可以把自己的属性和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。

    继承:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。提高了代码的重用性,能够对代码进行有效的管理,当某个类有问题只要修改这个类即可,而其继承的子类不需要修改

    多态:必须是在继承的基础上,一个类实例的相同方法在不同情形下有不同的表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。

    鸭子类型:在程序设计中,鸭子类型是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由这个对象继承特定的类或实现特定的接口,而是由当前方法和属性集合决定。“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。

    新式类和经典类的区别,在多继承上。经典类(python2.x)会进行深度优先继承。新式类(python3.x)默认继承object,会进行广度优先查找。

    @property:可以把一个实例方法变成其同名属性,以支持.号访问获得方法返回值。property属性内部进行一系列的逻辑计算,最终将计算结果返回。

    闭包:在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就构成了一个闭包。在闭包内函数想要修改外部临时变量时,需要加上nonlocal xx。

    一个简单的闭包函数:

    def outer():
    a = 10
    def inner():
    b = 22
    nonlocal a
    a = 100
    print(a+b)
    return inner

    if __name__ == '__main__':
    x = outer()
    x()

    装饰器:写代码需要遵循开放封闭原则,已经实现的功能代码不允许被修改,但是可以扩展。装饰器的作用就是在不改变原有函数功能的情况下,为其添加额外的功能。

    装饰器的功能:1.作为引入日志  2.函数执行时间的统计  3.执行函数前预备处理  4.执行函数后清理功能 5.权限校验等场景 6.缓存

    一个简单的装饰器:

    # wrapper装饰器,传入函数作为变量,由内函数调用
    def outer_wrapper(func):
    def wrapper(*args,**kwargs): # 进行函数的装饰
    # 权限校验等场景
    # 验证1
    # 验证2
    # 验证3
    pass
    func()
    return wrapper

    @outer_wrapper
    def f1():
    print('f1')

    使用装饰器实现一个单例:

    def singleton(cls,*args,**kwargs):
    instances = {}
    def get_instance(*args,**kwargs):
    if cls not in instances:
    instances[cls] = cls(*args,**kwargs)
    return instances[cls]
    return get_instance

    单例:是软件设计的一种模式,该模式的目的主要是确保某一个类只有一个实例存在

     使用__new__方法实现一个单例:

    class SingleTon(object):
    _instance = {}
    def __new__(cls,*args,**kwargs):
    if cls not in cls._instance:
    # 重写父类的__new__实现单例
    cls._instance[cls] = super(SingleTon,cls).__new__(cls,*args,**kwargs)
    print(cls._instance)
    return cls._instance[cls]

    洒洒水

  • 相关阅读:
    后端——框架——容器框架——spring_core——《官网》阅读笔记——第三章节2(转换器)
    后端——框架——容器框架——spring_core——《官网》阅读笔记——第三章节3(格式化器)
    后端——框架——容器框架——spring_core——《官网》阅读笔记——第四章节(Spring EL表达式)
    后端——框架——容器框架——spring_core——《官网》阅读笔记——第六章节3(AOP)——待补充
    spring boot中线程池的基本使用
    面试题
    activemq的基本使用
    mysql的索引基础--------创建,优化,失效
    spring cloud中各个组件设置超时的详细解释
    spring cloud中Hystrix组件的基本使用
  • 原文地址:https://www.cnblogs.com/hjl666/p/10534885.html
Copyright © 2011-2022 走看看