• day16笔记


    一、递归调用

    1.什么是递归调用

    在函数内部,可以调用其他函数。如果一个函数在内部调用函数自身,那么这个函数就是递归函数

    2.递归思想

    1   递归算法常用来解决结构相似的问题。
    2   所谓结构相似,是指构成原问题的子问题与原问题在结构上相似,可以用类似的方法解决。具体地,整个问题的解决,可以分为两部分:第一部分是一些特殊情况,有直接的解法;第二部分与原问题相似,但比原问题的规模小,并且依赖第一部分的结果。
    3   本质上,递归是把一个不能或不好解决的大问题转化成一个或几个小问题,再把这些小问题进一步分解成更小的问题,直至每个小问题都可以直接解决。
    4   实际上,递归会将前面所有调用的函数暂时挂起,直到递归终止条件给出明确的结果后,才会将所有挂起的内容进行反向计算。其实,递归也可以看作是一种反向计算的过程,前面调用递归的过程只是将表达式罗列出来,待终止条件出现后,才依次从后向前倒序计算前面挂起的内容,最后将所有的结果一起返回。

    3.递归调用的两个阶段

    1.回溯  一层一层递归往下调用
    2.递推  在满足一定条件下接受回溯

    4.适合的场景

    不清楚什么时候结束,但是知道结束条件

     5.递归的特点

    1 必须有一个明确的结束条件,否则会撑爆内存,在Python中,递归最大深度为1000,该值可以收到被修改;
    2 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
    3 相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。
    4 递归效率不高,递归层次过多会导致栈溢出

    6.递归函数的优缺点

    递归函数的优点:定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
    
    递归函数的缺点:使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

    7.解决递归调用栈溢出的方法

    递归调用栈溢可以通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。尾递归基于函数的尾调用, 每一级调用直接返回函数的返回值更新调用栈,而不用创建新的调用栈, 类似迭代的实现, 时间和空间上均优化了一般递归!

    二、三元表达式

    1.什么是三元表达式

    三元表达式基于真(true)/假(not)的条件判断,它允许用简单的一行快速判断,而不是使用复杂的多行if语句。 这在大多数时候非常有用,而且可以使代码简单可维护。

    2.三元表达式的形式

    为真时的结果 if 判断条件 else 为假时的结果(注意,没有冒号)

    先对逻辑表达式进行判断,如果逻辑表达式返回 True,则执行并返回 True 代码 的值;如果逻辑表达式返回 False,则执行并返回 False代码 的值。

    3.使用场景

    在一些简单的表达式中, 可以使用三元表达式简化判断,但是要注意尽量避免运用三元表达式写比较复杂逻辑,保证代码良好的可读性

    三、匿名函数

    1.什么是匿名函数

    匿名函数是自定义函数的一种,专指用关键字” lambda”定义的无名短函数。这种函数得名于省略了用def声明函数的标准步骤,匿名函数不需要显示地定义函数名,

    使用【lambda + 参数 +表达式】的方式进行定义:

    >>> lambda [arg1 [,arg2, ... argN]] : expression

    2.使用匿名函数注意事项:

    Lambda函数能接收任何数量的参数但只能返回一个表达式的值,不能直接调用print,也不需要return

    3.匿名函数的优点

    1 不用取名称,因为给函数取名是比较头疼的一件事,特别是函数比较多的时候
    2 可以直接在使用的地方定义,如果需要修改,直接找到修改即可,方便以后代码的维护工作
    3 语法结构简单,不用使用def 函数名(参数名):这种方式定义,直接使用lambda 参数:返回值 定义即可

    四、模块的基础知识

    1.什么是模块

    模块就是功能的集合体,用来导入后使用。在Python中,一个.py文件就称之为一个模块(Module)

    2.模块来源

    1.内置模块
    2.第三方模块  #其他人或者社区写好
    3.自定义模块 

    3.模块分类:

    1.py文件
    2.包含一个或多个py文件的文件夹,也叫做包
    3.被编译的共享库或C++扩展
    4.使用C语言并链接到Python解释器的内置模块

    4.使用模块的好处

    最大的好处是大大提高了代码的可维护性。其次,减少冗余。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。
    
    使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突

    5.模块导入方式

    import导入方式

    使用import导入时,首次导入模块会运行被导入模块,产生模块的名称空间并将模块中产生的名称放入模块的名称空间中,后续直接引用首次导入的名称空间,后续不会重复产生名称空间
    在当前执行空间中的得到一个名字并指向被导入模块的名称空间,并且
    名称的调用关系在定义时已经确定,不会在调用是发生改变,不会和当前的名称空间产生冲突
    import 导入时可以同时导入多个模块,使用,分割  但是不建议使用 。
    使用 as 给导入的模块生成别名方便调用
    使用*可以导入模块所有内容
    __all__ 可以定义被*调用时可以被调用的模块

    from 导入方式:

    用起来简单,但是会和当前名次空间的名称产生冲突,但是名称查找关系不会发生改变
  • 相关阅读:
    路径总和 III(力扣第437题)
    HBase的存储文件合并(StoreFile Compaction)、Region Split
    二叉树的层平均值、 找树左下角的值(力扣第637题、513题)
    HBase的读写数据流程
    HBase的内存数据刷写MemStore Flush
    翻转二叉树、合并二叉树(力扣第226、617题)
    最长同值路径(力扣第687题)
    CSS字体动态炫彩样式代码
    Redis基础
    MySQL数据库基本操作【3】
  • 原文地址:https://www.cnblogs.com/panwenbin-logs/p/13369553.html
Copyright © 2020-2023  润新知