• 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协议族通信的中间软件抽象层,它是一组接口。

     

  • 相关阅读:
    asp.net页面刷新后样式就发生了改变
    ASP.NET MVC 入门系列教程
    javascript打开邮箱服务器
    jquery验证邮箱
    MySQL数据库的索引类型
    JS判断浏览器
    Silverlight 3 新特性
    moss 2007 添加关键字及最佳匹配
    vs2008 常用快捷键
    Microsoft Enterprise Library 5.0正式版本已经发布
  • 原文地址:https://www.cnblogs.com/HByang/p/13273900.html
Copyright © 2020-2023  润新知