1.什么是栈溢出,在什么情况下可能会出现
栈溢出是由于C语言系列没有内置检查机制来确保复制到缓冲区的数据不得大于缓冲区的大小,因此当数据足够大时,将会溢出缓冲区的范围。
python函数调用是通过栈这种结构实现的,每当进入一个函数调用,栈都会增加一层栈帧,每当函数返回栈就会减少一层栈帧。由于栈的大小不是无线的,所以递归的调用过多,会导致栈溢出。
2.Cpython的内存管理机制
引用计数:一种非常高效的内存管理手段,当一个对象被引用时其引用计数增加一,当其不再被一个变量引用时则计数减一,当引用计数为0时对象被删除
垃圾回收:python中,所有能够引用其他对象的对象都被称之为容器。因此容器之间才能形成循环引用。python的垃圾回收机制利用了这个特点寻找需要被释放的对象
为了记录下所有的容器对象,python将每一个容器都链到一个双向链表中,之所以使用双向链表是为了方便快速的在容器集合中插入和删除对象。
3.python的魔法方法以及用途
4.已知下列list
list1 = [
{'mm':2},
{'mm':1},
{'mm':4},
{'mm':3},
{'mm':3},
]
4.1把list中的元素按mm值排序
list1.sort(key=lambda x:x['mm'])
print(list1)
4.2获取list1中第一个mm值等于x的元素
s = list(filter(lambda x:x['mm']=='x',list1))[0]
print(s)
4.3list1的输出结果是什么
print(list1[::4])
[
{'mm':1},
{'mm':3},
]
4.4删除list1中所有mm=x的元素,切不对list重新赋值
for i in list(filter(lambda x:x['mm']==3,list1)):
list1.remove(i)
print(list1)
4.5取出list中mm的值最大的元素,不能排序
max_num = max(list(map(lambda x:x['mm'],list1)))
max_dict = list(filter(lambda x:x['mm']==max_num,list1))[0]
print(max_dict)
5.以下操作的时间复杂度
list.index O(1)
dict.get() O(1)
for i in set() O(n)
6.解释以下输出的原因
s1 = '{:0.2f}'.format(0.135)
s2 = '{:0.2f}'.format(0.145)
四舍六入五成双
五前为奇数进位
五前为偶数不进位
7.简述代码抛出以下异常的原因
IndexError 下标索引超出序列边界
AttributeError 这个对象没有这个属性
BaseException 所有异常的类
SystemExit 解释器请求退出
Keyboardlnterrupt 用户中断执行(通常为^C)
Exception 常规错误基类
Stoplteration 迭代器没有更多的值
GeneratorExit 生成器发生异常来通知错误
StandardError 所有内建标准异常的基类
ArithmeticError 所有数值计算错误的基类
FloatingPointError 浮点计算错误
OverflowError 数值运算超过最大限制
ZeroDivisionError 除(或取模)零(所有数据类型)
AssertionError 断言错误
EOFError 没有内建输出,达到EOF标记
EnvironmentError 操作系统错误的基类
IOError 输入/输出错误
OSError 操作系统错误
WindowsError 系统调试错误
LookupError 无效数据查询的基类
KeyError 映射中没有这个键
MemoryError 内存溢出错误
UnboundLocalError 访问未初始化本地变量
ReferenceError 弱引用视图访问已经垃圾回收了的对象
RuntimeError 一般的运行时错误
NotImplementedError 尚未实现的方法
SyntaxError python语法错误
IndentationError 缩进错误
TabError Tab与空格混用
SystemError 一般的解释器系统错误
TypeError 对类型无效操作
ValueError 传入无效操作
8.简述你对GIL的理解
GIL全局解释器锁,python解释器内置的线程锁,保护了线程安全。
但也,使python无法发挥多核的优势,多线程无法实现并行,同一时刻只能一个线程
9.简述以下内置函数的用法
reduce 第一个参数为函数,第二个个参数为可迭代对象。作用是可以对参数序列中的元素进行累加
map 第一个参数为函数,第二个参数为一个或多个可迭代对象。对相同位置的相加
any 判断一个可迭代对象对象有一个不为空,就返回Ture,否则,返回False
all 判断一个可迭代对象所有元素都不为空,就返回Ture,否则,返回False
10.copy与deepcopy的区别是什么
copy:浅拷贝,只拷贝表面一层,深层不会拷贝,如果改变深层,被拷贝的深层也随之改变
deepcopy:深拷贝,无论深层还是浅层被修改,都不会使原被拷贝对象修改
11.进程、线程、协程间的区别和联系
进程:是系统进行资源分配的独立单位,就是说不同的进程拥有不同的堆和栈,既不共享堆,也不共享栈
线程:线程是进程的一个实体,是CPU调度和分配的基本单位,他是比进程更小的能独立运行的基本单位,他又有独立的栈和共享的堆
协程:又称微线程,它和线程一样拥有独立的栈和共享的堆。是由程序员调度执行单元
区别和优缺点:
一个程序至少拥有一个进程,一个进程至少拥有一个线程(主线程)
进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率
协程、线程不能够独立执行,必须依存在进程中,应当使用互斥锁机制来加以控制
进程之间可以通过MQ来传递数据,而线程、协程之间的全局变量是共享的
进程和线程都是由操作系统调度的,而协程的调度是程序员控制的
在IO操作密集型的程序使用协程可以很好的避免CPU的浪费,将CPU的资源主动让出给其他协程使用。操作系统为了程序运行的高效性每个线程都有自己缓存Cache等等数据,操作系统还会帮你做这些数据的恢复操作。 所以线程的切换非常耗性能。但是协程的切换只是单纯的操作CPU的上下文,所以一秒钟切换个上百万次系统都抗的住
12.*ages,**kwargs的含义与用法
接受多个形参传值,接收多个键值对传值
13.http header及其功能
因为http本身是个无状态协议,所以需要在请求头与响应头中存放一些信息,比如协议的类型,使用的编码,cookie发送的内容长度这样服务端就知道浏览器是谁想要做什么
14.cookie与session的区别和联系
cookie存放于浏览器端用于服务器识别浏览器的身份
session在服务器端,它的运行依赖于session ID ,而session ID存放于cookie中,如果浏览器禁用了cookie ,session也会失效
15.什么是浏览器的同源策略
相同IP端口的为同一个域,一个域的脚本仅仅具有本域内的权限,而没有其他域的权限。这种安全限制成为同源策略
为了安全,在进行跨域请求时,浏览器会阻碍数据的接收
16.git commit --amend 有何用处
改写操作,用新的commit替换旧的commit
17.git 如何查看某次提交修改的内容
git log
18.git 比较两个commit的区别
git diff commit-id-1 commit-id-2 > d:/dome.py
+表示2相对于1减少了内容
-表示2相对于1增加了内容
19.git 如何把A分支上的某个commit应用到分支B上
git checkout B
git cherry-pick 上次提交的commit ID
20.如何查看Linux的系统时间,磁盘使用量,内存使用量
查看系统时间
date -s1
磁盘使用量
df -l
内存使用量
top