python写的快速排序算法:
def qsort(seq):
if seq==[]:
return[]
else:
pivot=seq[0]
lesser=qsort([x for x in seq[1:] if x <pivot])
greater=qsort([x for x in seq[1:] if x>=pivot])
return lesser+[pivot]+greater
if __name__=='__main__':
seq=[5,6,78,9,0,-1,2,3,-65,12]
print(qsort(seq))
python写的冒泡排序算法,基本类似c++:
def bubbleSort(nums):
for i in range(len(nums)-1):# 这个循环负责设置冒泡排序进行的次数
for j in range(len(nums)-i-1):# j为列表下标
if nums[j]>nums[j+1]:
nums[j],nums[j+1]=nums[j+1],nums[j]
return nums
nums=[5,2,45,6,8,3,1]
print(bubbleSort(nums))
迭代器:
是访问集合元素的一种方式,从集合的第一个元素开始访问,直到所有元素被访问结束。其优点是不需要事先准备好整个迭代过程中的所有元素,仅在迭代到某个元素时才开始计算该元素。适合遍历比较巨大的集合。iter():方法返回迭代器本身, next():方法用于返回容器中下一个元素或数据。
生成器:
带有yield的函数不再是一个普通函数,而是一个生成器。当函数被调用时,返回一个生成器对象。不像一般函数在生成值后退出,生成器函数在生成值后会自动挂起并暂停他们的执行状态。
闭包:
闭包可以实现先将一个参数传递给一个函数,而并不立即执行,以达到延迟求值的目的。满足以下三个条件:必须有一个内嵌函数;内嵌函数必须引用外部函数中变量;外部函数返回值必须是内嵌函数。
装饰器:
装饰器是一个工厂函数,接受一个函数作为参数,然后返回一个新函数,其闭包中包含被装饰的函数。有了装饰器,可以提取大量函数中与本身功能无关的类似代码 ( 这块在Flask中用于定义路由的@app.route,就是一个很好的例子),达到代码重用的目的。可应用于插入日志、性能测试、事务处理等方面。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
进程:是资源分配的最小单位,创建和销毁开销较大;
线程:是CPU调度的最小单位,开销小,切换速度快;
Python中由于全局锁 (GIL) 的存在导致,同一时间只有一个获得GIL的线程在跑,其他线程则处于等待状态,这导致了多线程只是在做分时切换,并不能利用多核。
Cookie:存储在客户端,用于跟踪会话,保存用户偏好设置和用户名密码等,不安全;
Session:存储在服务器端,用于跟踪会话,安全。
在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象。
Python其实有3个方法,即静态方法(staticmethod),类方法(classmethod)和实例方法,
python的自省:
简单一句就是运行时能够获得对象的类型.比如type(),dir(),getattr(),hasattr(),isinstance().
字典推导式:
d = {key: value for (key, value) in iterable}
is是对比地址,==是对比值
线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,说白了就是一个核只能在同一时间运行一个线程。解决办法就是多进程和下面的协程(协程也只是单CPU,但是能减小切换代价提升性能).
协程:
简单点说协程是进程和线程的升级版,进程和线程都面临着内核态和用户态的切换问题而耗费许多切换时间,而协程就是用户自己控制切换的时机,不再需要陷入系统的内核态。Python里最常见的yield就是协程的思想
垃圾回收机制:
Python GC主要使用引用计数(reference counting)来跟踪和回收垃圾。在引用计数的基础上,通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用问题,通过“分代回收”(generation collection)以空间换时间的方法提高垃圾回收效率。