【23.函数-高阶函数】
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称为高阶函数
如果一个函数可以接收另一个函数,这个函数就称为高阶函数
def func(x,y): return x+y def calc(x): return x f = calc(func) print(f(5,9))
输出结果
总结
1.接收一个或多个函数作为输入
2.return返回另外一个函数
【24.递归介绍】
什么是递归?
递归就是在函数的过程中调用自己
def recursion(n): recursion(n+1) print("这就是递归") recursion(1)
输出结果
python在调用的过程中超过了最大递归层的限制
print(sys.getrecursionlimit())
sys.getrecursionlimit(1500)#修改最大递归层数的限制
总结
递归调用就是不断的在函数自己里再执行,一直不结束,直到把内存撑爆了,所以需要有限制机制,于是python内部就加上了函数的限制
【25.函数-递归与栈的关系】
递归的本质,函数的调用时通过栈来执行的,栈就像是一个容器,内部是有数据大小限制的
每执行一次函数就会往栈里放内容,不断的放在栈里就容易溢出,只有函数结束以后,栈才会处理垃圾数据
【26.递归的作用】
可以用来解决复杂的数学问题,比如斐波那契数列等
使用递归的场景
def calc(n): v = int(n /2) print(v) if int(v) == 0: return 'Done' calc(v) calc(10)
输出结果
【27.递归的特性总结】
递归是层级进入执行,函数执行完结束也是层级结束的
1.必须有一个明确的结束条件,要不就会变成死循环了,最终撑爆系统
2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3.递归执行效率不高,递归层次过多会导致栈溢出
【28.递归的作用】
递归的作用,斐波那契数列,汉诺塔,求阶乘等
def factoial(n): if n == 1: return 1 return n * factoial(n-1) print(factoial(4))
输出结果
【29.尾递归优化】
有没有优化的方式可以优化递归的效率?
def cal(n): print(n) return cal(n+1) cal(1)
尾递归就是在函数执行的时候直接用return调用,第一层调用第二层函数的时候,使用return直接结束第一层函数的执行,就是层层之间互相不再有对应的关系
也就是说当没有必要保留每一层的数据的时候,就可以直接用return调用下一层的函数,不再对栈有多余的占用
然而尾递归优化并不是所有的语言都是支持的,在C语言里是支持的,但是再python里是没有任何用的,python不会有尾递归优化的
【30.函数-内置方法1,2,3,4,5】
python里有几十种内置方法
abs()>>取绝对值 函数返回数字的绝对值
dict()>>把一个数据转换成字典
help()>>查看帮助
min()>>方法返回给定参数的最小值,参数可以为序列
max()>>方法返回给定参数的最大值,参数可以为序列
setattr()>>【面向对象详细讲】函数对应函数 getatt(),用于设置属性值,该属性必须存在
all()>>函数用于判断给定的可迭代参数(元祖或列表) iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。元素除了是 0、空、FALSE 外都算 TRUE
li = [1,2,3,4] all(li)#这里会返回True li.append(0) all(li)#这里会返回False
any()>>any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 True
bool()>>判断输入的值是不是True
dir()>>打印当前文件存在的所有变量,包括你自定义的和python解释器自带的
hex()>>十六进制,将一个数字转换为十六进制的表达方式
next()
slice()>>切片
divmod()>>求整除和余数,先得到结果再返回余数
id()>>返回传入的内存地址
object()>>
sorted()>>排序,可以对字典的value排序,用在列表里的排序,sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作
ascii()>>返回一个可打印的对象字符串方式表示
enumerate() >>枚举法用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中
input()>>用户交互输入
oct()>>将输入的数字转换为八进制
staticmethod()>>返回函数的静态方法【以后会讲】
bin()>>转换为二进制
eval() >>函数用来执行一个字符串表达式,并返回表达式的值,将字符串解析成代码(只能处理单行的代码)
exec()>>和eval功能相同,而且能执行多行代码,exec是没有返回值的
int()>>将数字转换为整数,不能转换的就报错
open()>>打开文件
str()>>将数字或字符转换为字符串形式
isintance()>>【面向对象】
ord()>>通过字符串返回在ascii表中的位置
chr()>>通过ascii表中的位置返回字符串对应值
sum()>>求和
bytearray()>>返回一个新字节数组,这个数组里的元素是可变的(原内存地址修改,不是重开辟内存空间)
map()>>根据提供的函数对指定序列做映射,可以用来求列表内的元素自乘(配合lambda函数)list(map(lambda x:x+3,[1,2,3,4,5]))
filter()>>过滤,找到符合条件的值--list(filter(lambda x:x>3,[1,2,3,4,5]))
pow()>>返回输入的数字的幂级数
super()>>【面向对象讲】
bytes()>>返回输入的二进制数
float()>>浮点数
iter()>>生成迭代器
print()>>print(*objects, sep=' ', end='\n', file=sys.stdout)
objects -- 复数,表示可以一次输出多个对象。输出多个对象时,需要用 , 分隔。 sep -- 用来间隔多个对象,默认值是一个空格。 end -- 用来设定以什么结尾。默认值是换行符 \n,我们可以换成其他字符串。 file -- 要写入的文件对象 print可以直接把字符串打印到文件里 msg = '小邋遢' f = open("ptint_to_file",'w') print('真呀真邋遢',sep = '|',end = "")
tuple()>>转换为元祖
callable()>>判断一个东西是否可调用,可以判断变量是否是函数
len()>>判断字符串的长度
property()>>【面向对象】
type()>>判断参数的数据类型
frozenset()>>返回一个冻结的集合,冻结后集合不能再添加或删除任何元素
vars()>>打印当前所有的变量
locals()>>在函数的内部执行,打印当前函数的所有的局部变量
globals()>>无论在函数内部还是外部都打印全局的变量
zip()>>函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表,只能是一一对应的关系
l1 = [1,2,3,4] l2 = ['a','b','c','d'] print(list(zip(l1,l2)))