递归函数、匿名函数、纯函数、三目运算

记个笔记

一、递归函数

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)  # 三目运算
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值