• Python Day16


    一.复习

    1.迭代器和生成器

    可迭代对象 - 可迭代的  Iterable

    内部含有__iter__
     from collections import Iterable
     isinstance('要检测的值',Iterable)

    ~迭代器

    内部含有__iter__,__next__
    可迭代对象 包含 迭代器
     from collections import Iterator
     isinstance('要检测的值',Iterator)
    访问迭代器中的值 : 迭代器.__next__()

    ~~能被for循环的都是可迭代的

      for循环的本质:
      循环不是迭代器的可迭代对象 :不具备next方法的可迭代对象.__iter__()就得到了一个迭代器
      循环迭代器:直接调用迭代器的next方法

    ~生成器——迭代器

    ~~生成器函数 —— 函数内含有yield关键字

      *函数的调用返回一个生成器
      *从生成器中取值的方法和从迭代器中取值的方法是完全相同的
        1.next —— 不常用
        2.for —— 最好
        3.list —— 最不好

      *生成器中的内容不获取就不生成——惰性运算

       *在定义生成器的时候:关键字yield

        *在使用生成器的时候:next、send

    ~~生成器表达式

        就是将列表推导式的中括号改成小括号

        列表推导式的结果是一个列表,生成器表达式的结果是一个生成器

    ~~~~注意事项:

          ***next  for  list 不要混用 

    ~~生成器函数和装饰器函数一起用

        预激生成器的装饰器,在这个装饰器中只做一件事:next(g)         

    二.递归  

    1.递归的概念:递归的概念是算法的范畴本来不属于python语言的语法内容,但是在每个编程语言系列教学都要讲到递归。

      如果掌握了递归的方法会发现是一个非常棒的变成思路。

    2.什么叫做递归(recursion):一个函数在自己的内部调用函数本身。

    def search(num,l,start = None,end=None):
        start = start if start else 0
        end = end if end else len(l)-1
        mid = (end-start)//2+start
        if l[mid]>num:
            search(num,l,start,mid-1)
        elif l[mid] < num:
            search(num,l,mid+1,end)
        elif l[mid] == num:
            print(mid,l[mid])
    l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
    search(66,l)
    
    输出结果
    
    17 66

    ~递归的深度在python中是有限制的

    ~递归的好处就是代码简介精炼

    ~定义一个递归函数的时候,必须要有一个限制

    3.递归的副作用:1 *递归函数可以调用本身,但是每次都需要进行 压栈,弹栈保存和恢复寄存器的栈的操作,在这个上面很消耗时间和空间。

           2 *如果递归一旦忘记返回或者错误的设置了返回的条件,那么在执行递归代码会成为一个无底洞,只进不出。(递归的口诀:递归递归,归去来兮)

      使用迭代是考验毫秒级的,而实现递归是考验CPU的能力(n秒------n分钟不等)。

    二 解耦

     什么叫做解耦:要完成一个完整的功能,但是这个功能的规模要尽量的小,并且和这个功能无关的其他代码应该和这个函数分离。

        解耦的好处:1 增强代码的重用性;2 减少代码变更的相互影响;3 减少代码的冗余。

    ~~~递归示例:

    #求阶乘 n = 7  7*6*5*4*3*2*1
    def func(n): if n == 1: return 1 else: return n*func(n-1)

     ret = func(4)
     print(ret)

    
    
    输出结果
    
    5040
    #3.三级菜单
    menu = {
        '北京': {
            '海淀': {
                '五道口': {
                    'soho': {},
                    '网易': {},
                    'google': {}
                },
                '中关村': {
                    '爱奇艺': {},
                    '汽车之家': {},
                    'youku': {},
                },
                '上地': {
                    '百度': {},
                },
            },
            '昌平': {
                '沙河': {
                    '老男孩': {},
                    '北航': {},
                },
                '天通苑': {},
                '回龙观': {},
            },
            '朝阳': {},
            '东城': {},
        },
        '上海': {
            '闵行': {
                "人民广场": {
                    '炸鸡店': {}
                }
            },
            '闸北': {
                '火车战': {
                    '携程': {}
                }
            },
            '浦东': {},
        },
        '山东': {},
    }
    #相同的数据类型 嵌套在一起
    # def Three_Level_Menu(menu):
    #     while True:
    #         for k in menu:print(k)
    #         key = input('>>>')
    #         if key == 'q':return 'q'
    #         elif key == 'b':break
    #         elif key in menu:
    #             ret = Three_Level_Menu(menu[key])
    #             if ret == 'q': return 'q'
    # Three_Level_Menu(menu)
  • 相关阅读:
    组合博弈入门
    模拟练1
    鼠标点击 input,显示瞬间的边框颜色,对之修改与隐藏
    display: inline-block兼容性写法
    background-clip与background-origin两者的区别
    article标签和aside标签两者的理解
    jQuery插件实现左右无缝轮播
    JS面向对象基础2
    JS面向对象基础1
    CSS3的基础知识点
  • 原文地址:https://www.cnblogs.com/liuduo/p/7486605.html
Copyright © 2020-2023  润新知