当前位置: 首页 > news >正文

上海网站备案一家做运动鞋的网站

上海网站备案,一家做运动鞋的网站,wordpress 网速,wordpress多站点 文章原标题#xff1a;Python面试宝典之基础篇-02我觉得你如果正在找工作#xff0c;我的Python面试宝典几期教程#xff0c;你一定得花时间看完了#xff01;题目006#xff1a;说说Python中的浅拷贝和深拷贝。点评#xff1a;这个题目本身出现的频率非常高#xff0c;但是…原标题Python面试宝典之基础篇-02我觉得你如果正在找工作我的Python面试宝典几期教程你一定得花时间看完了题目006说说Python中的浅拷贝和深拷贝。点评这个题目本身出现的频率非常高但是就题论题而言没有什么技术含量。对于这种面试题在回答的时候一定要让你的答案能够超出面试官的预期这样才能获得更好的印象分。所以回答这个题目的要点不仅仅是能够说出浅拷贝和深拷贝的区别深拷贝的时候可能遇到的两大问题还要说出Python标准库对浅拷贝和深拷贝的支持然后可以说说列表、字典如何实现拷贝操作以及如何通过序列化和反序列的方式实现深拷贝最后还可以提到设计模式中的原型模式以及它在项目中的应用。浅拷贝通常只复制对象本身而深拷贝不仅会复制对象还会递归的复制对象所关联的对象。深拷贝可能会遇到两个问题一是一个对象如果直接或间接的引用了自身会导致无休止的递归拷贝二是深拷贝可能对原本设计为多个对象共享的数据也进行拷贝。Python通过copy模块中的copy和deepcopy函数来实现浅拷贝和深拷贝操作其中deepcopy可以通过memo字典来保存已经拷贝过的对象从而避免刚才所说的自引用递归问题此外可以通过copyreg模块的pickle函数来定制指定类型对象的拷贝行为。deepcopy函数的本质其实就是对象的一次序列化和一次返回序列化面试题中还考过用自定义函数实现对象的深拷贝操作显然我们可以使用pickle模块的dumps和loads来做到代码如下所示。import picklemy_deep_copy lambda obj: pickle.loads(pickle.dumps(obj))列表的切片操作[:]相当于实现了列表对象的浅拷贝而字典的copy方法可以实现字典对象的浅拷贝。对象拷贝其实是更为快捷的创建对象的方式。在Python中通过构造器创建对象属于两阶段构造首先是分配内存空间然后是初始化。在创建对象时我们也可以基于“原型”的对象来创建新对象通过对原型对象的拷贝(复制内存)就完成了对象的创建和初始化这种做法其实更加高效这也就是设计模式中的原型模式。我们可以通过元类的方式来实现原型模式代码如下所示。import copyclass PrototypeMeta(type):实现原型模式的元类def __init__(cls, *args, **kwargs):super().__init__(*args, **kwargs)# 为对象绑定clone方法来实现对象拷贝cls.clone lambda self, is_deepTrue: \copy.deepcopy(self) if is_deep else copy.copy(self)class Person(metaclassPrototypeMeta):passp1 Person()p2 p1.clone() # 深拷贝p3 p1.clone(is_deepFalse) # 浅拷贝题目007Python是如何实现内存管理的点评当面试官问到这个问题的时候一个展示自己的机会就摆在面前了。你要先反问面试官“你说的是官方的CPython解释器吗”。这个反问可以展示出你了解过Python解释器的不同的实现版本而且你也知道面试官想问的是CPython。当然很多面试官对不同的Python解释器底层实现到底有什么差别也没有概念。所以千万不要觉得面试官一定比你强怀揣着这份自信可以让你更好的完成面试。Python提供了自动化的内存管理也就是说内存空间的分配与释放都是由Python解释器在运行时自动进行的自动管理内存功能极大的减轻程序员的工作负担也能够帮助程序员在一定程度上解决内存泄露的问题。以CPython解释器为例它的内存管理有三个关键点引用计数、标记清理、分代收集。引用计数对于CPython解释器来说Python中的每一个对象其实就是PyObject结构体它的内部有一个名为ob_refcnt 的引用计数器成员变量。程序在运行的过程中ob_refcnt的值会被更新并藉此来反映引用有多少个变量引用到该对象。当对象的引用计数值为0时它的内存就会被释放掉。typedef struct _object {_PyObject_HEAD_EXTRAPy_ssize_t ob_refcnt;struct _typeobject *ob_type;} PyObject;以下情况会导致引用计数加1对象被创建对象被引用对象作为参数传入到一个函数中对象作为元素存储到一个容器中以下情况会导致引用计数减1用del语句显示删除对象引用对象引用被重新赋值其他对象一个对象离开它所在的作用域持有该对象的容器自身被销毁持有该对象的容器删除该对象可以通过sys模块的getrefcount函数来获得对象的引用计数。引用计数的内存管理方式在遇到循环引用的时候就会出现致命伤因此需要其他的垃圾回收算法对其进行补充。标记清理CPython使用了“标记-清理”(Mark and Sweep)算法解决容器类型可能产生的循环引用问题。该算法在垃圾回收时分为两个阶段标记阶段遍历所有的对象如果对象是可达的(被其他对象引用)那么就标记该对象为可达清除阶段再次遍历对象如果发现某个对象没有标记为可达则就将其回收。CPython底层维护了两个双端链表一个链表存放着需要被扫描的容器对象(姑且称之为链表A)另一个链表存放着临时不可达对象(姑且称之为链表B)。为了实现“标记-清理”算法链表中的每个节点除了有记录当前引用计数的ref_count变量外还有一个gc_ref变量这个gc_ref是ref_count的一个副本所以初始值为ref_count的大小。执行垃圾回收时首先遍历链表A中的节点并且将当前对象所引用的所有对象的gc_ref减1这一步主要作用是解除循环引用对引用计数的影响。再次遍历链表A中的节点如果节点的gc_ref值为0那么这个对象就被标记为“暂时不可达” (GC_TENTATIVELY_UNREACHABLE) 并被移动到链表B中如果节点的gc_ref不为0那么这个对象就会被标记为“可达“ (GC_REACHABLE)对于”可达“对象还要递归的将该节点可以到达的节点标记为”可达“链表B中被标记为”可达“的节点要重新放回到链表A中。在两次遍历之后链表B中的节点就是需要释放内存的节点。分代回收在循环引用对象的回收中整个应用程序会被暂停为了减少应用程序暂停的时间Python 通过分代回收(空间换时间)的方法提高垃圾回收效率。分代回收的基本思想是对象存在的时间越长是垃圾的可能性就越小应该尽量不对这样的对象进行垃圾回收。CPython将对象分为三种世代分别记为0、1、2每一个新生对象都在第0代中如果该对象在一轮垃圾回收扫描中存活下来那么它将被移到第1代中存在于第1代的对象将较少的被垃圾回收扫描到如果在对第1代进行垃圾回收扫描时这个对象又存活下来那么它将被移至第2代中在那里它被垃圾回收扫描的次数将会更少。分代回收扫描的门限值可以通过gc模块的get_threshold函数来获得该函数返回一个三元组分别表示多少次内存分配操作后会执行0代垃圾回收多少次0代垃圾回收后会执行1代垃圾回收多少次1代垃圾回收后会执行2代垃圾回收。需要说明的是如果执行一次2代垃圾回收那么比它年轻的代都要执行垃圾回收。如果想修改这几个门限值可以通过gc模块的set_threshold函数来做到。题目008说一下你对Python中迭代器和生成器的理解。点评很多人面试者都会写迭代器和生成器但是却无法准确的解释什么是迭代器和生成器。如果你也有同样的困惑可以参考下面的回答。迭代器是实现了迭代器协议的对象。跟其他编程语言不通Python中没有用于定义协议或表示约定的关键字像interface、protocol这些单词并不在Python语言的关键字列表中。Python语言通过魔法方法来表示约定也就是我们所说的协议而__next__和__iter__这两个魔法方法就代表了迭代器协议。生成器是迭代器的语法升级版本可以用更为简单的代码来实现一个迭代器。面试中经常会让面试者写生成斐波那契数列的迭代器下面给出参考代码其他的迭代器可以如法炮制。class Fib(object):def __init__(self, num):self.num numself.a, self.b 0, 1self.idx 0def __iter__(self):return selfdef __next__(self):if self.idx self.num:self.a, self.b self.b, self.a self.bself.idx 1return self.araise StopIteration()如果用生成器的语法来改写上面的代码代码会简单优雅很多。def fib(num):a, b 0, 1for _ in range(num):a, b b, a byield a可以通过for-in循环从迭代器对象中取出值也可以使用next函数取出迭代器对象中的下一个值。题目009正则表达式的match方法和search方法有什么区别点评正则表达式是字符串处理的重要工具所以也是面试中经常考察的知识点。在Python中使用正则表达式有两种方式一种是直接调用re模块中的函数传入正则表达式和需要处理的字符串一种是先通过re模块的compile函数创建正则表达式对象然后再通过对象调用方法并传入需要处理的字符串。如果一个正则表达式被频繁的使用我们推荐后面这种方式它会减少频繁编译同一个正则表达式所造成的开销。match方法是从字符串的起始位置进行正则表达式匹配返回Match对象或None。search方法会扫描整个字符串来找寻匹配的模式同样也是返回Match对象或None。题目010下面这段代码的执行结果是什么。def multiply():return [lambda x: i * x for i in range(4)]print([m(100) for m in multiply()])运行结果[300, 300, 300, 300]上面代码的运行结果很容易被误判为[0, 100, 200, 300]。首先需要注意的是multiply函数用生成式语法返回了一个列表列表中保存了4个Lambda函数这4个Lambda函数会返回传入的参数乘以i的结果。需要注意的是这里有闭包(closure)现象multiply函数中的局部变量i的生命周期被延展了由于i最终的值是3所以通过m(100)调列表中的Lambda函数时会返回300而且4个调用都是如此。如果想得到[0, 100, 200, 300]这个结果可以按照下面几种方式来修改multiply函数。方法一使用生成器让函数获得i的当前值。def multiply():return (lambda x: i * x for i in range(4))print([m(100) for m in multiply()])或者def multiply():for i in range(4):yield lambda x: x * iprint([m(100) for m in multiply()])方法二使用偏函数彻底避开闭包现象。from functools import partialfrom operator import __mul__def multiply():return [partial(__mul__, i) for i in range(4)]print([m(100) for m in multiply()])温馨提示Python面试宝典会持续更新从基础到项目实战的内容都会慢慢覆盖到。虽然每天只更新5个题目但是每道题扩散出的信息量还是比较大的希望对找工作的小伙伴所有帮助。责任编辑
http://wiki.neutronadmin.com/news/303643/

