Python高级函数、映射map()和过滤filter()的关系、匿名函数lambda()、sort()和sorted()、闭包、装饰器详解 -*- Python基础知识09 -*-

高级函数

  1. 接收一个或多个函数作为参数
  2. 将函数作为返回值返回

满足两个条件中任意一个即为高级函数

# 接收函数作为参数来使用
def fn1(a):
    return a % 3 == 0


def fn2(a):
    return a > 5


def fn(func, data):
    a = []
    for i in data:
        if func(i):
            a.append(i)
    return a

lis = [1,2,3,4,5,6,7,8,9]
print(fn(fn1,lis))

# 将函数作为返回值返回
def fn():
    def fn1():
        print('我是第二层函数')
    return fn1

data = fn()
print(data())

filter()和map()

filter()

fliter()过滤器,接受任意可迭代对象进行指定规则的过滤。
语法:filter(过滤规则,可迭代对象) (过滤后会返回一个filter的对象。)

map()

map()映射,根据指定规则,映射成为一个新的数组。
语法: map(映射规则,可迭代对象)(映射后会返回一个map的对象。)

def fn1(a):
    return a % 3 == 0

lis = [1, 2, 3, 4, 5, 6, 7, 8, 9]
data = filter(fn1, lis)
print(data, list(data)) # <filter object at 0x00000270F4F41308> [3, 6, 9]

lis = [1, 2, 3, 4, 5, 6, 7, 8, 9]
data = map(fn1, lis)
print(data, list(data)) # <map object at 0x000001C102DA1308> [False, False, True, False, False, True, False, False, True]

匿名函数lambda()

lambda()匿名函数表达式是Python中的语法糖,用来创建一些简单的函数。

语法糖:对功能并没有影响,但能够增加程序的可读性,从而减少程序代码出错的机会

语法:lambda 参数列表:返回值
匿名函数不建议直接赋值给变量使用,一般它都是作为map()、filter()等函数的参数使用。

data = list(map(lambda a : a % 3 == 0, lis))
print(data) # [False, False, True, False, False, True, False, False, True]
data = list(filter(lambda a : a % 3 == 0, lis))
print(data) # [3, 6, 9]

sort()和sorted()的关系

sort(key=排序方法)用来对列表进行排序函数,如果没有key,则默认按照数字大写来排序,并且不同类型之间无法排序。
而sort()是在原列表基础上进行修改,sorted则不修改原列表,会将新列表已返回值形式返回。
sort()只能对可以变的可迭代对象操作,而sorted可以对元组等不可变的可迭代对象进行操作

lis = ['555', '66', '88', '9', '33333', '4444', '111111', 123]
lis1 = (5,6,2,3,4,9,1)
data = lis.sort(key = len and int)
print(data,lis) # None ['9', '66', '88', 123, '555', '4444', '33333', '111111']
data = sorted(lis1)
print(data,lis1) # [1, 2, 3, 4, 5, 6, 9] (5, 6, 2, 3, 4, 9, 1)

闭包

将函数作为返回值返回的一种高阶函数,常用于变量不希望被外部修改的时候。
形成闭包的条件

  1. 函数嵌套
  2. 将内部函数作为返回值返回
  3. 内部函数必须使用到外部函数
    在闭包中可以创建只用当前函数才能访问到的变量,可以避免变量二次赋值后覆盖和加强变量的安全性。
def fn():

    lis = []

    def fn1(n):
        lis.append(n)
        return sum(lis)/len(lis)

    return fn1

data = fn()
print(data(20)) # 20.0
print(data(30)) # 25.0
print(data(40)) # 30.0

装饰器

通过装饰器可以在不修改原函数的情况下最函数进行扩展(开发中对函数的扩展功能大多数都是用装饰器来完成的。)
常用装饰器创建方法(装饰器创建方法众多,在这里就举一个通用的方法):

def 装饰器名(func)
    def 函数名(*args,**kwargs):
	    print(‘开头装饰器内容’)
        func(*args,**kwargs)
        print(‘结尾装饰器内容’)
    return 函数名

调用时在需要添加装饰器的函数前添加 @装饰器名即可

def test(func):

	def fn(*args,**kwargs):
		print('我是开始装饰')
		func(*args,**kwargs)
		print('我是结束装饰')

	return fn

@test
def fn1():
    print('我是fn')
print(fn1())
发布了47 篇原创文章 · 获赞 23 · 访问量 3434

猜你喜欢

转载自blog.csdn.net/qq_39611230/article/details/102649807