码迷,mamicode.com
首页 > 编程语言 > 详细

Python高阶函数和装饰器

时间:2021-06-02 15:38:34      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:map函数   **kwargs   comm   函数   return   一个   登录   tor   ever   

高阶函数

能够把函数当做参数传递的函数被称为高阶函数。

map函数

把传入的函数func作用到iterable中的每个元素中。

map(func, iterable)

参数:

  • func:函数(内置函数,自定义函数)
  • iterable:可迭代对象

返回值:

  • 迭代器

示例:

list1 = [1, 2, 3, 4, 5, 6]

def squire_func(x):
    return x * x

res = map(squire_func, list1)
print(res)  # <map object at 0x0000017520035208>
print(list(res))  # [1, 4, 9, 16, 25, 36]

注:必须要有形参和返回值

reduce函数

reduce()函数同样接收两个参数,一个是函数,一个是Iterable,reduce把返回的结果继续和序列的下一个元素做累积计算。如果提供initial参数,会以sequence中的第一个元素和initial作为参数调用function,否则会以序列sequence中的前两个元素做参数调用function。

reduce(function, sequence, initial=None)

注:reduce传入的函数function必须接受2个参数

示例:

from functools import reduce

list1 = [7, 7, 5, 8]
def func(a, b):
    return a + b

res = reduce(func, list1)
print(res)  # 27

list2 = [1, 2, 3, 4]
print(reduce(lambda x, y: x + y, list2, 3))  # 13

filter函数

filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定是否保留该元素。

filter(function, iterable) 

示例:

list1 = [1, 2, 3, 4, 5, 6]

def func(x):
    return x % 2 == 0

res = filter(func, list1)
print(res)  # <filter object at 0x00000297C8DE5288>
print(list(res))  # [2, 4, 6]

list2 = [1, 3, 4, 5, 7, 8, 9, 10]
res2 = filter(lambda n: True if n % 2 == 0 else False, list2)
print(list(res2))  # [4, 8, 10]

sorted函数

Python内置的sorted()函数可以对可迭代数据进行排序。

sorted(iterable, key, reverse)
  • iterable:可迭代对象
  • key:指定函数
  • reverse:是否倒序

返回值: 列表

示例:

tup1 = (10, 20, -30, 40)
# 从小到大
print(sorted(tup1))  # [-30, 10, 20, 40]
# 从大到小
print(sorted(tup1, reverse=True))  # [40, 20, 10, -30]

# 按照绝对值排序
tup2 = (30, -20, 10, -40, 50)
print(sorted(tup2, key=abs))  # [10, -20, 30, -40, 50]

# 按照自定义函数排序
tup3 = (18, 25, 16, 32)
def func(n):
    print(n % 10)
    return n % 10

list3 = sorted(tup3, key=func)
print(list3)  # [32, 25, 16, 18]

注:sorted()函数可以对任意的容器数据类型进行排序。

装饰器

在不修改原有代码的情况下,使用装饰器可以为已有函数增加新的功能,装饰器本质上是一个闭包函数。

装饰器示例

  • 不修改已有函数的代码
  • 不修改已有函数的调用方式
  • 对已有函数增加新的功能
# 定义装饰器
# 闭包函数的参数有且只有一个并且是函数类型,这个闭包函数被称为装饰器
def decorator(func):
    def inner():
        print("已经添加登录验证")
        func()
    return inner

def comment_func():
    print("发表评论")

# 调用装饰器对已有函数装饰
comment_func = decorator(comment_func)
# 调用方式不变
comment_func()

装饰器语法糖

通常情况下,我们使用装饰器提供的 @ 语法糖,来简化上面的写法。

# 定义装饰器
# 闭包函数的参数有且只有一个并且是函数类型,这个闭包函数被称为装饰器
def decorator(func):
    def inner():
        print("已经添加登录验证")
        func()
    return inner

@decorator  # comment_func = decorator(comment_func)
def comment_func():
    print("发表评论")

# 调用方式不变
# 实际调用的是内部的inner函数
comment_func()

通用装饰器

装饰带有参数的函数

def decorator(func):
    def inner(a, b):
        print("正在执行加法运算")
        func(a, b)
    return inner

@decorator
def add_num(num1, num2):
    result = num1 + num2
    print("结果为:", result)

add_num(1, 2)

装饰带有参数和返回值的函数

def decorator(func):
    def inner(a, b):
        print("正在努力执行加法运算")
        sum = func(a, b)
        return sum

    return inner

@decorator  # add_num = decorator(add_num)
def add_num(num1, num2):
    result = num1 + num2
    return result

result = add_num(1, 2)
print("结果为:", result)  # 结果为: 3

装饰带有不定长参数和返回值的函数

def decorator(func):
    def inner(*args, **kwargs):
        print("正在执行加法运算")
        num = func(*args, **kwargs)
        return num
    return inner

@decorator  # add_num = decorator(add_num), add_num = inner
def add_num(*args, **kwargs):
    result = 0
    for value in args:
        result += value

    for value in kwargs.values():
        result += value

    return result

result = add_num(10, 20)
print("结果为:", result)  # 30

多个装饰器的使用

多个装饰器的过程:由内到外的一个装饰过程,先执行内部的装饰器,在执行外部的装饰器。

def decorator_b(func):
    print("decorator b 执行了")

    def inner():
        result = "<div>" + func() + "</div>"
        return result

    return inner


def decorator_a(func):
    print("decorator a 执行了")

    def inner():
        result = "<p>" + func() + "</p>"
        return result

    return inner

# 原理:content = decorator_b(decorator_a(content))
@decorator_b
@decorator_a
def content():
    return "人生苦短,我用python"


res = content()
print(res)

输出内容如下:

decorator a 执行了
decorator b 执行了
<div><p>人生苦短,我用python</p></div>

带有参数的装饰器

带有参数的装饰器就是使用装饰器装饰函数的时候可以传入指定的参数。

语法格式:

@装饰器(参数,...)

示例:

def return_decorator(flag):
    def decorator(func):
        def inner(a, b):
            if flag == "+":
                print("正在执行加法运算")
            elif flag == "-":
                print("正在执行减法运算")
            func(a, b)
        return inner
    # 调用函数的时候,可以返回一个装饰器
    return decorator

@return_decorator("+")  # decorator = return_decorator("+"),add_num = decorator(add_num)
def add_num(a, b):
    result = a + b
    print(result)


add_num(1, 2)

@return_decorator("-")
def sub_num(a, b):
    result = a - b
    print(result)

sub_num(1, 2)

使用带有参数的装饰器,其实是在装饰器外面又包裹了一个函数,使用该函数接受参数,返回装饰器。

类装饰器

class MyDecorator(object):
    def __init__(self, func):
        self.func = func
        pass

    # 实现__call__方法,让对象变为可调用的对象,可调用的对象能够像函数使用
    def __call__(self, *args, **kwargs):
        print("在call方法中调用了func函数")
        self.func()

@MyDecorator  # show = MyDecorator(show)
def show():
    print("show方法执行了")

# show() => 对象()
show()

Python高阶函数和装饰器

标签:map函数   **kwargs   comm   函数   return   一个   登录   tor   ever   

原文地址:https://www.cnblogs.com/bubbleboom/p/14825094.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!