day 13
一、迭代器
1、什么是迭代?什么是迭代器?
迭代是一个重复的过程,并且每次重复都是基于上一次的结果而来。
迭代器即迭代取值的工具。
2、为什么要用迭代器?
迭代器的特点:
优点:a、提供一种不依赖索引的迭代取值方式;
b、更节省内存。
缺点:a、不如按照索引的取值方式灵活;
b、取值一次性的,只能往后取,无法预测值的个数。
3、如何用迭代器:
可迭代对象:但凡内置有__ iter__方法的对象都称之为可迭代对象,如:strlist upledictset文件对象。
迭代器对象:既内置有__ iter__ 方法又内置有__ next__方法的对象都称之为迭代器对象,如文件。
迭代器对象与可迭代对象的关系:
迭代器对象 = 可迭代的对象.__ iter__()
迭代器对象本身 = 迭代器对象. __ iter__()
# d={'k1':111,'k2':222,'k3':333} # iter_d=d.__iter__() # iter_d=iter(d) #d.__iter__ # print(next(iter_d)) #iter_d.__next__()
二、生成器
1、生成器的定义
在函数内,但凡出现yield关键字,在调用函数就不会执行函数体代码,会返回一个值,该值称为生成器。
生成器的本质就是自定义的迭代器。
# def func(): # print('first') # yield 1 # print('second') # yield 2 # print('third') # yield 3 # # g=func() #调用函数 函数的返回值即为一个生成器 # print(g)
2、return vs yield 对比
# 总结yield: # 1. 提供一种自定义迭代器的解决方案 # 2. yield & return # 相同点: 都可以返回值,返回值没有类型限制个数限制 # 不同点: return只能返回一次值,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,50000,2): # 1 3 # print(i)
三、递归
1、函数的递归调用:在调用一个函数的过程又直接或者间接地调用该函数本身,称之为递归调用
2、递归调用必须要满足的两个条件:
a、每进入下一次递归调用,问题的规模都应该有所减少
b、递归必须有一个明确的结束条件
3、递归的两个阶段:
a、回溯
注意:一定要在满足某种条件时结束回溯,否则会无限的递归。
b、递推
# 递归的使用实例 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,203)