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

 

原文地址:https://www.cnblogs.com/HByang/p/13273900.html