迭代器,生成器,函数递归调用与二分法

一、迭代器

1、什么是迭代器?

 什么是迭代?

   迭代是一个重复的过程,但每次重复都是基于上次重复的结果而继续

什么是迭代器?

  迭代取值的工具

2、为什么要用迭代器?

迭代器

  优点:

​   1.提供了一种不依赖于索引的迭代取值方式

​   2.更节省内存

 缺点:

​   1.不能按照索引的取值方式灵活取值

​   2.取值是一次性的,只能往后取,无法预测值的个数

3、如何用迭代器

   可迭代的对象:strlist upledictset文件对象

​   但凡内置有__iter__方法的对象都可以称之为可迭代对象

   迭代器对像:文件对象

​   既内置有__iter__方法又内置有__next__方法的对象称之为迭代器对象


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

d={'k1':111,'k2':222,'k3':333}
iter_d=d.__iter__()
  while True:
    try:
      v=iter_d.__next__()
    print(v)
    except StopIteration:
      break
try execpt 检测异常

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


以后用:
iter_d=iter(d)
print(next(iter_d))

二、生成器

生成器是一种自定义的迭代器
如何得到生成器?
  但凡函数内出现yield关键字,再去调用函数不会立即执行函数体代码,会得到一个返回值,该返回值就是生成器对象,既自定义的迭代器
  return只能返回一次值,yield可以返回多次值
def func():
  print('first')
  yield 1
  print('second')
  yield 2
  print('third')
  yield 3
g=func()
res1=next(g)
print(res1)
res2=next(g)
print(res2)
res3=next(g)
print(res3)

nex(g)

总结yield
1.提供一种自定义迭代器的解决方案
2.yield&return
  相同点:都可以返回值,返回值没有类型限制个数限制
  不同点:return只能返回一次值,yield却可以让函数暂停在某一个位置,可以返回多次值

自己写一个可以造无穷个值的range功能
def my_range(start,stop,step):
  while True:
    if start<stop:
      yield start
      start+=step
for i in my_range(1,5,2):
  print(i)

三、函数递归调用与二分法

1.函数的递归调用
  在调用一个函数的过程又直接或者间接地调用了该函数的本身,称之为递归函数

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

递归有两个明确的阶段:
1.回溯
2.递推
def age(n):
  if n == 1:
    return 18
  else:
    return age(n-1)+2
print(age(5))

l=[1,[2,[3,[4,[5,[6,[7,[8,[9,]]]]]]]]]
def func(list1):
  for item in list1:
    if type(item) is not list:
      print(item)
  else:
    func(item)
func(l)

2.二分法
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 #结束循环用break,结束函数要用return
  mid_index = len(list1)//2
  if find_num >list1[mid_index]:
    binary_search(list1[mid_index+1:],find_num)
  elif find_num < list1[mid_index]:
    binary_search(list1[:mid_index], find_num)
  else:
    print('find it')
binary_search(nums,205)

二分法是算法的一种,用来解决查找的问题
算法:如何高效解决问题的方法
算法都是用解决固定的问题

原文地址:https://www.cnblogs.com/lizeqian1994/p/10060581.html