zoukankan      html  css  js  c++  java
  • 迭代器、生成器、递归、二分法

    一.迭代器

    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)

  • 相关阅读:
    [教程]北京迅为iMX6ULL开发板上配置 AP 热点
    [QT进阶篇]迅为手把手视频教程嵌入式学习之QT进阶篇
    新手学习嵌入式Linux和Android开发板推荐
    【迅为免费教程】 嵌入式学习之Linux入门篇分享
    迅为 iTOP-i.MX6ULL 开发板-Mqtt 移植教程
    9月29日学习日志
    9月8日学习日志
    9月7日学习日志
    9月6日学习日志
    9月5日学习日志
  • 原文地址:https://www.cnblogs.com/wangke0917/p/10060100.html
Copyright © 2011-2022 走看看