Python初级面试语法<一>

可变对象与不可变对象

可变对象存的是地址,地址不变,但地址指向的值可以变(引用类型)。类型:list、dict、set等

不可变对象直接存值,值变了,就是另一个对象了(值类型)。int、float、tuple、string等

直接赋值,浅拷贝,深拷贝

在含有可变对象讨论这个问题更显得有意义。

直接赋值:直接传递对象的引用。浅拷贝,没有拷贝子对象,所以原始数据改变,子对象会改变。深拷贝,原始对象的改变不会造成深拷贝里任何子元素的改变。

__init__和__new__区别

__new__控制新实例的生成,__init__初始化一个新实例。可以用__new__实现单例模式。

设计模式

大话设计的工厂、代理、单例、观察者...... 。想起了这篇文章 20年前GoF提出的设计模式,对这个时代是否还有指导意义?

编码、解码

字符编码有GBK、ASCII、UTF-8、 Unicode等。encode和decode分别指编码和解码。明文--->选中一种编码加密-->密文,反之解码。

列表推导(list comprehension)和生成表达式(generator expression)的优劣

列表推导一下子生成完了列表,免去以后计算的时间,提高了性能,浪费了内存。而生成表达式延迟了列表的生成时间,需要它才一个个生成出来,节省了内存,降低了性能。

什么是装饰器?

装饰器就是把函数包装一下,为函数添加一些附加功能,装饰器就是一个函数,参数为被包装的函数,返回包装后的函数。

如果装饰器和被装饰的函数还有其他参数呢(也可以问如果在函数之后再进行装饰,该如何做)?

再包装一层 (个人觉得这里说得通俗易懂 https://zhidao.baidu.com/question/580801144.html)

使用装饰器实现单例模式的代码

def singleton(cls, *args, **kwargs):
    instance = {}
    def _instance():
        if cls not in instance:
            instance[cls] = cls(*args, *kwargs)
        return instance[cls]
    return _instance

使用装饰器和使用其他方法实现单例区别?

未能找到比较好的解答,求推荐。感觉这篇写得不错 https://www.cnblogs.com/huchong/p/8244279.html

手写一个邮箱验证正则

邮箱前缀允许中文、英文、数字 ,中间必须有@符号 ,最后必须是域名 域名名称 只可以是英文和符号_ -的组合。(题外话:没必要太纠结邮箱格式,邮箱格式一直都在变,以前不许有中文,现在都允许有了)

^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$

( 随意看看: ^表示开始,$表示结束。[ 标记匹配字符表达式的开始,] 标记匹配字符表达式的结束。

+表示匹配前面表达式的字符要出现一个或多个,\表示转义。( 和 )分别标记子表达式的开始和结束。)

多进程与多线程的区别

多线程之间可以共享资源,多进程各自独占资源。

CPU密集型适用多进程还是多线程?

多进程,原因:要提高CPU密集型操作效率,任务同时进行的数量尽可能等于CPU的核心数,使用多线程,也不能并行运算。

内存管理(或垃圾回收):引用计数/孤立引用环 /分代回收

指向该对象的引用总数为引用计数,对象之间相互引用形成了孤立引用环。

当某一代对象经历过垃圾回收,依然存活,那么它就被归入下一代对象,分代回收使得存活越就的对象越迟被回收。这篇内存管理讲得不错http://www.cnblogs.com/vamei/p/3232088.html

进程之间的通信方式

消息队列、信号量、管道、socket等

什么是协程?为什么比线程快?

一种程序组件,比线程快其一因为没有线程上下文切换的开销。https://www.cnblogs.com/zingp/p/5911537.html

 

问题来源:https://blog.csdn.net/csdnsevenn/article/details/79068624~

posted @ 2018-08-23 19:12  舒碧  阅读(459)  评论(0编辑  收藏  举报