迭代器、生成器、函数递归调用及二分式

一、迭代器
1、什么是迭代器?
迭代是一个重复的过程,但是每次重复都是基于上一次重复的结果而继续
while True:
# print()#这不是迭代,单纯的循环
#基于索引的迭代取值
l('a','b','c',)
i=0
while i < len(l):
print(l[i])
i+=1
什么是迭代器
迭代取值的工具

2、为什么要用迭代器
迭代器
优点
1、提供一个不依赖索引的迭代取值方式
2、更节省内存
缺点:
1、不如索引取值方便
2、取值是一次性的,只能往后取,无法预测值的个数


3、如何用迭代器
可跌打的对象:str/list/tuple/dict/set/文件对象
但凡内置有__iter__的方法的对象都称之为可迭代对象
迭代器对象:文件对象
既内置有__iter__方法又内置有__next__方法对象都称之为迭代器对象

调用可迭代对象__iter__方法,会有一个返回值,该返回值就是内置一个迭代器对象

s='abcdef'
l=['a','b','c']
d={'k1':111,'k2':222,'k3':333}
iter_d=d.__iter__()
try:
print(iter_d.__next__())
print(iter_d.__next__())
print(iter_d.__next__())
print(iter_d.__next__())
except stopIteration:
print('取值完毕')


s='abcdef'
l=['a','b','c']
d={'k1':111,'k2':222,'k3':333}
iter_d=d.__iter__()
while Ture:
try:
v=iter_d.__next__()
print(v)
except StopIteration:
break

for k in d
print(k)
# for 循环的底层原理:
1、调用in后面那个值/对象的_iter_方法,拿到一个迭代器对象iter_obj
2、调用迭代器对象iter_obj._next_()将的到的返回值赋值变量名k,循环往复直到取值完毕抛出异常StopIteration
3、捕捉异常直到结束

二、生成器
生成器就是一种自定义的迭代器
如何的到生成器
但凡函数出现yield关键字,再去调用函数不会立即执行函数体代码,会得到一个返回值,该返回值就是生成器对象

def func()
print('first')
yield 1
print('second')
yield 2
prind('third')
yield 3
g=func
#print(g)
next(g)


总结yield:
1、提供一种自定义迭代器解决方案
2、yield & return
相同点:都可以返回值,返回值没有类型限制/个数限制
不同点ruturn只可以返回一个值,yield可以让函数体暂停某一个位置,可以返回多个值
三、函数递归调用与二分法
1、函数的递归调用:
在调用一个函数的过程又直接又间接又调用该函数本身,称之为递归调用

递归必须满足两个条件:
1、每进行下一次递归调用,问题的规模都应该有所减少
2、递归必须有一个明确的结束条件

递归有两个明确的阶段:
1、回溯
2、递推

以下是没有意义的的递归
def func()
print(1)
print(2)
print(3)
func()
func()

def bar()
print('for bar')
foo()
def foo()
print('for foo')
bar()
foo()



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
l = [1, [2, [3, [4, [5, [6, [7, [8, [9, ]]]]]]]]]


def func(lists): # 定义函数
for item in lists: # 循环列表
if type(item) is not list: # 判断值是否是列表
print(item) # 不是则打印
else:
func(item) # 是则调用函数循环


func(l)

nums = [3, 5, 7, 11, 13, 23, 24, 76, 103, 111, 201, 202, 250, 303, 341]
find_num = 203
for num in nums: # 循环列表
if num == find_num: # 如果值是203
print('find it')
break
else:
print('not exists')

nums = [3, 5, 7, 11, 13, 23, 24, 76, 103, 111, 201, 202, 250, 303, 341]


def func(listl, find_num): # 定义一个函数,参数为列表及需要的值
print(listl)
if len(listl) == 0: # 当寻找完列表为空
print('not exists')
return
mid_index = len(listl) // 2 # 取中间数
if find_num > listl[mid_index]: # 当寻找的值大于中间数
func(listl[mid_index + 1:], find_num) # 调用函数继续在大于中间数的列表内寻找
elif find_num < listl[mid_index]: # 当寻找的值小于中间数
func(listl[:mid_index], find_num) # 调用函数继续在小于中间数的列表内寻找
else: # 当寻找值等于中间数
print('find it')


func(nums, 202)

 
原文地址:https://www.cnblogs.com/liushen1995/p/10059170.html