一、二分排序
def ef(a): for i in range(1,len(a)): s=0 h=i-1 k=a[i] while s<=h: n = (s + h) // 2 if k<a[n]: h=n-1 else:s=n+1 a.pop(i) a.insert(s,k) return a print(ef([1,6,3,66,8,4]))
二、推导
推导式是Python中很强大的、很受欢迎的特性,具有语言简洁,速度快等优点。推导式包括:
1.列表推导式 numbers = [x for x in range(100) if x % 3 == 0]
2.字典推导式
mcase = {'a': 10, 'b': 34}
mcase_frequency = {v: k for k, v in mcase.items()}
3.集合推导式
squared = {x**2 for x in [1, 1, 2]}
推导中可以写多个for循环、可以写函数
三、生成器
第一种方式:将列表的[]改为(),里面可以写推导生成器只要调用next()方法即可得到下一个值,到最后一个后异常(StopIteration)退出用表达式做生成器
test=(x for x in rang(10))
next(test)或test.__next__()
第二种方式:通过裴波那切序列讲解:将print换成yield,每次生成一个值但是调用方法时没有结果
在方法内使用yield做生成器,这样调用此方法时,会得出一个结果:generator object...
然后也是可以调用next()每到yield时,就会停止,返回当前这个值,可以一次一次next()调用,看看运行过程
使用列表推导,将会一次产生所有结果:
squares = [x**2 for x in range(5)]
[0, 1, 4, 9, 16]
生成器的特点
1.语法上和函数类似:生成器函数和常规函数几乎是一样的。它们都是使用def语句进行定义,差别在于,生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值
2.自动实现迭代器协议:对于生成器,Python会自动实现迭代器协议,以便应用到迭代背景中(如for循环,sum函数)。由于生成器自动实现了迭代器协议,所以,我们可以调用它的next方法,并且,在没有值可以返回的时候,生成器自动产生StopIteration异常
3.状态挂起:生成器使用yield语句返回一个值。yield语句挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行