Python一些面试题总结

1、python中可变数据类型和不可变数据类型,并简述原理

不可变数据类型:数值型、字符串型string和元组tuple
不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象(一个地址)
可变数据类型:列表list和字典dict
允许变量的值发生变化,即如果对变量进行append、add、remove等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。

2、python的GIL

GIL是Python的全局解释器锁
同一进程中假如有多个线程运行,一个线程在运行Python程序的时候会霸占Python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。
多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个Python解释器,所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大

3、python中的垃圾回收机制

Python的垃圾回收机制是以:引用计数器为主,标记清除和分代回收为辅。

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

4、python装饰器

装饰器可以实现,在不改变函数或类的内部代码与调用方式的情况下,使其拥有额外的功能。函数可以作为参数传递的语言,可以使用装饰器。

5、python中的lambda函数

lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。
匿名函数可以在程序中任何需要的地方使用,但是这个函数只能使用一次,即一次性的。因此Python Lambda函数也称为丢弃函数,它可以与其他预定义函数(如filter(),map()等)一起使用。相对于我们定义的可重复使用的函数来说,这个函数更加简单便捷。

6、python面向对象中__new__和__init__区别

  • __init__是初始化方法,创建对象后,就立刻被默认调用了,可接收参数
  • __new__至少要有一个参数cls,代表当前类,此参数在实例化时由Python解释器自动识别。
  • __new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类(通过super(当前类名, cls))__new__出来的实例,或者直接是object的__new__出来的实例。
  • __init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值。

6、python中import常用的库

  • os:提供了不少与操作系统相关联的函数
  • sys:通常用于命令行参数
  • re:正则匹配
  • math:数学运算
  • datetime:处理日期时间

7、python如何进行内存管理

三个方面:(1)引用计数机制(2)垃圾回收机制(3)内存池机制
一、对象的引用计数机制

Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。

二、垃圾回收

当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。

三、内存池机制

Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。

8、python中猴子补丁

所谓的猴子补丁的含义是指在动态语言中,不去改变源码而对功能进行追加和变更

9、进程、线程、协程

进程是表示资源分配的基本单位,又是调度运行的基本单位。在Mac、Windows NT等采用微内核结构的操作系统中,进程的功能发生了变化:它只是资源分配的单位,而不再是调度运行的单位。

线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。如果把进程理解为在逻辑上操作系统所完成的任务,那么线程表示完成该任务的许多可能的子任务之一。线程可以在处理器上独立调度执行,这样,在多处理器环境下就允许几个线程各自在单独处理器上进行。操作系统提供线程就是为了方便而有效地实现这种并发性。

协程运行在线程之上,当一个协程执行完成后,可以选择主动让出,让另一个协程运行在当前线程之上。协程并没有增加线程数量,只是在线程的基础之上通过分时复用的方式运行多个协程,而且协程的切换在用户态完成,切换的代价比线程从用户态到内核态的代价小很多。
协程既不是进程也不是线程,协程仅仅是一个特殊的函数,协程同进程和进程不是一个维度的,一个进程可以包含多个线程,一个线程可以包含多个协程。

对比维度多进程多线程总结
数据共享、同步数据共享复杂,需要用IPC;数据是分开的,同步简单因为共享进程数据,数据共享简单,但也是因为这个原因导致同步复杂各有优势
内存、CPU占用内存多,切换复杂,CPU利用率低占用内存少,切换简单,CPU利用率高线程占优
创建销毁、切换创建销毁、切换复杂,速度慢创建销毁、切换简单,速度很快线程占优
编程、调试编程简单,调试简单编程复杂,调试复杂进程占优
可靠性进程间不会互相影响一个线程挂掉将导致整个进程挂掉进程占优
分布式适应于多核、多机分布式;如果一台机器不够,扩展到多台机器比较简单适应于多核分布式进程占优

9、python如何在函数内部修改全局变量

利用global修改全局变量

10、python中生成随机整数、随机小数、0–1之间小数方法?

  • 随机整数:random.randint(a,b) 生成区间(a,b)内的整数
  • 随机小数:np.random.randn(5) 生成5个随机小数
  • 0-1随机小数:random.random() 括号中不传参

后面看到会再收集再整理

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值