python面试总结

python多线程能用多个cpu吗?

python的多线程不能利用多核CPU,原因是python解释器使用了GIL(全局解释器锁),在任意时刻只允许单个python线程运行。无论系统有多少个CPU核心,python程序都只能在一个CPU上运行。

python的垃圾回收机制

python的垃圾回收机制是以:引入计数器为主,标记清除分代回收为辅。
方式1:引入计数:每个对象内部都维护了一个值,该值记录此对象被引用的次数,如果次数为0,则python垃圾回收机制会自动清除此对象。
方式2: 标记-清除(Mark-Sweep):被分配对象的计数值与被释放对象的计数值之间的差异累计超过某个阈值,则python的收集机制就会启动。
方式3:当代码中主动执行gc.collect()命令时,python解释器就会进行垃圾回收

迭代器和生成器的区别

生成器

  1. 生成器本身是一种特殊的迭代器;
  2. 生成器会自动实现迭代器协议,也就是说只要我们yield后,自动就生成了next对象包括StopIteration等结构;
  3. 生成器使用yield语句返回一个值,yield语句挂起该生成器函数的状态,保留足够的信息。对生成器函数的第二次调用,跳转到函数上一次挂起的位置。生成器不仅“记住”了它的数据状态,生成还记住了程序执行的位置。
    区别
  4. 迭代器是访问容器的一种方式,也就是说容器已经出现。我们是从已有元素拓印出一份副本,只为我们此次迭代使用。而生成器则是自己生成元素的。
  5. 在用法上生成器只需要简单函数写法,配合yield就能实现。而迭代器真正开发中很难使用到。
  6. 生成器能够很好的节约内存

装饰器

装饰器可以实现,在不改变函数或类的内部代码与调用方式的情况下,使其拥有额外功能。
应用场景:插入日志,性能测试,事务处理,缓存,权限校验

python set低层实现

散列表

python字典和set()区别

  1. 字典是一系列无序的键值对的组合;集合里的元素不是键值对,是单一的一个元素
  2. 从python3.6以后,字典有序;集合无序
  3. 字典键不能重复;集合元素不能重复

怎么对字典的值进行排序

方法一:转化为元组,用sorted()函数进行排序

from random import randint
d = {x:randint(60,101) for x in "abcdxyz"}
print(d)
z = zip(d.values(),d.keys())
# z = zip(d.itervalues(), d.iterkeys()) #省空间
s = sorted(z)

方法二:设置sorted() 中key的参数的值

a = d.items()
s = sorted(a, key=lambda x:x[1])

__init__和__new__和__call__的区别

  1. init 是初始化方法
  2. new 实例化对象
  3. call 允许一个类的实例像函数一样被调用。实质上说,这意味着x()与x.call()是相同的

python的lamda函数

它是一个单独的表达式匿名函数,通常用作内联函数
匿名函数可以在程序中任何需要的地方使用,但是这个函数只能使用一次,即一次性的。因此Python lambda函数也称为丢弃函数,它可以与其他预定义函数一起使用。相对于我们定义的可重复使用的函数来说,这个函数更加简单便捷。

Python的内存管理

python的内存管理机制可以从三个方面来讲:

  1. 垃圾回收
  2. 引用计数
  3. 内存池机制

python中类方法和静态方法的区别

python类方法和实例方法相似,它最少也要包含一个参数,只不过类方法中通常将其命名为cls,Python会自动将该类本身绑定给cls参数。也就是说,我们在调用类方法时,无需显式为cls参数传参。
静态方法没有类似self,cls这样的特殊参数,因此python解释器不会对它包含的参数做任何类或对象的绑定。类的静态方法中无法调用任何类属性和类方法

python多线程怎么实现

python提供多线程编程的模块有以下几个:

  1. _thread
  2. threading
  3. Quene
  4. multiprocessing

python的传参是传值还是传值

说传值或者传引用都不准确,非要安一个确切的叫法的话,叫传对象

当退出python时是否释放所有内存分配?

答案是否定的,哪些具有对象循环引用或者全局命名空间引用的变量,在python退出时往往不会被释放。另外不会释放C库保留的部分内容

Python中的is和==有什么区别?

is比较的是两个对象的id值是否相等,也就是比较两个对象是否为同一个实例对象,是否指向同一个内存地址。==比较的是两个对象的内容是否相等

gbk和utf8的区别

GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准。GBK编码专门用来解决中文编码的,是双字节的

UTF-8编码是用以解决国际上字符的一种多字节编码,它对英文使用8位,中文使用24位来编码,对于英文字符较多的论坛则用utf-8节约空间。

range在python2和python3里的区别

在py2中,range得到的是一个列表
在py3中,range得到的是一个生成器,节约内存

init.py文件的作用以及意义

这个文件定义了包的属性和方法,它可以什么也不定义;可以只是一个空文件,但是必须存在。如果__init__.py不存在,这个目录就仅仅是一个目录,而不是一个包,它就不能被导入或者包含其他的模块和嵌套包
或者可以这样理解,当我们导入这个包的时候,init.py文件自动运行,帮我们导入了这么多个模块,我们就不需要将所有的import语句写在一个文件里了,也可以减少代码量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值