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": "你好"}
相关推荐
Fairy_sevenseven11 分钟前
【二十八】【QT开发应用】模拟WPS Tab
开发语言·qt·wps
蜡笔小新星19 分钟前
Python Kivy库学习路线
开发语言·网络·经验分享·python·学习
凯子坚持 c19 分钟前
C语言复习概要(三)
c语言·开发语言
无限大.31 分钟前
c语言200例 067
java·c语言·开发语言
余炜yw32 分钟前
【Java序列化器】Java 中常用序列化器的探索与实践
java·开发语言
篝火悟者34 分钟前
问题-python-运行报错-SyntaxError: Non-UTF-8 code starting with ‘\xd5‘ in file 汉字编码问题
开发语言·python
Death20036 分钟前
Qt 中的 QListWidget、QTreeWidget 和 QTableWidget:简化的数据展示控件
c语言·开发语言·c++·qt·c#
六点半88838 分钟前
【C++】速通涉及 “vector” 的经典OJ编程题
开发语言·c++·算法·青少年编程·推荐算法
惜.己38 分钟前
javaScript基础(8个案例+代码+效果图)
开发语言·前端·javascript·vscode·css3·html5
niu_sama41 分钟前
基于muduo库函数实现protobuf协议的通信
开发语言·qt