迭代器、生成器、递归、二分法

一.迭代器

1.什么是迭代器:迭代取值的工具

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

2.为什么要用迭代器

优点:1.提供一种不依赖索引的迭代取值方式

           2.更加节省内存

缺点:1.没有按照索引的取值方式灵活

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

3.如何用迭代器

可迭代的对象:内置有__iter__方法的对象,称之为可迭代对象。(str/list/tuple/dict/set/文件对象)

迭代器对象:内置既有_iter__方法,又有__next__方法的对象,称之为迭代器对象。(文件对象)

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

       我们通常不用__iter__这样的形式,直接用iter()这种形式

 while True:
     try:
           v=iter_d.__next__()
           print(v)
      except StopIteration:  
           break

#我们用try,except Stoplteration这种形式,在循环取迭代器时,负责监控报错信息,这样就避免掉程序

报错,崩溃等现象出现。

4.for循环的底层原理

    4.1调用in后面那个对象的__iter__方法,拿到一个迭代器对象

    4.2调用迭代器对象__iter__()方法,将得到的返回值赋值给in前面的变量名,循环往复直到取值完毕抛出异常Stoplteration

    4.3捕捉异常结束循环

二.生成器

1.生成器就是一种自定义的迭代器

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

3.yield:1.提供一种自定义的迭代器的解决方案

            2.yield & return

              相同点:都可以返回值,返回值没有类型限制,也没有个数限制

              不同点:return只能返回一个值,yield可以让函数暂停在某一个位置,可以返回多次值

三.函数的递归调用

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

#调用函数时会产生局部名称空间,占用内存,在递归调用函数时,如果出现一种死循环的情况,python解释器的内存管理机制为了防止其无限制占用内存,对函数的递归调用做了最大的层级限制

递归必须满足两个条件:1.每进入下一次递归调用,问题的规模都应该有所减少

                                       2.递归必须有一个明确的结束条件

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

四.二分法

       想从一个按照从小到大排列的数字列表中找到指定的数字,遍历的效率太低,用二分法(算法的一种,算法是解决问题的方法)可以极大低缩小问题规模

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]:
            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,203)

原文地址:https://www.cnblogs.com/wangke0917/p/10060100.html