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)

 

posted @ 2017-09-06 19:48  大象和骆驼  阅读(185)  评论(0编辑  收藏  举报