zoukankan      html  css  js  c++  java
  • python 面试题总结

    1、有如下字典

    dic = {'k1': 1, 'k2': 4, 'k3': 2, 'k4': 3, 'k5': 5}

    如何通过值进行排序

    答:

    dic = {'k1': 1, 'k2': 4, 'k3': 2, 'k4': 3, 'k5': 5}
    
    a = sorted(dic, key=lambda key: dic[key])
    
    print(a)

    2、如何对一个列表进行排序?

    答:

    list = [50, 44, 33, 76, 89, 77, 30, 88]
    
    list.sort()
    
    print(list)

    3、如何对一个列表去重?

    答:

    # 方法一:
    
    list1 = [50, 44, 33, 76, 89, 77, 30, 88, 88, 77]
    
    list2 = []
    
    for i in list1:
    
        if not i in list2:
    
            list2.append(i)
    
    print(list2)
    
    # 方法二:
    
    list1 = [50, 44, 33, 76, 89, 77, 30, 88, 88, 77]
    
    a = list(set(list1))
    
    print(a)

    4、python递归的最大层数?

    答:

    998

    5、pass的作用?

    答:

    pass主要作用就是占位,让代码整体完整.

    6、is和==的区别

    答:

    is 是内存比较而==是值的比较

    7、列举常见的内置函数?

    答:

    locals、globals、eval,exec,complie
    input、print、hash、id、range、next
    bool、int、sum、min、max、reversed
    slice、等

    8、至少列举8个常用模块都有那些?

    答:

    os、sys、time、datetime、json、random、hashlib、re等

    9、re的match和search区别?

    答:

    # match()函数只检测RE是不是在string的开始位置匹配,search()会扫描整个string查找匹配;

    10、什么是装饰器?

    答:

    # 装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。

    11、什么是迭代器、生成器?

    答:

    # 迭代器 内部含有__iter__ 且含有__next__方法的对象就是迭代器,遵循迭代器协议。
    
    # 一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束。

    12、如何生成一个随机数?

    答:

    import random
    
    print(random.randint(1, 99999))

    13、如何使用python删除一个文件?

    答:

    import os
    
    os.remove('path')

    14、Python 的特点和优点是什么?

    答:

    1. 解释性
    
    2. 动态特性
    
    3. 面向对象
    
    4. 语法简洁
    
    5. 开源
    
    6. 丰富的社区资源

    15、 深拷贝和浅拷贝的区别是什么?

    答:

    # 对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。
    
    # 对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变。

    16、列表和元祖有什么不同?

    答:

    # 主要区别在于列表是可变的,元祖是不可变的。

    17、如何随机打乱列表中元素,要求不引用额外的内存空间?

    答:

    # 我们用 random 包中的 shuffle() 函数来实现。

    18、请解释 Python 中的闭包?

    答:

    # 如果在一个内部函数里。对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就是一个闭包。

    19、如何获取字典中的所有键?

    dic = {'k1': 1, 'k2': 4, 'k3': 2, 'k4': 3, 'k5': 5}
    
    for key in dic.keys():
    
        print(key)

    20、什么是Python包?

    # 简单点说:包就是文件夹,但该文件夹下必须存在 __init__.py 文件, 该文件的内容可以为空。__init__.py 用于标识当前文件夹是一个包。

    21、什么是序列化和非序列化?

    答:

    # 将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化。
    
    # 反序列化和上面相反将字符串转换成字典、列表等内容叫做反序列化

    22、提到Python中局部变量和全局变量的规则是什么?

    答:

    # 局部变量:如果在函数体内的任何位置为变量赋值,则假定它是本地的。
    
    # 全局变量:仅在函数内引用的那些变量是隐式全局变量。

     23、面向对象深度优先和广度优先是什么?

    答:

    # 当类是经典类时,多继承情况下,会按照深度优先方式查找
    
    # 当类是新式类时,多继承情况下,会按照广度优先方式查找
    
    # 经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了跟多的功能,也是之后推荐的写法,从写法上区分的话,如果 当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类。

    24、面向对象中super的作用?

    # super() 函数是用于调用父类(超类)的一个方法。

    25、Python面向对象中的继承有什么特点?

    # 1、在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。有别于C#
    
    # 2、在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
    
    # 3、Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。

     26、请说说你进程、线程、协程的理解

    # 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础
    # 进程是一个实体。每一个进程都有它自己的地址空间。通过multiprocess.process模块开启进程
    
    # 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。通过Thread模块来开启线程
    
    # 协程:是单线程下的并发,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的。通过Gevent模块来实现

    27、请说说你对GIL锁的理解

    # 全局解释器锁GIL
    
    # Python的执行依赖于解释器。Python最初的设计理念在于,为了解决多线程之间数据完整性和状态同步的问题,设计为在任意时刻只有一个线程在解释器中运行。而当执行多线程程序时,由GIL来控制同一时刻只有一个线程能够运行。即Python中的多线程是表面多线程,也可以理解为fake多线程,不是真正的多线程。

    28、什么是并发和并行?

    #并行 : 并行是指两者同时执行,比如赛跑,两个人都在不停的往前跑;(资源够用,比如三个线程,四核的CPU )
    
    #并发 : 并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给B,B用完继续给A ,交替使用,目的是提高效率。
    
    #区别:
    #并行是从微观上,也就是在一个精确的时间片刻,有不同的程序在执行,这就要求必须有多个处理器。
    #并发是从宏观上,在一个时间段上可以看出是同时执行的,比如一个服务器同时处理多个session。

    29、请解释一下什么是同步、异步和阻塞、非阻塞?

    # 所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。
    
    #所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列。
    
    
    #所谓阻塞,就是调用结果返回之前,该执行线程会被挂起,不释放CPU执行权,线程不能做其它事情,只能等待,只有等到调用结果返回了,才能接着往下执行;所谓非阻塞,就是在没有获取调用结果时,不是一直等待,线程可以往下执行,如果是同步的,通过轮询的方式检查有没有调用结果返回,如果是异步的,会通知回调。
    
    #简单点说:
    #阻塞就是干不完不准回来, 
    #非阻塞就是你先干,我现看看有其他事没有,完了告诉我一声

    30、请说说什么是socket?

    # Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。

     

  • 相关阅读:
    LeetCode 842. Split Array into Fibonacci Sequence
    LeetCode 1087. Brace Expansion
    LeetCode 1219. Path with Maximum Gold
    LeetCode 1079. Letter Tile Possibilities
    LeetCode 1049. Last Stone Weight II
    LeetCode 1046. Last Stone Weight
    LeetCode 1139. Largest 1-Bordered Square
    LeetCode 764. Largest Plus Sign
    LeetCode 1105. Filling Bookcase Shelves
    LeetCode 1027. Longest Arithmetic Sequence
  • 原文地址:https://www.cnblogs.com/HByang/p/13273900.html
Copyright © 2011-2022 走看看