Python递归函数、生成器以及匿名函数

Python递归函数、生成器以及匿名函数

函数的执行流程
递归Recursion
函数直接或者间接调用自身 就是递归
递归需要有边界条件、递归前进段、递归返回段
递归一定要有边界条件
当边界条件不满足的时候,递归前进
当边界条件满足的时候,递归返回
递归Recursion
递归的要求,
递归一定要有退出条件,递归调用一定要执行到这个退出条件,如果没有退出条件,将会反复调用
递归调用的深度不宜过深
超出递归深度限制,会抛出RecursionError:maxinum  recursion depth exceeded
查看递归调用深度
sys.getrecursionlimit()
能不用递归则不用递归
Fibonacci number 实现递归三种方式
#菲薄那些数列实现递归
def fib(n):
    if n < 2:
        return 1
    else:
        return fib(n-1) + fib(n-2)

#d递归实现上面算法
def fib1(n,i=0,j=1):
    i,j = j,i+j
    print(j,end = ‘ ‘)
    if n == 0:
        return
    fib1(n-1,i,j)

#for 循环实现斐波那偰数列
i = 0
j = 1
for z in range(9):
    i,j = j,i+j
    print(j,end = ” “)
匿名函数
Python借助lambda表达式构建匿名函数
格式:
    lambda 参数列表:表达式
    (lambda x:x ** 2)(4)
    4是实参,x是定义函数的形参
    相当于def _inc(x):
           return x** 2
        _inc(4)
使用lambda关键字来定义匿名函数
参数列表不需要小括号
冒号是用来分割参数列表和表达式的
不需要使用return,表达式的值就是匿名函数的返回值
lambda表达式(匿名函数)只能写在一行上,被称为单行函数
[x for x in (lambda *args: map(lambda x: x+1, args))(*range(5))] #高阶函数
[x for x in (lambda *args: map(lambda x: (x+1,args), args))(*range(5))]
生成器
生成器指的是生成器对象,可以由生成器表达式得到,也可以使用yield关键字得到一个生成器函数,调用这个函数得到一个生成器对象
生成器函数
    函数体中包含yield语句的函数,返回生成器对象
    生成器对象,是一个可迭代对象,是一个迭代器
    生成器对象是延迟计算、惰性求值
生成器函数可以使用next函数多次执行
在生成器函数中,使用多个yield语句,执行一次后会暂停执行,把yield表达式的值返回
再次执行会执行到下一个yield语句
return语句依然可以终止函数运行,但return语句的返回值不能被获取到
return会导致无法继续取到下一个值,抛出StopIteration异常
如果函数没有显示的return语句,如果生成器执行到函数结尾,一样会抛出StopIteration异常
生成器
生成器函数
    包含yield语句的生成器函数生成 生成器对象的时候,生成器的函数的函数体不会立即执行的
    next(generator)会从函数的当前位置向后执行到第一个yield,会弹出值,暂停函数的执行
    再次调用next函数,和上一条一样的处理过程
    没有多余的yield语句能被执行,继续调用next函数,会抛出StopIteration异常
计数器
def inc1():
    def counter1():
        i = 0
        while True:
            i += 1
            yield i
    d = counter1()
    return lambda :next(d)
生成器应用
协程 coroutine
实现调度
yield from
yield from iterable 是 for item in iterable:yield item形式的语法糖
从可迭代对象中一个个拿元素
def counter():
    for x in range(n):
        yield x
def inc(n):
    yield from  counter(n)

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/96209

(0)
SignalSignal
上一篇 2018-04-15
下一篇 2018-04-15

相关推荐

  • 树 非线性结构,每个元素可有多个前驱和后继 树是n(n>=0)个元素的集合,n=0时,称为空树,树只有一个特殊的没有前驱的元素,称为树的根root,树中除了根结点外,其余元素只能有一个前驱,可以有零个和多个后继,子树也有自己的根 结点:树中的数据元素 结点的度degree:结点拥有的子树的数目称为度,记作d(v)。树的度是树内各结点的度最大值 叶子结点…

    2018-04-16
  • 装饰器

    装饰器 需求 一个加法函数,想增强它的功能,能够输出被调用过以及调用的参数信息 def add(x, y): return x + y 增加信息输出功能 def add(x, y): print(“call add, x + y”)  # 日志输出到控制台 return x + y p 上面的加法函数是完成了需求,但是有以下的缺点 打…

    Python笔记 2018-04-23
  • 高阶函数

    高阶函数
    柯里化
    装饰器、文档字符串
    functools 模块 inspect 模块

    2018-04-25
  • Python内建函数

    内建函数 标识id() 返回对象的唯一标识,CPython返回内存地址 哈希hash() 返回一个对象的hash值 类型type() 返回对象的类型 类型转换 int()、float()、bin()、hex()、oct()、bool()、list()、tuple()、dict()、set()、complex()、bytes()、bytearray() 输入i…

    2018-04-08
  • 封装与解构 集合

    封装和解构 封装:将多个值进行分割,结合在一起,本质上返回元组,只是省掉了小括号 ‘==‘意思为内容一致,‘=’意思为内存空间一致 解构:把线性结构的元素解开,并顺序的赋值给其他变量,左边接纳的变量数要和左边解开的元素数量一致 集合不是非线性 解构中使用*变量名接收,但不能单独使用,被*变量名收集后组成一个列表 第一个下划线为9,结果被第二个下划线重新赋值为…

    Python笔记 2018-04-01
  • python学习总结

    内建函数、函数、插入排序、树

    2018-04-15