python的匿名函数和递归函数

128 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

大家好,我是木大木大,因为疫情和环境原因啊,在家开始了自学python的路子,从此深坑加一人。后面我会每天持续更新一些学习python的过程,当然一开始就是一些基础啦,希望大家多多支持,莫嫌弃啦~

匿名函数

1.1 高级用法

1.函数可以被引用(可以赋值)

def fn():
    print("我是fn")
f = fn
print(f,fn)  # <function fn at 0x00000285399F73A0> <function fn at 0x00000285399F73A0>
f()  # 我是fn

2.函数可以作为参数传入另外一个函数

def fn():
    print("我是fn")
def fn2(x):  # x——》fn
    print(x)
    x()  # x()==fn()
fn2(fn)

3.可以将函数作为返回值

def fn():
    print("我是fn")
def fn2(x):  # x——》fn
    return x
x = fn2(fn)  # fn
x()  # 我是fn

4.函数可以作为容器的元素

def fn():
    print("我是fn")
list1 = [1,2,3,fn]
f = list1[3]  # fn
f()

1.2 匿名函数(lambda)

语法:
lambda 参数列表:运算表达式
# 普通写法
def fn(x):
    return x*x
print(fn(5))

# lambda写法
f = lambda x:x*x
print(f(5))  # 25
总结:
1.lambda并不会带来程序运行效率的提高,只会使代码更加简洁
2.如果使用 lambdalambda内部不要有循环,因为可读性不好,有的话请使用标准函数来完成,目的使为了代码有可重用性和可读性
3.lambda只是为了减少单行函数的定义而存在,如果一个函数,只有一个返回值,只有一句代码,就可以使用 lambda

1.3 高阶函数

1.3.1 高阶内置函数简介

高阶函数其实就是把函数作为参数传入
abs()  # 绝对值
print(abs(-1))  # 1
sum()
print(sum([1, 2, 3, 4, 5]))  # 15
print(sum((2, 3, 4), 2))  # 元组计算总和后再加 2  得到结果是11
print(sum([2, 3, 4, 1], 1))  # 列表计算总和后再加 1  得到结果是11

round() # 四舍五入,精度问题  四舍六入
print(round(4.3))  4
print(round(4.8))  5
def ab_sum(a,b):
    return abs(a) + abs(b)
res = ab_sum(-1,-4)
print(res)
任意两个数字,对2个数字求绝对值后进行求和
def ab_sum(a,b,f):
    return f(a) + f(b)
result = ab_sum(-1,-4,abs)
print(result)  # 5

def ab_sum(a,b,f):
    return f(a) + f(b)
result = ab_sum(-1,-4.3,round)
print(result)  # -5
任意两个数字,对2个数字求相反数的和
def xfs(x):
    return -x
def ab_sum(a,b,f):
    return f(a) + f(b)
result = ab_sum(-1,4,xfs)
print(result)

1.3.2 map()

map(func,seq) 第一个参数是给一个函数,第二个参数是给一个序列类型,map返回的是一个迭代器
将列表序列中各个元素加一
# 普通写法
list1 = [1,2,3,4,5]
list2 = []
for i in list1:
    list2.append(i+1)
print(list2)  # [2, 3, 4, 5, 6]

# map写法
list1 = [1,2,3,4,5]
def add1(x):
    return x+1
print(list(map(add1,list1)))  # [2, 3, 4, 5, 6]

迭代器就是可以用来循环迭代取值
list可以一次性拿到迭代器所有元素并且放到数组中
list1 = [-1,2,-3,4,-5]
print(list(map(abs,list1))) # [1, 2, 3, 4, 5]

list1 = [1,2,3,4,5]
def add1(x):
    return '木大'
print(list(map(add1,list1)))  # ['木大', '木大', '木大', '木大', '木大']

# lambda写法
list1 = [1,2,3,4,5]
print(list(map(lambda x: x + 1, list1)))
总结:
1.map内置函数的作用就是操作序列中所有的元素,并返回一个迭代器,迭代器转为列表
2.咱们的lambda表达式可以专门配合我们的高阶内置函数来做简单实现

1.3.3 filter()

语法:
filter(func,seq)第一个参数是给一个函数,第二个参数给一个序列类型,用于过滤序列,过滤掉不符合条件的元素,结果可以通过list转换
保留一个序列中所有的偶数
# 普通写法
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for i in list1:
    if i % 2 != 0:
        list1.remove(i)
print(list1)


# filter写法
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def o2s(x):
    return x % 2 == 0
print(list(filter(o2s, list1)))

# lambda写法
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(list(filter(lambda x: x % 2 == 0, list1)))

1.3.4 sorted()

sorted(序列类型,key=函数)
返回一个排序后的序列
list1 = [2,4,1,3,5,6,9,7]
print(sorted(list1))  # 升序 [1, 2, 3, 4, 5, 6, 7, 9]
print(sorted(list1,reverse=True)) # 降序 [9, 7, 6, 5, 4, 3, 2, 1]
根据列表中的分数进行排序
# 普通写法
list1 = ["七零:69","久违:79","大力:89","乃荣:100","小川:59"]
def f(x):
    arr = x.split(":")
    return int(arr[1])
print(sorted(list1, key=f))

# lambda写法
list1 = ["七零:69","久违:79","大力:89","乃荣:100","小川:59"]
print(sorted(list1, key=lambda x: int(x.split(":")[1])))
max(可迭代对象,key=函数):根据函数获取可迭代对象的最大值
min(可迭代对象,key=函数):根据函数获取可迭代对象的最小值
a = ["张三:100","李四:77","王五:99","赵六:50"]
def f(x):
    return int(x.split(":")[1])
print(min(a,key=f))  # 赵六:50
print(max(a,key=f))  # 张三:100
总结:
有了这些内置高阶函数,我们可以更加灵活的去操作序列类型,比原始的for循环 if判断 要简单那么一点,但是其实也就简单一点点,更多是变灵活了

1.3 递归函数

如果一个函数的内部调用了自己,那么这个就叫做递归

如果要定义递归函数,不想让它报错的话,必须要有出口

不断地向出口接近

打印1-500

def fun(x): if x == 501: return print(x) return fun(x+1) # f(1) f(2) =>f(501) fun(1)

1234...9 9! = 987654321 9! = 98! 9! = 987! 9! = 9876! n! = n*(n-1)!

def f(n): if n ==1: return 1 return nf(n-1) # 5432*1 a = f(5) print(a)


函数的递归:是函数嵌套调用的一种特殊形式,函数嵌套调用在调用一个函数的过程当中调用了另外的函数。函数的递归在调用一个函数的过程中又调用到本身