• 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\

    1. import json, datetime
    2. from json import JSONEncoder
    3. class ComplexEncoder(JSONEncoder):
    4. def default(self, obj):
    5. if isinstance(obj, datetime.datetime):
    6. return obj.strftime('%Y-%m-%d %H:%M:%S')
    7. else:
    8. return super(ComplexEncoder, self).default(obj)
    9. d = {'name': 'alex', 'data': datetime.datetime.now()}
    10. print(json.dumps(d, cls=ComplexEncoder))
    11. # {"name": "alex", "data": "2018-09-28 14:49:42"}

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

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

    1. import json
    2. a = json.dumps({"ddf": "你好"}, ensure_ascii=False)
    3. print(a)
    4. # {"ddf": "你好"}

  • 相关阅读:
    【PowerQuery】PowerBI Pro账户的自动刷新
    揭秘C语言的心脏:深入探索指针与数组的奥秘
    JAVA毕业设计河南口腔医疗机构线上服务系统计算机源码+lw文档+系统+调试部署+数据库
    【uni-app】Pinia 持久化
    入侵检测——WebCrack
    《探索Stable Diffusion:AI绘画的创意之路与实战秘籍》
    高危漏洞分析|CVE-2022-42920 Apache Commons BCEL 越界写漏洞
    Linux python2升级到python3
    leetcode 1303 求团队人数(postgresql)
    java计算机毕业设计小区物业管理系统源程序+mysql+系统+lw文档+远程调试
  • 原文地址:https://blog.csdn.net/li2437948121/article/details/139813588