Python后端工程师面试题(附答案)终结版
之前在网上搜集python面试题,这是最流行的一个版本。但是没有答案,故自己搜集或回答了一部分。现分享给大家,有些题目
回答的并不准确,望各路大神纠正,完善
python语法以及其他基础部分
1.可变与不可变类型;
不可变类型(数字、字符串、元组、不可变集合)不可变类型不能被修改。
可变类型(列表、字典、可变集合)
2.浅拷贝与深拷贝的实现方式、区别;deepcopy如果你来设计,如何实现;
基本类型 :
基本类型在内存中分别占有固定大小的空间,他们的值保存在栈空间,我们是通过按值来访
问的。
extensive词根引用类型 :
引用类型,值大小不固定,栈内存中存放地址指向堆内存中的对象。是按引用访问的。
栈内存中存放的只是该对象的访问地址,在堆内存中为这个值分配空间。由于这种值的大小不固定,
因此不能把它们保存到栈内存中。但内存地址大小的固定的,因此可以将内存地址保存在栈内存中。
这样,当查询引用类型的变量时, 先从栈中读取内存地址, 然后再通过地址到堆中的值。对于这种,
我们把它叫做按引用访问。
浅拷贝只复制指向某个对象的引用地址,而不复制对象本身(只复制一层对象的属性),新旧对象还是共享同一块内存。
但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
浅复制只复制一层对象的属性,而深复制则递归复制了所有层级。
import copy as cp
L=[1,[2,3]]
py(L) #浅拷贝: 只是引用,并不会开辟新的内存空间,
L1与L指向同一片内存空间。L改变,L1也会锁着改变。
L2=cp.deepcopy(L) #深拷贝:会为数据重新开辟一片内存空间,L的变化不会影响L2。
3.__new__() 与 __init__()的区别;
_new_作用于_init_之前。前者可以决定是否调用后者,或者说可以决定调用哪个类的_init_方法。
购物车代码设计首先要知道在面向对象编程中,实例化基本遵循创建实例对象、初始化实例对象、最后返回实例对象这么一个过程。
Python 中的 _new_ 方法负责创建一个实例对象,_init_ 方法负责将该实例对象进行初始化;
tbody如何设置滚动条4.你知道几种设计模式;
单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点,例如框架中的数据库连接
装饰器模式:不修改元类代码和继承的情况下动态扩展类的功能,例如框架中的每个controller文件会提供before和after方法。
迭代器模式: 提供一个方法顺序访问一个聚合对象中各个元素,在PHP中将继承 Iterator 类
命令模式: 将”请求”封闭成对象, 以便使用不同的请求,队列或者日志来参数化其他对象. 命令模式也支持可撤销的操作.
5.编码和解码你了解过么;
数据通过编码decode转换成Unicode编码,编码的同时会将数据变成byte类型,通过解码encode转换为utf-8。
6.列表推导list comprehension和生成器的优劣;
[expr for iter_var in iterable] 列表推导式是将所有的值一次性加载到内存中
(expr for iter_var in iterable)
在大数据量处理时,生成器表达式的优势就体现出来了,因为它的内存使用方式更好,
效率更高,它并不创建一个列表,只是返回一个生成器。
7.什么是装饰器;如果想在函数之后进行装饰,应该怎么做;
装饰器是一个函数,这个函数的主要作用是包装另一个函数或类
包装的目的是在不改变原函数名的情况下改变被包装对象的行为。
接收一个函数,内部对其包装,然后返回一个新函数,这样子动态的增强函数功能
通过高阶函数传递函数参数,新函数添加旧函数的需求,然后执行旧函数。
8.手写个使用装饰器实现的单例模式;
该模式的主要目的是确保某一个类只有一个实例存在。
from functools import warps
def My_decorate(f):
@warps(f)
def fn(*args,**kwargs):
print('decorate called')
return f(*args,**kwargs)
return fn
@My_decorate
def fx():
pring('fx called')
fx()
9.使用装饰器的单例和使用其他方法的单例,在后续使用中,有何区别;
使用装饰器单例属性不会被覆盖。因为装饰器单例模式是直接返回之前生成的对象,
并不会重新初始化对象。像new方法构建的单例模式会重新调用init方法,为实例重新初始化属性。
10.手写:正则邮箱地址;
pattern = '[a-zA-Z0-9_.-]+@[a-zA-Z0-9]+\.[a-z]'   
c语言标准库源码在哪看匹配身份证:
pattern = '(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)'
pattern = '^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$'
11.介绍下垃圾回收:引用计数/分代回收/孤立引用环;
垃圾回收:python解释器对正在使用的对象保持计数,当某个对像的引用计数降为0时,垃圾收集器就可以释放
该对象,获取分配的内存。当分配对象和取消分配对象的差值高于阈值时垃圾回收才会启动。
分代回收:python将所有的对象分为0,1,2三代。所有的新建对象都是0代对象。当某一代对象经历过垃圾回收,
依然存活,那么它就被归入下一代对象。垃圾回收启动时,一定会扫描所有的0代对象。
如果0代经过一定次数垃圾回收,那么就启动对0代和1代的扫描清理。
sql查询分数最高的学生
当1代也经历了一定次数的垃圾回收后,那么会启动对0,1,2,即对所有对象进行扫描。
孤立引用环:
python编程基础教程课后答案12.多进程与多线程的区别;CPU密集型适合用什么;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。