相关文章:

  • 竞价单页网站模板做网站首页文字排版技巧
  • 义乌做站外推广的公司手机凡客网
  • 网站申请微信登录wordpress 评论回信
  • 免费的网站托管商城网站 免费开源
  • 网站后台登入模板做网站 sql 用哪种
  • discuz论坛应用中心阳江seo网站推广
  • 个人备案网站类型wordpress建网站详细教程
  • 网站建设属于什么经济科目新冠流行最新消息
  • 做论坛网站的元素手机端 网站 模板
  • 北京天润建设工程有限公司网站阿里云主机 多个网站
  • 大连网站制作网站桂林本地网站
  • 2010年4月江苏省03340网站建设与管理答案上海公司注册核名查询
  • 株洲做网站优化青海中小企业网站建设
  • 推广方式方法网站优化 合同
  • 蛋糕网站案例网络营销推广的平台
  • 可以网上做单的网站有哪些电脑更新wordpress
  • 深圳招聘网站排名东莞市专注网站建设服务机构
  • 网站建设考评表环保空调东莞网站建设
  • 网站怎么做站长统计在旅行社做网站运营
  • 祥云平台网站建设网站搭建教学
  • 方案网站有哪些html5网站源代码
  • 建立网站需要准备的材料广州华优_网站建设公司
  • 石家庄行业网站给军方做网站套模板行不行
  • ci策划 网站开发冬夜主题wordpress
  • 网站所有页面只显示域名平湖市住房和城乡规划建设局网站
  • wap企业网站linux网站开发工具
  • wordpress diy插件广州seo网站多少钱
  • 网站建设咨询有客诚信网站建设咨询泰安市住房和城乡建设部网站
  • 丽水开发区建设局网站廉租房苏州十大广告公司
  • seo站内优化公司知乎类 wordpress