记个笔记
一、递归函数
1.定义
- 编程语言中, 函数直接或间接调用函数本身,则该函数称为递归函数;
- 一种计算过程, 如果其中每一步都要用到前一步或前几步的结果, 称为递归的;
案例:
def func1(n):
if n == 1:
return 1
return n * func1(n - 1)
print(func1(5))
结果:120
运行规律字解:
"""
每次循环调用n-1
5 * func1(5-1) # 当n=5
5 * (4 * func1(4 - 1)) # 当n=4
5 * (4 * (3 * func1(3 - 1)) # 当n=3
5 * (4 * (3 * (2 * func1(2 - 1)) # 当n=2的时候 2-1=1 ,则执行if的判断,返回1
5 * (4 * (3 * (2 * 1))) # 1*1=1
5 * (4 * (3 * 2)) # 2*1=2
5 * (4 * 6) # 2*3=6
5 * 24 # 4*6=24
120 # 最后5*24=120
"""
递归函数的优点是定义简单, 逻辑清晰. 理论上, 所有的递归函数都可以写成循环的方式, 但循环的逻辑不如递归清晰. 使用递归函数需要注意防止栈溢出. 在计算机中, 函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用, 栈就会加一层栈帧, 每当函数返回, 栈就会减少一层栈帧. 由于栈的大小不是无限的, 所以, 递归调用的次数过多, 会导致 栈溢出. 当尝试调用func1(1000)时, 程序会报错。
总结:使用递归函数的优点是逻辑简单清晰, 缺点是过深的调用会导致栈溢出(即比较占用内存空间)
二、匿名函数-lambda
lambda:匿名函数是指没有名字的函数,它主要应用在需要一个函数、但是又不想费神去命名这个函数的场合。通常情况下,这样的函数只使用一次。
格式:
result = lambda[arg1[,arg2,...,argn]]:expression
- lambda只是一个表达式,函数体比def简单很多。
- lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
- lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
- 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
案例:
- 计算某个数值的n次幂
res2 = lambda a, b: a**b
print(res2(10, 10))
# lambda a,b: 相当于 def func(a, b):
三、filter() 、map()、zip()
1.filter()
- 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
def func(a):
return a > 30 # 过滤条件
li = [11, 312, 31, 3, 134, 3, 132, 312, 31, 23, 3] # 数据
res = filter(func, li) # filter函数使用格式
print(list(res))
# 打印结果:[312, 31, 134, 132, 312, 31]
- res = filter(func, li) 该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
2.map()
- map()会根据提供的函数对指定序列做映射。第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
- 也就是说第一个参数传入的是函数,map会把函数的返回值重新存储到一个新列表
def func1(b):
return b*b
li = [11, 312, 31, 3, 134, 3, 132, 312, 31, 23, 3]
res1 = map(func1, li)
print(list(res1)
# 打印结果:[121, 97344, 961, 9, 17956, 9, 17424, 97344, 961, 529, 9]
3.zip()
- zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。我们可以使用 list() 转换来输出列表。
aa = [1, 2, 3, 4, 5]
bb = [2, 3, 4, 5, 6]
cc = [3, 4, 5, 6, 7, 8]
res = zip(aa, bb)
print(list(res))
# [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
res = zip(bb, cc)
print(list(res)) # 元素的个数与最短的列表一致
# [(2, 3), (3, 4), (4, 5), (5, 6), (6, 7)]
四、纯函数
定义:
- 一个函数的返回结果只依赖于他的参数,并且只执行过程里面没有副作用,我们就把这个函数叫做纯函数
3个原则:
- 变量都只在函数作用域内获取,作为函数的参数传入
- 不会产生副作用,不会改变被传入的数据或者其他数据(全局变量)
- 相同的输入保证相同的输出
案例:
- 函数的返回结果只依赖与它的参数,为纯函数
def func(a, b):
return a * b
print(func(2, 4))
- 造成外部函数发生变化的为非纯函数
list = [1, 2, 3, 4, 5]
def func(a, b):
list.append(a)
return a * b
五、三目运算
a = 100
if a > 99:
print(100)
else:
print(22)
print(100) if a > 99 else print(22) # 三目运算