每日分享
People will forget what you said, people will forget what you did, but people will never forget how you made them feel.
人们会忘记你所说的话,也会忘记你做的事,但是人们不会忘记你带给他们的感觉。
小闫语录:
昨日夜观天象,东南方有异象显现,低头思,今天不宜瞎说。。。
python技术面试题(十七)
1.@classmethod和@staticmethod?
@classmethod
用来标识类方法,对于类方法,第一个参数必须是类对象,一般用 cls
作为第一个参数。 cls
参数用来调用类的属性,类的方法等等。类方法可以通过实例对象和类对象去访问。类方法还可以对类属性进行修改。
@staticmethod
修饰的方法为静态方法,该方法不强制要求传递参数,可以通过对象和类来访问。在静态方法中引用类属性的话,必须通过类来引用。
2.谈一谈python中的元类
答:一般来说,我们都是在代码里定义类,用定义的类来创建实例。而使用元类,步骤有些不同,定义元类,用元类创建类,再使用创建出来的类来创建实例。元类的主要目的就是当创建类时能够自动地改变类。
3.with open执行原理
答:使用了with上下文管理器。上下文管理器的工作机制便是使用了python的方法: __enter__
和 __exit__
两个方法。
上下文管理器简单的理解就是一个操作环境。在文件操作时,需要打开、关闭文件,而在文件进行读写操作时,就处于文件操作的上下文中,也就是文件操作环境中。
__enter__
方法会在执行 with 后面的语句时执行,一般用来处理操作前的内容。比如一些创建对象,初始化等。在with open的时候就是打开文件的操作。
__exit__
方法会在 with 内的代码执行完毕后执行,一般用来处理一些善后收尾工作,比如文件的关闭,数据库的关闭等。在with open的时候就是关闭文件的操作。
自定义一个上下文管理器,模拟文件打开过程:
class MyOpen(object): def __init__(self,file,mode): self.__file = file self.__mode = mode def __enter__(self): print('__enter__run... open the file') self.__handle = open(self.__file,self.__mode) return self.__handle def __exit__(self,exc_type,exc_val,exc_tb): print('__exit__.run... close the file') self.__handle.close() with MyOpen('test','w') as f: f.write('欢迎关注 <小闫笔记>') print('over')
4.状态码中301和302的区别?
答:301是永久重定向,302是临时重定向。
5.python中的列表底层实现原理
python中的列表底层采用了顺序表。那么什么是顺序表呢?顺序表是线性表存储的一种方式。那么什么是线性表呢?(怎么问题这么多....)线性表就是存储着一些元素的集合(不光有元素,还有元素的顺序关系)。
为了了解底层实现原理,首先来了解顺序表吧。假如班主任在统计班级同学信息,统计完之后在教室前面贴了一张表,表上写的是班级能容纳学生的数量以及现有同学的数量,教室和这张表就构成了顺序表。
一个顺序表的完整信息包括两部分,一部分是表中的元素集合,另一部分是为实现正确操作而需记录的信息,即有关表的整体情况的信息,这部分信息主要包括元素存储区的容量和当前表中已有的元素个数两项。
了解完顺序表之后,我们了解一下顺序表的实现方式。顺序表实现方式有两种,分别是一体式结构和分离式结构。(点击下图即可查看超清图片)
一体式就是教室前面的那张表被用胶水粘死了,他和教室融为了一体,在教室前面。
一体式结构,存储表信息的单元与元素存储区以连续的方式安排在一块存储区里,两部分数据的整体形成一个完整的顺序表对象。
分离式就是表在班主任办公桌上,教室在.....(不管你爱还是不爱,教室就在那里...),万一换教室了,班主任改一下表上的信息就好了。如果是一体式,哈哈哈,再做一张表吧,总不能为了看班级的信息,天天跑去改为了2班的教室吧.....
上面涉及到了元素存储区的一个替换。就是假如我们想更换数据区,也就是教室要从南校区搬迁到北校区了。那张表十分珍贵,被班主任糊涂的写在了乾隆年间的一张草纸上,世界上再无第二张,但是又被死死粘在了墙上,怎么办,教室和那张纸一起搬走(有点暴力哈,不要和我说为什么不把墙皮弄下来....我任性,我就要整体搬迁,谁让是我写的故事呢....哼),这就是一体式结构的元素存储区替换。分离式呢?教室搬迁到了北校区,但是老师的办公室在南校区,这张表还在老师的办公桌上,老师只需要小手一挥,将南校区1班改为北校区1班即可。
一体式结构由于顺序表信息区与数据区连续存储在一起,所以若想更换数据区,则只能整体搬迁,即整个顺序表对象(指存储顺序表的结构信息的区域)改变了。
分离式结构若想更换数据区,只需将表信息区中的数据区链接地址更新即可,而该顺序表对象不变。
好了,了解完了,回归正题。python中的列表就是采取了分离式技术实现的动态顺序表。之所以你可以根据下标随意的访问和更新数据,时间复杂度为O(1),特别快,是因为顺序表中的元素保存在一块连续的存储区中。为了可以任意加入元素,而且在不断加入元素过程中,表对象的id不变,那就只能采用分离式实现。也就是班主任的表就在班主任办公桌上,不变。当班级里的学生太多了需要换教室,随便换,不需要暴力的将整个房子搬走了。