Python面试题整理

Python综合

  1. 对不定长参数的理解?

    不定长参数有两种: *args和**kwargs

    *args是不定长参数,用来将参数打包成tuple给函数体调用
    **kargs是关键字参数,用来将参数打包成dict给函数体调用

    在定义函数的时候不确定要传入的参数个数会有多少个的时候就可以使用不定长参数作为形参。

  2. 对缺省参数的理解?

    缺省参数指在调用函数的时候没有传入参数的情况下,调用默认的参数;
    有参数传入的时候,所传入的参数会替代默认参数。

  3. 什么是lambda函数?它有什么好处?写一个匿名函数求两个数的和。

    匿名函数,使用lambda函数能创建小型匿名函数。
    f = lambda x,y : x + y

  4. 深拷贝和浅拷贝的区别?

    浅拷贝是拷贝了引用,并没有拷贝内容,原对象改变了新对象也跟着改变
    深拷贝是对一个对象所有的层次的拷贝,但是修改原来的值,新对象不受影响
    浅拷贝对于可变类型和不可变类型是不同的,对于可变类型只拷贝顶层,不可变类型依然是原来的对象。

  5. 什么是可变、不可变?元组里添加字典,会改变ID吗?

    可变不可变指的是内存中的值是否可以改变,不可变类型指的是对象所在内存块里面的值不可以改变

    可变类型:列表、字典、集合
    不可变类型:数值、字符串、元组

    元组的顶层元素包含可变类型,id不会改变,但是值可以修改。

  6. 生成器、迭代器的区别?

    在Python中,一边循环一边计算的机制,称为生成器:generator,生成器是可以迭代对象,但是生成器可以通过send传值返回到前面。
    迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能往前不会后退。
    迭代器是一个可以记住遍历的位置的对象。

  7. range()和xrange()函数的用法?

    range(start,stop,step)函数从start到stop每个step生成一个数值,生成的是列表对象,一次性将所有数据都返回。
    xrange(start,stop,step)函数从start到stop每个step生成一个数值,每次调用返回其中的一个值,其实就是生成器。

  8. 对装饰器的理解,写出一个装饰器用来打印函数的执行时间。

    装饰器本质上就是一个Python函数把另一个函数作为参数接收。

    不需要做任何代码改动的前提下增加额外功能。

    
    #基本的装饰器
    def foo():
        print('执行函数时间')
    
    def timeit(func):
        def inner():
            print('1')
            func()
            print('2')
        return inner
    foo = timeit(foo)
    foo()
    
    
    # 装饰器的语法糖代替了foo = timeit(foo)
    import time
    
    def timeit(func):
        def inner():
        print('1')
        func()
        print('2')
        return inner
    
    @timeit
    def foo()
        print('函数执行时间')
    
    foo()
    
  9. 什么是单例模式,其应用场景都有哪些?

    class Single(object):
        _instance = None
        def __new__(cls, *args, **kwargs):
            if not hasattr(cls, '_instance'):
                cls._instance = super().__new__(cls)
            return cls._instance
    
    for i in range(8):
        sigle = Single()
        print(id(sigle))
    
    
    140726998691040
    140726998691040
    140726998691040
    140726998691040
    140726998691040
    140726998691040
    140726998691040
    140726998691040
    
    (1) __new__()在__init__()之前被调用,用于生成实例对象,利用这个方法和类的属性的特点可以实现设计模式的单例模式,单例模式是指创建唯一对象,单例模式设计的类只能实例化一个对象。
    应用场景如:windows的任务管理器,回收站,网站计数器。
    资源共享的情况下,避免由于资源操作时导致的性能或损耗等
    
  10. 并行(parallel)和并发(concurrency)?线程是并发还是并行,进程是并发还是并行?

    (1)线程是并发,进程是并行;进程之间相互独立,是系统分配资源的最小单位,同一个线程中的所有线程共享资源。
    (2)并行:同一时刻多个任务同时在运行
    (3)并发:在同一时间间隔内多个任务都在运行,但是并不会在同一时刻同时运行,存在交替执行的情况。
    (4)实现并行的库有:multiprocessing
    (5)实现并发的库有:threading
    (6)程序需要执行较多的读写、请求和回复任务的时候需要大量的IO操作,IO密集型操作使用并发更好,例如:爬虫。
    (7)CPU运算量大的程序,使用并行会更好。

  11. 什么是线程安全,什么是互斥锁?

    同一个进程中的多线程之间是共享系统资源的,多个线程同时对一个对象进行操作,一个线程操作尚未结束,另一个线程已经对其进行操作,导致最终结果出现错误,此时需要对被操作对象添加互斥锁,,保证每个线程对该对象的操作得到正确的结果。

    每个对象都对应于一个可称为'互斥锁'的标记,这个标记用来保证任意时刻,只能有一个线程访问该对象。

原文地址:https://www.cnblogs.com/lishi-jie/p/10096433.html