zoukankan      html  css  js  c++  java
  • python day11

    ---恢复内容开始---

    一 迭代器

    1 迭代器是一个重复的过程,但是迭代器并不是单纯的重复,每次重复都是基于上一次重复的结果而继续的.

    下列循环只是单纯的重复:

    while True:
        print(1)
        print(2)
        print(3)
    

    基于索引的迭代取值:

    l=['a','b','c']
            i=0
    
            while i < len(l):
                print(l[i])
                i+=1
    

    2 迭代器是取值的工具 这个工具的特点是可以不依赖索引取值

    3 迭代器的优缺点:

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

             ll 更节省内存

    缺点: l 不如按照索引的取值方式灵活

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

    4 迭代器的用法:

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

           但凡有_iter_方法的对象称之为可迭代对象

        ll 迭代器的对象:文件对象

           既内置有_lier_又内置有_next_方法的对象都称之为迭代器对象

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

    d迭代器实例

    ic={'a':1,'b':2,'c':3} iter_dic=dic.__iter__() #得到迭代器对象,迭代器对象即有__iter__又有__next__,但是:迭代器.__iter__()得到的仍然是迭代器本身 iter_dic.__iter__() is iter_dic #True print(iter_dic.__next__()) #等同于next(iter_dic) print(iter_dic.__next__()) #等同于next(iter_dic) print(iter_dic.__next__()) #等同于next(iter_dic) # print(iter_dic.__next__()) #抛出异常StopIteration,或者说结束标志 #有了迭代器,我们就可以不依赖索引迭代取值了 iter_dic=dic.__iter__() while 1: try: k=next(iter_dic) print(dic[k]) except StopIteration: break #这么写太丑陋了,需要我们自己捕捉异常,控制next,python这么牛逼,能不能帮我解决呢?能,请看for循环

    二 for循环的底层原理:

        1 调用in后面那个值/对象的_iter_方法,拿到一个迭代器对象iter_obj

        2 调用迭代器对象iter_obj._next_()将得到的返回值赋值变量k,循环往复直到取值抛出异常

           Stoplteration

        3 捕捉异常结束循环

    例:

    dic={'a':1,'b':2,'c':3}
    for k in dic:
        print(dic[k])
    

    三 生成器

          生成器就是一种自定义的迭代器 但凡函数内出现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, 5, 2):  # 1 3
        print(i)
    

      

    总结:yield

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

         2 yield & return

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

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

    四 函数的递归调用

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

            递归必须满足两个条件:

              l 每进入下一次递归调用,问题的规模都应该有所减少

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

        2 如果递归只是单纯的重复,那就没有意义:

           例

    def func():
        print(1)
        print(2)
        print(3)
        func()
    
    
    func()
    

        3 递归有两个明确的阶段:

          l 回溯

         ll 递推

    例: 

    """
    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
    
    print(age(5))
    

     

     

       

    五 计算之二分法

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

    例:

    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, 201)
    

      

    ---恢复内容结束---

  • 相关阅读:
    [转]Amazon DynamoDB – a Fast and Scalable NoSQL Database Service Designed for Internet Scale Applications
    [转]CIDR简介
    [转]Amazon AWS亚马逊云服务免费一年VPS主机成功申请和使用方法
    [转]SQL Server 连接串关键字别名
    [转]各种符号的英文单词
    【解决】SharePoint 2013 当鼠标悬停在用户名称上时页面会崩溃
    【HOW】如何限制Reporting Services报表导出功能中格式选项
    【解决】“不能手工移动或复制项到放置库”
    【解决】SharePoint 2013 with SP1安装问题及解决
    [转]安装SharePoint 2013时安装AppFabric失败(错误码:1603)
  • 原文地址:https://www.cnblogs.com/zhouyuquan/p/10060348.html
Copyright © 2011-2022 走看看