迭代是一个重复的过程,但是每次重复都是基于上一次重复的结果而继续
迭代取值的工具
迭代器的优点:
1.提供一种不依赖索引的迭代取值方式
2.更节省内存
缺点:
1.不如按照索引的取值方式灵活
2.取值一次性的,只能往后取,无法预测值的个数
可迭代的对象
可迭代的对象:str\list\tuple\dict\set\文件对象
但凡内置有__iter__方法的对象都称之为可迭代对象
迭代器对象:文件对象
既内置有__iter__方法又内置有__next__方法的对象都称之为迭代器对象
调用可迭代对象下__iter__方法,会有一个返回值,该返回值就是一个迭代器对象
for循环的底层原理
1.调用in后面的那个值对象的iter方法,拿到一个迭代器对象iter_obj
2.调用迭代器对象iter_obj.__next__()将得到的返回值赋值变量名k,循环往复直到取值完毕抛出异常Stopiteration
捕捉异常结束循环
try:
except StopIteration:
d={'k1':11,'k2':22}
iter_d=d.__iter__()# iter_d=iter(d)
print(iter_d.__next__())
print(iter_d.__next__())
生成器就是一种自定义的迭代器
如何得到生成器
但凡函数内出现yield关键字,再调用函数不会立即执行函数体代码,会得到一个返回值,该返回值就是一个生成器
def func():
print('first')
yield 1
print('second')
yield 2
print('third')
yield 3
g=func()
next(g)
next(g)
next(g)
总结yield:
1.提供一种自定义迭代器解决方案
2.yield & return
相同点:都可以返回值,返回值没有类型限制\个数限制
不同点:return只能返回一次值,yield却可以让函数暂停在某一个位置,可以返回多次值
def range(x):
i=x
while True:
yield i
i+=1
g=range(1)
for i in g:
print(i)
def my_range(start,stop,step=1):
while start < stop:
yield start
start+=step
for i in my_range(1,50,2):
print(i)
函数的递归调用:
在调用一个函数的过程又直接或间接地调用该函数本身,称之为递归调用
递归必须满足两个条件:
1.每进入下一次递归调用,问题的规模都应该有所减少
2.递归必须有一个明确的结束条件
递归有两个明确的阶段:
1.回溯
2.递推
l=[1,[2,[3,[4,]]]]
def func(list1):
for item in list1:
if type(item) is not list :
print(item)
else:
func(item)
func(l)
l=[1,2,3,4,44,55,66,77,88,201,322,520]
find_num=201
def binary(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(list1[mid_index + 1:],find_num)
elif find_num<list1[mid_index]:
binary(list1[:mid_index], find_num)
else:
print("find it")
binary(l,203)