---恢复内容开始---
一 迭代器
1 迭代器是一个重复的过程,但是迭代器并不是单纯的重复,每次重复都是基于上一次重复的结果而继续的.
下列循环只是单纯的重复:
while True: print(1) print(2) print(3)
基于索引的迭代取值:
l=['a','b','c'] i=0 while i < len(l): print(l[i]) i+=1
2 迭代器是取值的工具 这个工具的特点是可以不依赖索引取值
3 迭代器的优缺点:
优点: l 提供一种不依赖索引的迭代取值方式
ll 更节省内存
缺点: l 不如按照索引的取值方式灵活
ll 取值是一次性的,只能往后取,无法预测值的个数
4 迭代器的用法:
l 可迭代的对象:strlist upledictset文件对象
但凡有_iter_方法的对象称之为可迭代对象
ll 迭代器的对象:文件对象
既内置有_lier_又内置有_next_方法的对象都称之为迭代器对象
lll 调用可迭代对象下_lier_方法,会有一个返回值,该返回值就是内置的迭代器对象
d迭代器实例
ic={'a':1,'b':2,'c':3} iter_dic=dic.__iter__() #得到迭代器对象,迭代器对象即有__iter__又有__next__,但是:迭代器.__iter__()得到的仍然是迭代器本身 iter_dic.__iter__() is iter_dic #True print(iter_dic.__next__()) #等同于next(iter_dic) print(iter_dic.__next__()) #等同于next(iter_dic) print(iter_dic.__next__()) #等同于next(iter_dic) # print(iter_dic.__next__()) #抛出异常StopIteration,或者说结束标志 #有了迭代器,我们就可以不依赖索引迭代取值了 iter_dic=dic.__iter__() while 1: try: k=next(iter_dic) print(dic[k]) except StopIteration: break #这么写太丑陋了,需要我们自己捕捉异常,控制next,python这么牛逼,能不能帮我解决呢?能,请看for循环
二 for循环的底层原理:
1 调用in后面那个值/对象的_iter_方法,拿到一个迭代器对象iter_obj
2 调用迭代器对象iter_obj._next_()将得到的返回值赋值变量k,循环往复直到取值抛出异常
Stoplteration
3 捕捉异常结束循环
例:
dic={'a':1,'b':2,'c':3} for k in dic: print(dic[k])
三 生成器
生成器就是一种自定义的迭代器 但凡函数内出现yield关键字,再去调用函数不会立即执行函数体代码,会得到一个返回值,该返回值就是生成器对象,即自定义的迭代器
例:
def my_range(start, stop, step=1): while start < stop: # 5 < 5 yield start # 3 start += step # start=5 range(1, 5, 2) # 1 3 for i in my_range(1, 5, 2): # 1 3 print(i)
总结:yield
1 提供一种自定义迭代器的解决方案
2 yield & return
相同点:都可以返回值,返回值没有类型 没有个数限制
不同的:return只能返回一次值,yield却可以让函数暂停再某一个位置,可以返回多次值.
四 函数的递归调用
1 在调用一个函数的过程中又直接或者间接调用该函数本身,称之为递归调用
递归必须满足两个条件:
l 每进入下一次递归调用,问题的规模都应该有所减少
ll 递归必须有一个明确的结束条件
2 如果递归只是单纯的重复,那就没有意义:
例
def func(): print(1) print(2) print(3) func() func()
3 递归有两个明确的阶段:
l 回溯
ll 递推
例:
""" age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1)=18 age(n)=age(n-1)+2 # n > 1 age(1)=18 # n = 1 """ def age(n): if n == 1: return 18 return age(n-1)+2 print(age(5))
五 计算之二分法
想从一个按照从小到大排列的数字列表中找到指定的数字,遍历的效率太低,用二分法(算法的一种,算法是解决问题的方法)可以极大低缩小问题规模
例:
nums = [3, 5, 7, 11, 13, 23, 24, 76, 103, 111, 201, 202, 250, 303, 341] 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]: # in the right binary_search(list1[mid_index + 1:], find_num) elif find_num < list1[mid_index]: # in the left binary_search(list1[:mid_index], find_num) else: print('find it') binary_search(nums, 201)
---恢复内容结束---