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 导入方式:

用起来简单,但是会和当前名次空间的名称产生冲突,但是名称查找关系不会发生改变
原文地址:https://www.cnblogs.com/panwenbin-logs/p/13369553.html