迭代器、生成器、递归、二分法
一.迭代器
1.什么是迭代器:迭代取值的工具
迭代:迭代是一个重复的过程,但是每次重复都是基于上一次重复的结果而继续
2.为什么要用迭代器
优点:1.提供一种不依赖索引的迭代取值方式
2.更加节省内存
缺点:1.没有按照索引的取值方式灵活
2.取值是一次性的,只能往后取,无法预测值的个数
3.如何用迭代器
可迭代的对象:内置有__iter__方法的对象,称之为可迭代对象。(str/list/tuple/dict/set/文件对象)
迭代器对象:内置既有_iter__方法,又有__next__方法的对象,称之为迭代器对象。(文件对象)
注:调用可迭代对象下__iter__方法,会有一个返回值,该返回值就是内置的迭代器对象
我们通常不用__iter__这样的形式,直接用iter()这种形式
while True:
try:
v=iter_d.__next__()
print(v)
except StopIteration:
break
#我们用try,except Stoplteration这种形式,在循环取迭代器时,负责监控报错信息,这样就避免掉程序
报错,崩溃等现象出现。
4.for循环的底层原理
4.1调用in后面那个对象的__iter__方法,拿到一个迭代器对象
4.2调用迭代器对象__iter__()方法,将得到的返回值赋值给in前面的变量名,循环往复直到取值完毕抛出异常Stoplteration
4.3捕捉异常结束循环
二.生成器
1.生成器就是一种自定义的迭代器
2.如何得到生成器:函数内出现yield关键字,再去调用函数不会立即执行函数体代码,会得到一个返回值,该返回值就是生成器对象,即自定义的迭代器。
3.yield:1.提供一种自定义的迭代器的解决方案
2.yield & return
相同点:都可以返回值,返回值没有类型限制,也没有个数限制
不同点:return只能返回一个值,yield可以让函数暂停在某一个位置,可以返回多次值
三.函数的递归调用
在调用一个函数的过程时,又直接或者间接的调用该函数本身,称之为递归调用
#调用函数时会产生局部名称空间,占用内存,在递归调用函数时,如果出现一种死循环的情况,python解释器的内存管理机制为了防止其无限制占用内存,对函数的递归调用做了最大的层级限制
递归必须满足两个条件:1.每进入下一次递归调用,问题的规模都应该有所减少
2.递归必须有一个明确的结束条件
递归有两个明确的阶段:1.回溯:2.递推
四.二分法
想从一个按照从小到大排列的数字列表中找到指定的数字,遍历的效率太低,用二分法(算法的一种,算法是解决问题的方法)可以极大低缩小问题规模
def binary_search(list1,find_num):
print(list1)
if len(list1) == 0:
print('not exist')
return
mid_index=len(list1) // 2
if find_num > list1[mid_index]:
binary_search(list1[mid_index + 1:],find_num)
elif find_num < list1[mid_index]:
binary_search(list1[:mid_index],find_num)
else:
print('find it')
binary_search(nums,203)