python技术面试题(其三)

二十一, 谈谈正则的贪婪模式和非贪婪模式

在数量级匹配符中使用

默认为贪婪模式,用最多量的方式完成匹配

数量级匹配符后加?即为非贪婪 用最少的方式完成匹配

二十二, a=1 a=a+1 的堆栈内存过程

不可变类型,在调用栈里分配地址,地址直接对应值,如果修改会开辟一块新空间,存储新值,相互不影响

可变类型,在调用栈里分配地址,地址对应堆里分配的地址,堆的地址存储真正的值,如果修改会相互影响。

二十三, python的内存管理

从三个方面来说

一,对象的引用计数机制

二, 垃圾回收机制

三, 内存池机制

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

引用计数增加的情况

1,一个对象分配一个名称

2, 将其放入一个容器中(如列表,元组或字典)

引用计数减少的情况:

1, 使用del语句对对象别名显示的销毁

2, 引用超出作用域被重新赋值 sys,getrefcount()函数可以获得对象的当前引用计数

多数情况下,引用计数比我们猜测的要大的多。对于不可变类型(如数字和字符串), 解释器会在程序的不同部分共享内存,以便节约内存

二、垃圾回收

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

2,当两个对象a和b相互引用时,del语句可以减少a和b的引用计数,并销毁用于引用底层对象的名称。然而由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。(从而导致内存泄漏)。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。

三、内存池机制

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

1,pymalloc机制,为了加速python的执行效率,python引入一个内存池机制,用于管理对小块内存的申请和释放

2,python中所有小于256字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc.

3,对于python对象,如整数,浮点数和list,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数

二十四, *arg和**kwarg作用

*arg代表位置的参数,它会接收任意多个参数并把这些参数作为元组传递给函数。

**kwargs代表的关键字参数,允许你使用没有事先定义的参数名。

位置参数一定要放在关键字参数的前面

作用:使用*args和**kwargs可以方便的定义函数,同时可以加强扩展性,以便日后的代码维护

二十五, is和==的区别

==是python标准操作符中的比较操作符,用来判断两个对象的value是否相等

is也被叫做同一性运算符,这个运算符比较判断的是对象间的唯一身份标识,也就是id是否相同

二十六, filter, map, reduce的作用

filter()将符合条件的值过滤出来

map(lambda x:x*x, [12345]) # 根据提供的函数做指定序列的映射

reduce(function, iterable[,initializer]) # 对参数序列中的元素进行累计

二十七, 至少列举8个常用模板有哪些

1,sys 用于提供对解释器相关的访问以及维护,并有很强的交互功能

2,time:时间模块

3, os: 用于提供操作系统模块

4, ashlib: 用于加密相关的操作

5, random:生成随机变量

6,pickle:用于python特有类和python的数据类型间进行转换

7, datetime: data和time的结合体

8,re:正则表达式模块

二十八, json序列化时,可以处理的数据类型有哪些?如何定制支持datatime类型

json只能支持int\str\list\tuple\dict\

python 复制代码
import json, datetime
from json import JSONEncoder
 
class ComplexEncoder(JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            return obj.strftime('%Y-%m-%d %H:%M:%S')
        else:
            return super(ComplexEncoder, self).default(obj)
 
d = {'name': 'alex', 'data': datetime.datetime.now()}
print(json.dumps(d, cls=ComplexEncoder))  
# {"name": "alex", "data": "2018-09-28 14:49:42"}

自定义对datatime类型的序列化类, 继承JSONEncoder 使用里面的default方法,将编码失败的数据传入到这里,判断传入的对象是否是datatime类型,如果是则使用strtime方法进行还原成字符串。

三十, json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办

python 复制代码
import json
 
a = json.dumps({"ddf": "你好"}, ensure_ascii=False)
print(a)
# {"ddf": "你好"}
相关推荐
一点媛艺几秒前
Kotlin函数由易到难
开发语言·python·kotlin
姑苏风5 分钟前
《Kotlin实战》-附录
android·开发语言·kotlin
奋斗的小花生1 小时前
c++ 多态性
开发语言·c++
魔道不误砍柴功1 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
闲晨1 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
_.Switch1 小时前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
老猿讲编程2 小时前
一个例子来说明Ada语言的实时性支持
开发语言·ada
Chrikk2 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*3 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue3 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang