python学习Day15 生成器send方法、递归、匿名函数、内置函数

复习

1.带参装饰器 - 自定义 | wraps  

  通过外界对内部函数传参,可以对一个功能进行二选一选择某一个功能进行装饰。

  @warap('1')  ===>  执行wrap('1')先得到@outer 【当有()时,优先执行小(),括号有优先权】

2.可迭代对象:有__iter__()方法的对象,并且调用__iter__()方法得到迭代器对象

3. 迭代器对象:有__next__()方法的对象,并且调用__next__()方法从前往后逐一取值不依赖索引取值,但必须从前往后依次取值(无法获取索引,也无法计算长度)】

4. for循环迭代器工作原理

1)得到操作对象的迭代器对象
2)通过__next__()进行取值
3)自动处理StopIteration异常,结束循环

5.枚举对象:为被迭代的对象添加迭代索引 -- enumerate

6.生成器: 语法同函数,内部包含yield关键字,函数名() 不是函数调用,而是得到生成器对象 --> 就是自定义的迭代器对象

今日内容

1.生成器的send方法          2.递归:函数增加某种规律后自己调自己本身          3.匿名函数:lambda              4.内置函数

1. 生成器的send工作原理

    1) send 送出信息给当前停止的yield      2) 再去调用__next__()方法,生成器接着往下指向,返回下一个yield值并停止

   

2. 递归 :函数直接或间接调用本身,都称之为递归

回溯:找寻答案的过程, --溯源
递推:推出结果的过程 

前提条件:1.递归必须有出口   |      2.递归回溯递推的条件一定有规律

案例一:获得第 count 个人的年纪:

           def get_age(count):

                  if count == 1:
                          return 58
                 # 第 九...一 个人 - 2
                  age = get_age(count - 1) - 2
                  return age

           age = get_age(3)
           print(age)

案例二:求n的阶乘   5!= 5 * 4 * 3 * 2 * 1:

5! = 5 * 4!

4!= 4 * 3!

3!= 3 * 2!

2!= 2 * 1!

1!= 1

def  jicheng(n):

        if n == 1 or n == 0:

                return 1

        ji  = n * jiecheng(n-1)

        return  ji

res = jiecheng(5)

print(res)

3.匿名函数  :   lambda *args, **kwargs: '返回值'

1).匿名函数没有函数名
2).匿名函数的关键字采用lambda
3).关键字 lambda 与标识函数功能体 : 之间一定是参数,所以省略()
4).匿名还是没有函数体,只有返回值,所以函数体和返回值的return关键字都省略了

注意:
1.参数的使用和有名函数一样,六种形参都支持
 2.返回值必须明确成一个值,可以为单个值对象,也可以为一个容器对象

a = lambda *args, **kwargs: '返回值1', '返回值2'
print(a)     # (<function <lambda> at 0x0000022D0B7E88C8>, '返回值2')
print(a[0]())   #返回值1

正确返回两个值: 主动构成成容器类型: lambda *args, **kwargs: ('返回值1', '返回值2')

max结合匿名工作原理:

1.max内部会遍历iter,将遍历结果一一传给lambda的参数x
2.依据lambda的返回值作为比较条件,得到最大条件下的那个遍历值
3.对外返回最大的遍历值
max(iter, lambda x: x)

猜你喜欢

转载自www.cnblogs.com/qingqinxu/p/10796943.html