迭代器
-
什么是迭代器
-
迭代:迭代是一个重复的过程,但是每次重复都是基于上一次重复的结果而继续
-
迭代器:迭代取值的工具
-
-
为什要用迭代器
-
优点
-
提供了一种不依赖索引的迭代取值方式
-
更节省内存
-
-
缺点
-
不如按索引的取值方式灵活
-
取值一次性的,只能往后取,无法预测值的个数
-
-
如何用迭代器
-
可迭代的对象: str/list/tuple/dict/set/文件
但凡内置有__ iter __方法的对象都称之为迭代对象
-
迭代器类型:
既内置有__ iter __ 方法有内置有 __ next __方法的对象都称之为迭代器对象
-
调用可迭代对象下__ iter __ 方法,会有一个返回值,该返回值就是内置的迭代器对象
# while 实现迭代取值 d = {'k1':111,'k2':222, 'k3':333} iter_d = d.__iter__ # 将可迭代对象转化为迭代器对象 while True: try: # 测试文件 v = iter_d.__next__ # 迭代循环一个内容 print(v) except StopIteration: # 当错误内容正好是except即接收不报错 break # for 循环迭代取值(底层原理如上) d = {'k1':111,'k2':222, 'k3':333} for k in d: print(k) # for循环的底层原理 # 1. 调用in后面的那个值/对象的__inter__方法,拿到一个迭代器对象iter_obj # 2. 调用迭代器对象iter_obj.__next__()将得到的返回值赋值变量k,循环往复直到取值完毕抛出异常StopIteration # 3. 捕捉异常结束循环
生成器
-
什么是生成器
生成器就是一种自定义的迭代器
def func(): # 生成器 print('first') yield 1 print('second') yield 2 print('third') yield 3 for i in func(): # 迭代循环func内容 print(i)
-
如何得到生成器
但凡函数内出现yield关键字,再去调用函数不会立刻执行函数体代码,会得到一个返回值,该返回值就是生成器对象,及自定义迭代器
-
总结yield:
-
提供一种自定义迭代器的解决方案
-
yield &return
-
相同点: 都可以返回值,返回值没有类型限制和个数限制
-
不同点: return只能返回一次值,yield却可以让函数暂停在某个位置,可以返回多次值。
-
-
递归函数与二分法
-
函数的递归调用:
在调用一个函数的过程中又直接或者间接地调用该函数本身,称之为递归调用
-
递归必须满足两个条件:
-
每进入下一次递归调用,问题的规模都应该有所减少
-
递归必须有一个明确的结束条件
-
-
递归两个明确的阶段:
-
回溯:函数调用循环规模减少的过程
-
递推:循环结束一层层返回结果的过程
-
# 实现5的阶乘5! def factorial(n): if n == 1: return 1 else: return n * factorial(n - 1) print(factorial(5))
-
-
二分法
在有序的区间内查找时,使用二分法使对比范围缩小一半,大大提升了查找效率(普通查找需要一个个进行遍历,效率太低)
# 在列表内查找值 l1 = [1,2,3,4,6,7,8,9,13,23,24,25,26,29,30,40,48,55,60] def find_n(list1, num): if len(list1) == 0: print('not in') return x = list1[len(list1) // 2] if num > x: list1 = list1[len(list1) // 2 + 1:] return find_n(list1, num) elif num < x: list1 = list1[:len(list1) // 2] return find_n(list1, num) else: print('find it') find_n(l1, 23)