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