作为Python的使用者来说,Python中的试题垃圾回收主要以引用计数为主,再引入标记、常见础面清除,试题分代为辅来解决循环引用的常见础面问题。
一个对象被引用时,试题引用计数加1,常见础面当对象被del时,试题引用计数减去1,常见础面为0时,试题对象就被清除,常见础面一般情况下用户不会去操作Python的试题垃圾回收机制,但它留有API接口。常见础面
主要区别是列表是可变的,而元组是常见础面不可变的。
>>> mylist=[1,3,3] >>> mylist[1]=2 >>> mytuple=(1,3,3) >>> mytuple[1]=2 Traceback (most recent call last): File "<pyshell#97>", line 1, in <module>首先一个对象能不能作为字典的key, 就取决于其有没有__hash__方法。 所以除了容器对象(list/dict/set)和内部包含容器对象的tuple是不可作为字典的key,其他的亿华云计算对象都可以。
操作系统进行资源分配和调度的基本单位,多个进程之间相互独立
稳定性好,如果一个进程崩溃,不影响其他进程,但是进程消耗资源大,开启的进程数量有限制
线程CPU进行资源分配和调度的基本单位,线程是进程的一部分,是比进程更小的能独立运行的基本单位,一个进程下的多个线程可以共享该进程的所有资源
如果IO操作密集,则可以多线程运行效率高,缺点是如果一个线程崩溃,都会造成进程的崩溃
协程子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。服务器托管
协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。
深拷贝就是将一个对象拷贝到另一个对象中,这意味着如果你对一个对象的拷贝做出改变时,不会影响原对象。在Python中,我们使用函数deepcopy()执行深拷贝。
浅拷贝则是将一个对象的引用拷贝到另一个对象上,所以如果我们在拷贝中改动,会影响到原对象。
GIL是Python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行Python程序的时候会霸占Python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。亿华云所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。
多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个Python解释器,所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大。
先通过转换为集合去重,在转列表。
最常用的排序算法及其复杂度
冒泡排序
外层循环从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快速排序
通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
选定Pivot中心轴 从R指针开始,将大于Pivot的数字放在Pivot的右边 将小于Pivot的数字放在Pivot的左边 分别对左右子序列重复前三步操作 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)函数的返回值是函数对象,只有外部函数才可以对他进行访问,提高了安全性
with
with语句的使用,可以简化代码,有效避免资源泄露的发生。
打开文件在进行读写的时候可能会出现一些异常状况,如果按照常规的f.open写法,我们需要try,except,finally,做异常判断,并且文件最终不管遇到什么情况,都要执行finally f.close()关闭文件,with方法帮我们实现了finally中f.close。
实例方法只能被实例调用,静态方法(@由staticmethod装饰器的方法)、类方法(由@classmethod装饰器的方法),可以被类或类的实例对象调用。
实例方法,第一个参数必须要默认传递实例对象,一般使用self。 静态方法,参数没有必要。 类方法,第一个参数必须要默认传递,一般使用cls。迭代器
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter()和next()。
字符串,列表或元组对象都可用于创建迭代器:
>>> list=[1,2,3,4] >>> it = iter(list) # 创建迭代器对象 >>> print (next(it)) # 输出迭代器的下一个元素 1 >>> print (next(it)) 2 >>>生成器
使用了yield的函数被称为生成器。
生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器,在调用生成器运行的过程中,每次遇到yield时函数会暂停并保存当前所有的运行信息,返回yield的值,并在下一次执行next()方法时从当前位置继续运行
Map
对可迭代对象中的每个元素进行相同的操作。
def fn(x): return x+1 resp = map(fn,li) print(list(resp)) [2, 3, 4]Reduce
从左到右对一个序列的项累计地应用有两个参数的函数,以此合并序列到一个单一值。(例如累加或累乘列表元素等等)
from functools import reduce nums=[1, 2, 3, 4] def fn(x, y): return x * y resp = reduce(fn, nums) print(resp) 24Filter
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]Python Web Server Gateway Interface,翻译过来是Python Web服务器网关接口,实际上就是一种协议,我们的应用(Django,Flask)实现了WSGI,就可以配合实现了WSGI(uWSGI,gunicorn)的服务器工作了
FBV和CBV本质是一样的,基于函数的视图叫做FBV,基于类的视图叫做CBV。
在Python中使用CBV的优点:
提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承) 可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性请求走到WSGIHandler类的时候,执行cell方法,将environ封装成了Request。
方法
from django.utils.decorators import method_decorator @method_decorator(check_login) def post(self, request): ...Dispatch
@method_decorator(check_login) def dispatch(self, request, *args, **kwargs):类
@method_decorator(check_login, name="get") @method_decorator(check_login, name="post") class HomeView(View): ...有外键存在时,可以很好的减少数据库请求的次数,提高性能,select_related通过多表join关联查询,一次性获得所有数据,只执行一次SQL查询prefetch_related分别查询每个表,然后根据它们之间的关系进行处理,执行两次查询。
主要是通过name的值,来查找url地址,可以理解为反射作用。在html模板中使用name来反射url优势就是后期url规则发生改变之后,只需调整urls.py即可,所有的模板文件都不需要修改。