python的函数进阶

匿名函数

基本语法

lambda:定义匿名函数(没有函数名的函数)
lambda 参数1,参数2,参数n : 返回值

应用场景

1、用于定义一些函数结构体非常简单、而且使用次数较少的函数
2、作为函数的参数传递
    # 实例 对下面的列表进行排序(根据列表中的每个元素的第二值的大小进行排序)
    li = [[1, 10, 32], [3, 22, 99], [2, 7, 77]]
    li.sort(key=lambda x: x[1])
    print(li)

内置函数

filter

# 参数1:过滤规则函数
# 参数2:可迭代对象
li = [11, 2, 34, 42, 15, 26, 7, 88, 29, 100]
res = filter(lambda x: x > 30, li)
print(list(res))

map

# 参数1:处理函数
# 参数2:可迭代对象
li = [11, 22, 33, 25, 18, 34, 2, 7, 5, 9]
res = map(lambda x: x ** 2, li)
print(list(res)) 

exec

# python代码执行器函数,可以执行字符串中的python代码
code = """
a=100
b=200
print(a+b)
"""
exec(code)

all

# 迭代对象内所有的元素为真,返回True
def work(name=None, age=None, sex=None):
    if all([name, age, sex]):
        print("条件成立")


work(11, 22, 33)

any

# 迭代对象内只要有一个元素为真,就返回True
def work(name=None, age=None, sex=None):
    if any([name, age, sex]):
        print("条件成立")


work(11)

zip

# 聚合打包
li1 = [11, 22, 33, 44]
li2 = ["aa", "bb", "cc", "dd"]
res = zip(li1, li2)
print(dict(res))

偏函数

作用

当函数的参数个数太多,需要简化时,使用functools。partial可以创建一个新的函数,
这个新函数可以固定住原函数的部分参数,从而在调用的时候更简单

分类

1、partial:可以用来对函数进行包装,固定函数的参数值(给函数的参数设置默认值)
2、wraps:将一个函数的属性赋值给另一个函数,消除装饰器的副作用
3、lru_cache函数:缓存装饰器函数,缓存函数调用的结果,节约程序的内存开销,
对于相同入参函数执行,只会执行一次,会将第一次执行的结果缓存起来,后面调用时直接返回函数的结果,而不执行函数,
一般用于递归函数

实例1

from functools import partial


def work(a, b, c):
    print(a)
    print(b)
    print(c)


res = partial(work, a=99, c=88)
res(b=77)

递归函数

定义

在函数内部调用函数本身的函数被称之为递归函数

最大递归深度

# 超过最大递归深度,则会抛出异常
# 所有在编写递归函数时候,要注意递归的临界点(终止递归的条件)
import sys

print(sys.getrecursionlimit())

实例1

# 递归函数实现斐波拉契数列(第一个数据值为1,后一个数据的值为前两个数据之和)
# 1 1 2 3 5 8 13 21...
from functools import lru_cache


@lru_cache(maxsize=128)
def fib(n):
    if n == 1 or n == 2:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)


print(fib(100))

闭包函数

定义

函数+封闭作用域

特点

1、函数内部嵌套一个函数
2、外层函数的范围值为里面嵌套的函数
3、嵌套函数内部,引用了外部的非全局变量(外层函数的作用域的变量)

作用

1、实现数据的锁定
2、当成装饰器使用

实例1

items = []
for i in [1, 2, 3, 4]:
    def func(i):
        def work():
            return i * 2

        return work


    w = func(i)
    items.append(w)
i = 100    
for f in items:
    print(f())

img

posted @ 2022-11-06 14:05  NikeAirBall  阅读(30)  评论(0)    收藏  举报