⾮常全⾯的Python常见基础⾯试题及答案
⽬录
Python
1 Python垃圾回收机制是什么
2 元组和列表的区别
3 元组可以作为字典的key?
4 进程线程协程
4.1 进程
4.2 线程
4.3 协程
5 赋值、浅拷贝和深拷贝
6 GIL
7 列表去重
8 最常⽤的排序算法及其复杂度
8.1 冒泡排序
9 闭包
10 with
11 实例⽅法静态⽅法
12 迭代器和⽣成器
12.1 迭代器
12.2 ⽣成器
13 匿名函数
14 map reduce filter
14.1 map
14.2 reduce
14.3 filter
Django
1 什么是wsgi
2 django请求的⽣命周期
3 列举django的内置组件
4 列举django中间件的5个⽅法?以及django中间件的应⽤场景
5 简述什么是FBV和CBV
6 django的request对象是在什么时候创建的
7 如何在CBV添加装饰器
7.1 ⽅法
7.2 dispatch
7.3 类
8 列举django orm 中所有的⽅法
9 select_related 和 prefetch_related的区别
10 django 中 csrf 的实现机制
11 django中如何实现orm表中添加数据时创建⼀条⽇志记录
12 django缓存如何设置
13 django的缓存能使⽤redis吗?如果可以的话,如何配置
14 django路由系统中name的作⽤
15 django rest framework框架中都有那些组件
16 简述 django rest framework框架的认证流程
总结
Python
1 Python垃圾回收机制是什么
作为Python的使⽤者来说,Python中的垃圾回收主要以引⽤计数为主,再引⼊标记、清除,分代为辅来解决循环引⽤的问题。
⼀个对象被引⽤时,引⽤计数加1,当对象被del时,引⽤计数减去1,为0时,对象就被清除,⼀般情况下⽤户不会去操作Python 的垃圾回收机制,但它留有API接⼝。
2 元组和列表的区别
主要区别是列表是可变的,⽽元组是不可变的。
>>> mylist=[1,3,3]
svga动画是什么>>> mylist[1]=2
>>> mytuple=(1,3,3)
>>> mytuple[1]=2
Traceback (most recent call last):
File "<pyshell#97>", line 1, in <module>
3 元组可以作为字典的key?
⾸先⼀个对象能不能作为字典的key, 就取决于其有没有__hash__⽅法。所以除了容器对象(list/dict/set)和内部包含容器对象的tuple 是不可作为字典的key, 其他的对象都可以。
4 进程线程协程
4.1 进程
1、操作系统进⾏资源分配和调度的基本单位,多个进程之间相互独⽴
2、稳定性好,如果⼀个进程崩溃,不影响其他进程,但是进程消耗资源⼤,开启的进程数量有限制
4.2 线程
1、CPU进⾏资源分配和调度的基本单位,线程是进程的⼀部分,是⽐进程更⼩的能独⽴运⾏的基本单位,⼀个进程下的多个线程可以共享该进程的所有资源
2、如果IO操作密集,则可以多线程运⾏效率⾼,缺点是如果⼀个线程崩溃,都会造成进程的崩溃
4.3 协程
1、⼦程序调⽤总是⼀个⼊⼝,⼀次返回,调⽤顺序是明确的。⽽协程的调⽤和⼦程序不同。
2、协程看上去也是⼦程序,但执⾏过程中,在⼦程序内部可中断,然后转⽽执⾏别的⼦程序,在适当的时候再返回来接着执⾏。
5 赋值、浅拷贝和深拷贝
深拷贝就是将⼀个对象拷贝到另⼀个对象中,这意味着如果你对⼀个对象的拷贝做出改变时,不会影响原对象。在Python 中,我们使⽤函数deepcopy()执⾏深拷贝
浅拷贝则是将⼀个对象的引⽤拷贝到另⼀个对象上,所以如果我们在拷贝中改动,会影响到原对象
6 GIL
GIL是python的全局解释器锁,同⼀进程中假如有多个线程运⾏,⼀个线程在运⾏python程序的时候会霸占python解释器(加了⼀把锁即GIL),使该进程内的其他线程⽆法运⾏,等该线程运⾏完后其他线程才能运⾏。如果线程运⾏过程中遇到耗时操作,则解释器锁解开,使其他线程运⾏。所以在多线程中,线程的运⾏仍是有先后顺序的,并不是同时进⾏。
多进程中因为每个进程都能被系统分配资源,相当于每个进程有了⼀个python解释器,所以多进程可以实现多个进程的同时运⾏,缺点是进程系统资源开销⼤
7 列表去重
先通过转换为集合去重,在转列表
8 最常⽤的排序算法及其复杂度
8.1 冒泡排序
外层循环从1到n-1,内循环从当前外层的元素的下⼀个位置开始,依次和外层的元素⽐较,出现逆序就交换,通过与相邻元素的⽐较和交换来把⼩的数交换到最前⾯。
def bubbleSort(array):
if len(array) < 2:
return array
else:
isSorted = False
counter = 0
while not isSorted:
isSorted = True
for idx in range(len(array) - 1 - counter):
if array[idx] > array[idx + 1]:
isSorted = False
(array[idx + 1], array[idx]) = (array[idx], array[idx + 1])
counter += 1
return array
8.3 快速排序
通过⼀趟排序将待排记录分隔成独⽴的两部分,其中⼀部分记录的关键字均⽐另⼀部分的关键字⼩,则可分别对这两部分记录继续进⾏排序,以达到整个序列有序。
1、选定Pivot中⼼轴
2、从R指针开始,将⼤于Pivot的数字放在Pivot的右边
3、将⼩于Pivot的数字放在Pivot的左边
4、分别对左右⼦序列重复前三步操作
def quickSort(array):
print(array)
if len(array) < 2:
return array
else:
pivot_index = 0
pivot = array[pivot_index]
less_part = [i for i in array[pivot_index+1:] if i <= pivot]
large_part = [i for i in array[pivot_index+1:] if i > pivot]
return quickSort(less_part) + [pivot] + quickSort(large_part)
9 闭包
函数的返回值是函数对象,只有外部函数才可以对他进⾏访问,提⾼了安全性
10 with
with语句的使⽤,可以简化了代码,有效避免资源泄露的发⽣
打开⽂件在进⾏读写的时候可能会出现⼀些异常状况,如果按照常规的f.openpropylene
写法,我们需要try,except,finally,做异常判断,并且⽂件最终不管遇到什么情况,都要执⾏finally f.close()关闭⽂件,with⽅法帮我们实现了finally中f.close
11 实例⽅法静态⽅法
实例⽅法只能被实例调⽤,静态⽅法(@由staticmethod装饰器的⽅法)、类⽅法(由@classmethod装饰器的⽅法),可以被类或类的实例对象调⽤。
1、实例⽅法,第⼀个参数必须要默认传递实例对象,⼀般使⽤self。
2、静态⽅法,参数没有必要。
3、类⽅法,第⼀个参数必须要默认传递,⼀般使⽤cls。
12 迭代器和⽣成器
12.1 迭代器
迭代器是⼀个可以记住遍历的位置的对象。
迭代器对象从集合的第⼀个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的⽅法:iter() 和 next()。
字符串,列表或元组对象都可⽤于创建迭代器:
>>> list=[1,2,3,4]
>>> it = iter(list) # 创建迭代器对象
>>> print (next(it)) # 输出迭代器的下⼀个元素
1
>>> print (next(it))
2
>>>
12.2 ⽣成器
使⽤了yield的函数被称为⽣成器
⽣成器是⼀个返回迭代器的函数,只能⽤于迭代操作,更简单点理解⽣成器就是⼀个迭代器
在调⽤⽣成器运⾏的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运⾏信息,返回 yield 的值, 并在下⼀次执⾏next() ⽅法时从当前位置继续运⾏
13 匿名函数
print [(lambda x:x*x)(x)for x in range(5)]
[0, 1, 4, 9, 16, 25]
14 map reduce filter
14.1 map
对可迭代对象中的每个元素进⾏相同的操作
def fn(x):
return x+1
resp = map(fn,li)
print(list(resp))
[2, 3, 4]
14.2 reduce
从左到右对⼀个序列的项累计地应⽤有两个参数的函数,以此合并序列到⼀个单⼀值。(例如累加或累乘列表元素等等)from functools import reduce
nums=[1, 2, 3, 4]
web前端职责def fn(x, y):
return x * y
resp = reduce(fn, nums)
print(resp)
24
14.3 filter
filter函数⽤于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。该接收两个参数: 第⼀个为函数,第⼆个为序列,序列的每个元素作为参数传递给函数进⾏判,然后返回 True 或 False,最后将返回 True 的元素放到新列表
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def fn(a):
return a%2 == 1
newlist = filter(fn, a)
newlist = [i for i in newlist]
print(newlist)
## 输出: [1, 3, 5, 7, 9]
Django
1 什么是wsgi
Python Web Server Gateway Interface,翻译过来是Python web服务器⽹关接⼝,实际上就是⼀种协议,我们的应⽤(Django,Flask)实现了WSGI,就可以配合实现了WSGI(uWSGI,gunicorn)的服务器⼯作了
2 django请求的⽣命周期
前端发送请求
wsgi, 他就是socket服务端,⽤于接收⽤户请求并将请求进⾏初次封装,然后将请求交给web框架(Flask、Django)中间件处理请求,帮助我们对请求进⾏校验或在请求对象中添加其他相关数据,例如:csrf、request.session
路由匹配,根据当前请求的URL到视图函数,如果是FBV写法,通过判断method两类型,到对应的视图函数;如果是CBV写法,匹配成功后会⾃动去dispatch⽅法,然后Django会通过dispatch反射的⽅式到类中对应的⽅法并执⾏视图函数,在视图函数中进⾏业务逻辑的处理,可能涉及到:orm、view视图将数据渲染到template模板
视图函数执⾏完毕之后,会把客户端想要的数据返回给dispatch⽅法,由dispatch⽅法把数据返回经客户端
中间件处理响应
wsgi,将响应的内容发送给浏览器
matlab手机版下载破解中文浏览器渲染
3 列举django的内置组件
Admin: 对model中对应的数据表进⾏增删改查提供的组件
model:负责操作数据库
form:1.⽣成HTML代码 2.数据有效性校验 3校验信息返回并展⽰
ModelForm: 即⽤于数据库操作,也可⽤于⽤户请求的验证
4 列举django中间件的5个⽅法?以及django中间件的应⽤场景
process_request : 请求进来时,权限认证
process_view : 路由匹配之后,能够得到视图函数
python基础代码实例process_exception : 异常时执⾏
process_template_responseprocess : 模板渲染时执⾏
process_response : 请求有响应时执⾏
5 简述什么是FBV和CBV
FBV和CBV本质是⼀样的,基于函数的视图叫做FBV,基于类的视图叫做CBV
在python中使⽤CBV的优点:
提⾼了代码的复⽤性,可以使⽤⾯向对象的技术,⽐如Mixin(多继承)
可以⽤不同的函数针对不同的HTTP⽅法处理,⽽不是通过很多if判断,提⾼代码可读性
6 django的request对象是在什么时候创建的
class WSGIHandler(base.BaseHandler):
request = quest_class(environ)
请求⾛到WSGIHandler类的时候,执⾏cell⽅法,将environ封装成了request
7 如何在CBV添加装饰器
7.1 ⽅法
from django.utils.decorators import method_decorator
@method_decorator(check_login)
def post(self, request):
java中pojo类的主要特点...
7.2 dispatch
@method_decorator(check_login)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论