zoukankan      html  css  js  c++  java
  • python面试题

    一。Python是如何进行内存管理的?

    Python引入了一个机制:引用计数。
    python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收。
    总结一下对象会在以下情况下引用计数加1:
    1.对象被创建:x=4
    2.另外的别人被创建:y=x
    3.被作为参数传递给函数:foo(x)
    4.作为容器对象的一个元素:a=[1,x,'33']
    引用计数减少情况
    1.一个本地引用离开了它的作用域。比如上面的foo(x)函数结束时,x指向的对象引用减1。
    2.对象的别名被显式的销毁:del x ;或者del y
    3.对象的一个别名被赋值给其他对象:x=789
    4.对象从一个窗口对象中移除:myList.remove(x)
    5.窗口对象本身被销毁:del myList,或者窗口对象本身离开了作用域。

    垃圾回收
    1、当内存中有不再使用的部分时,垃圾收集器就会把他们清理掉。它会去检查那些引用计数为0的对象,然后清除其在内存的空间。当然除了引用计数为0的会被清除,还有一种情况也会被垃圾收集器清掉:当两个对象相互引用时,他们本身其他的引用已经为0了。
    2、垃圾回收机制还有一个循环垃圾回收器, 确保释放循环引用对象(a引用b, b引用a, 导致其引用计数永远不为0)。

    在Python中,许多时候申请的内存都是小块的内存,这些小块内存在申请后,很快又会被释放,由于这些内存的申请并不是为了创建对象,所以并没有对象一级的内存池机制。这就意味着Python在运行期间会大量地执行malloc和free的操作,频繁地在用户态和核心态之间进行切换,这将严重影响Python的执行效率。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。
    内存池机制

    Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。
    Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的 malloc。另外Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。

    在Python中,许多时候申请的内存都是小块的内存,这些小块内存在申请后,很快又会被释放,由于这些内存的申请并不是为了创建对象,所以并没有对象一级的内存池机制。这就意味着Python在运行期间会大量地执行malloc和free的操作,频繁地在用户态和核心态之间进行切换,这将严重影响 Python的执行效率。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。这也就是之前提到的 Pymalloc机制。

    二。去重 a=[1,2,4,2,4,5,6,5,7,8,9,0]

    方法一
    a = [1,2,3,3,4,2,3,4,5,6,1]
    news_a = []
    for id in a:
    if id not in news_a:
    news_a.append(id)
    print (news_a)
    方法二
    ids = [1,4,3,3,4,2,3,4,5,6,1]
    news_ids = list(set(ids))
    news_ids.sort(ids.index)

    三。什么是lambda函数?它有什么好处?

    什么是lamda函数?
    lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的函数。 (注意:lambda 函数不能包含命令,它们所包含的表达式不能超过一个)
    lamda函数有什么好处?
    1、lambda函数比较轻便,即用即仍,很适合需要完成一项功能,但是此功能只在此一处使用,连名字都很随意的情况下;
    2、匿名函数,一般用来给filter,map这样的函数式编程服务;
    3、作为回调函数,传递给某些应用,比如消息处理
    个人理解:

    1. 不需要定义函数名称(临时函数)

    2. 只做简单运算,并返回值,没有复杂的函数体


    四。介绍一下Python下range()函数的用法?

    如果需要迭代一个数字序列的话,可以使用range()函数,range()函数可以生成等差级数。

    如例:
    for i in range(5):
    print(i)
    这段代码将输出, 1, 2, 3, 4五个数字

    range(1)会产生1个值, 也可以让range()从另外一个数字开始,或者定义一个不同的增量,甚至是负数增量
    range(1, 10, 3) 增量为三, 返回值是列表即 [1,4,7]
    range(1,5) 增量为默认为1, 返回值是列表即 [1,2,3,4,5]

    range()和len()还可以一起使用来迭代一个索引序列
    例如:
    a = [‘Nina’, ‘Jim’, ‘Rainman’, ‘Hello’]
    for i in range(len(a)):
    print(i, a[i])

    返回值为:
    (0, ‘Nina’)
    (1, ‘Jim’)
    (2, ‘Rainan’)
    (3, ‘Hello’)


    五。用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别?


    当重复匹配一个正则表达式时候, 例如<.*>, 当程序执行匹配的时候,会返回最大的匹配值
    例如:
    import re
    s = ‘<html><head><title>Title</title>’
    print(re.match(‘<.*>’, s).group())
    会返回一个匹配<html><head><title>Title</title>而不是<html>

    import re
    s = ‘<html><head><title>Title</title>’
    print(re.match(‘<.*?>’, s).group())
    则会返回<html>
    <.*>这种匹配称作贪心匹配 <.*?>称作非贪心匹配

  • 相关阅读:
    MVC ORM 架构
    Kubernetes 第八章 Pod 控制器
    Kubernetes 第七章 Configure Liveness and Readiness Probes
    Kubernetes 第六章 pod 资源对象
    Kubernetes 第五章 YAML
    Kubernetes 核心组件
    Kubernetes 架构原理
    Kubernetes 第四章 kubectl
    Kubernetes 第三章 kubeadm
    yum 配置及yum 源配置
  • 原文地址:https://www.cnblogs.com/MRASdoubleZ/p/7806265.html
Copyright © 2011-2022 走看看