python面试题整理
1、文件夹和package有什么区别,import的时候第一步做了什么操作
package比文件夹多了一个init.py文件,只有包才可以被import,init文件初始为空,当import的时候先去调用包下面的init文件,可以将一些初始化操作写在init文件中
2、进程,线程,协程定义,有什么区别
进程是操作系统分配资源的最小单位,一个进程对应一块CPU
线程是进程中的某一个控制单元,是CPU调度的最小单元,线程之间相互独立,进程结束线程也会结束,一个进程至少要有一个线程
协程是更加轻量级的存在,不是由CPU进程管理而是由程序员管理,在执行一个函数过程中可以中断执行另一个函数,执行一个函数过程就叫协程,python3以前使用yield表示协程,yield关键字一般用于做生成器,实现在函数中暂停的效果,python3.3以后出现yield from后面跟可迭代对象,3.5以后使用async和await实现原生协程。
区别:
(1)线程之间切换是由操作系统决定的,切换速度特别快,但是切换频率太高,协程之间切换由程序决定,不会像线程切换那么耗费资源,在高并发下执行效率更高,
性能更优
(2)协程中控制共享资源不加锁
(3)协程使用同步的方式实现异步,在单进程里实现任务切换
子进程:在一个进程中创建开启另一个进程,这个进程称为子进程,即在父进程中创建的进行
3、僵尸进程知道吗
父进程还在执行,子进程执行完毕后不会立即退出,操作系统会清理内存空间,但是保留进程号(pid),等待父进程清理资源,这个时候子进程成为僵尸进程
4、如果不使用orm,django对于解决sql注入提供的解决方案
不使用orm即需要使用原生sql,django官网给出的解决方案为:使用cursor游标的execute方法执行sql语句,该方法有两个参数,第一个为sql,使用"%s"占位,第二个参数为params,默认为None,可穿list,顺序按照sql占位顺序填充
5、讲一下字典的实现原理
字典和集合都是基于哈希表实现的,字典中的key即为集合中的值,所以说集合元素是不重复的。
字典是以键值对为单位进行存储,在python2之前使用哈希表存储,对字典的key值进行hash,将得到的值作为哈希表的下标,对应的value存入哈希表中下标对应的位置,python3之后使用哈希表加index表,key值hash后的到的值作为index表的下标,找到下标对应的位置存入value值在哈希表的下标,value值在哈希表中顺序存储。
6、哈希函数是什么
python内置函数hash(),获取一个对象的哈希值
7、哈希表是怎么构成的,哈希冲突怎么解决
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
哈希冲突:不同的key值经过哈希函数得到了相同的值
解决哈希冲突方法:
(1)开放定址法(线性探测法、平方探测法、再哈希法)
(2)拉链法:将对应到同一个地址的键值对存入线性链表中,哈希表地址指向链表
8、知道哪些算法(每个算法的概念,实现逻辑及时间复杂度)
(1)排序算法(快排,选择,插入,堆排序,冒泡排序,希尔排序,归并排序)
(2)查找算法(顺序查找,二分法查找,插值查找,斐波那契查找,二叉搜索树,B+树查找,红黑树查找)
(3)分治法
(4)贪心算法
(5)动态规划
9、B+树查找和红黑树查找哪个快,为什么
10、数据库索引原理是什么
索引相当于书的目录,表数据在没有索引之前是顺序存储,加了索引以后就变成树结构,现在mysql选择的是B+树作为索引结构,B+树只有叶子节点存储关键字以及指向这些关键字的指针,且叶子节点从大到小链接,非终端节点只存储关键字,查询的时候IO渐进复杂度更低。
11、使用原生sql语句怎么删除数据库重复数据
使用group by及having https://blog.csdn.net/zzzgd_666/article/details/80718139
12、事务知道吗
事务是逻辑的一组操作,原子的,不可再分的,事务要么一起成功要么一起失败,事务具有原子性,一致性,隔离性,持久性。
事务是由一个正确的状态开始到另一个正确的状态,一个会话看不到另一个会话未提交的操作,事务提交后将数据持久化到内存中
13、脏读了解吗
脏读指一个会话读到了另一个会话未提交的事务,出现脏读的原因是数据库隔离级别设置过低,数据库隔离级别由读取未提交,读取已提交,可重复读,可串行化,级别由低到高
14、mysql为什么会出现幻读
幻读指的是一个会话两次读取的数据不一致,多了一些数据,读到了另一个事务新增的数据。
mysql数据库引擎innodb默认隔离级别为可重复读,加上next_key算法,达到了可串行化的隔离级别,正常来说不会出现幻读,出现幻读可能是在一个事务读取数据时,另一个事务新增了数据并commit,在commit之后之前的事务又执行了update操作,则再次读取会读到之前不存在的数据
15、redis支持哪几种数据类型
字符串、列表、哈希、集合、可变集合
16、断电以后redis数据可以恢复吗
redis持久化方式:快照和AOF(append only file)
17、软连接和硬链接区别,对目录使用哪种链接方式
软链接相当于windows创建快捷方式,如果文件用户数据块存放的是另一个文件路径名的指向,则该文件为软连接。软链接有自己的索引节点号(inode)。如果一个索引节点号对应多个文件则为硬链接,即同一个文件使用了多个别名。
区别:
(1)软链接有自己的索引节点号,硬链接共用一个索引节点号
(2)软连接可以对不存在的目录及文件创建,硬链接只能对已存在的文件创建
(3)硬链接不能对目录创建,因为目录有两个隐藏文件夹,.指向当前目录,..指向上一级目录
(4)删除软链接不影响被指向的文件,删除原文件软连接会变成死链接,删除一个硬链接并不影响其他有相同索引节点的文件