Python系列 之 函数

本文详细介绍了Python中的函数,包括位置参数、默认参数、可变参数和关键字参数的使用,以及高阶函数如map、filter和reduce的原理和应用。此外,还讲解了匿名函数lambda和返回函数的概念。最后,深入探讨了Python装饰器的实现方式,包括如何创建带参数的装饰器,并使用functools.wraps保持被装饰函数的元信息完整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OS:Windows
Python:3.8.8
IDE:Sublime Text 3

函数的参数

位置参数和默认参数

定义一个函数,里面包含两个参数,param1 是位置参数在调用函数的时候必须提供的,param2是 默认参数 设置的默认值为 None(当然可以设置成其他值;注意:定义默认参数尽量指向不变对象

def demo_function1(param1, param2=None):
    """
    函数的 位置参数 和 默认参数
    param1:位置参数,调用函数时应给予参数,否则报TypeError
    TypeError: * missing 1 required positional argument: *
    param2:默认参数,调用函数时可不提供该参数,当前默认None
    """
    print(param1)
    print(param2)

调用 demo_function1 参数 param1 赋值 “param1”

# 调用 demo_function1 只给位置参数 param1 赋值
#两种赋值方式都可以
#demo_function1(param1="param1")
demo_function1("param1")

输出:

param1
None

调用 demo_function1 参数 param2 重新赋值 “param2”

    demo_function1("param1", param2="param2")
    # demo_function1("param1", "param2")

输出:

param1
param2

可变参数和关键字参数

定义函数的可变参数关键字参数和上面的位置参数和关键字参数理论上是一样的,只是把参数的概念进行了抽象化
定义一个可变参数和关键字参数的函数:

def demo_function2(*args, **keywords):
    """
    函数的可变参数和关键字参数
    *args :    可变参数
    *keywords :关键字参数
    """
    print(args, keywords)

*args : *符号定义了 args 是可变参数(备注 args 只是一个名字,也可以是别的名字)
**keywords: **符号定义了 keywords 是关键字参数(备注 keywords 也只是一个名字,也可以是别的名字)
调用 demo_function2:

	# args 是 1, 2,"3" keywords是 A="a",B="b"
    demo_function2(1, 2,"3", A="a",B="b")

输出:

(1, 2, ‘3’) {‘A’: ‘a’, ‘B’: ‘b’}

可以看出 args 相当于是一个 tuple ; keywords是个 dict
把 demo_function2 改动一下就可以拿到args和keywords的每个值;修改 demo_function2 :

def demo_function2(*args, **keywords):
    """
    函数的可变参数和关键字参数
    *args :    可变参数
    *keywords :关键字参数
    """
    #print(args, keywords)
    for arg in args:
        print(arg)
    for keyword in keywords:
        print(keywords[keyword])

再次调用修改后的 demo_function2:

    # args 是 1, 2,"3" keywords 是 A="a",B="b"
    demo_function2(1, 2, "3", A="a", B="b")

输出:

1
2
3
a
b

print部分可以改成你想要的逻辑
也可以像下面这样调用demo_function2函数 效果是一样的:

    param_list = [1, 2, "3"]
    param_dict = {"A": "a", "B": "b"}
    #demo_function2(1, 2, "3", A="a", B="b")
    demo_function2(*param_list, **param_dict)

高阶函数

map函数

map函数接收两个参数:第一个参数是一个函数,第二个函数是一个 Iterable对象;map函数的作用是将 Iterable对象中的每一个元素代入到 第一个函数中,返回一个新的 Iterator

先定义一个函数用来当做map函数的参数:
函数 map_function 功能:如果param是str类型的就转小写

def map_function(param):
    """将参数param变成小写"""
    if isinstance(param, str):
        param = param.lower()
    return param

定义一个列表 作为map函数的第二个参数:

demo_list = ["A", "B", "c", 1, 2, 3]

map函数调用:

result = map(map_function, demo_list)

由于map函数返回的是Iterator 惰性序列,可以用list转换成列表

result = list(result)

完整示例:

def demo_function3():
    """
    map函数使用
    """
    demo_list = ["A", "B", "c", 1, 2, 3]
    result = map(map_function, demo_list)
    result = list(result)
    print(result)

def map_function(param):
    """将参数param变成小写"""
    if isinstance(param, str):
        param = param.lower()
    return param

调用 demo_function3 函数:
输出:

[‘a’, ‘b’, ‘c’, 1, 2, 3]

filter函数

filter函数可以用来过滤序列中的特定元素
用法和map函数一样,语法结构

filter(filter_function, iterable_list)

先定义一个 filter_function :

def filter_function(param):
    """如果是str 就返回 True"""
    return isinstance(param, str)

然后给出一个 iterable_list :

iterable_list = [1, 2, 3, "A", "b", "C"]

用filter函数进行过滤 并输出结果:

result = list(filter(filter_function, iterable_list))
print(result)

输出:

[‘A’, ‘b’, ‘C’]

最后的结果只保留了 str 类型,int型 被过滤掉了。
完整示例:

def filter_function(param):
    """如果是str 就返回 True"""
    return isinstance(param, str)

def demo_function6():
    iterable_list = [1, 2, 3, "A", "b", "C"]
    result = list(filter(filter_function, iterable_list))
    print(result)

调用demo_function6函数,输出:

[‘A’, ‘b’, ‘C’]

结合map函数和filter函数 输出 列表中字符串,并转换成小写:

def map_function(param):
    """将参数param变成小写"""
    if isinstance(param, str):
        param = param.lower()
    return param
    
def demo_function6():
    iterable_list = [1, 2, 3, "A", "b", "C"]
    result = list(filter(filter_function, map(map_function, iterable_list)))
    print(result)

调用demo_function6函数,输出:

[‘a’, ‘b’, ‘c’]

reduce函数

reduce函数和map函数类似,第一个参数是一个函数,第二个函数是一个 Iterable对象,不同的地方在于,reduce的第一个参数的函数需要接收两个参数,reduce函数从Iterable对象中每次取两个元素计算结果,并将结果与Iterable对象的下一个元素代入第一个参数函数
先定义一个函数 reduce_function 用来作为reduce函数的第一个参数:

def reduce_function(param_x, parax_y):
    """返回参数乘积"""
    return param_x * parax_y

调用 reduce函数:

"""reduce函数使用"""
from functools import reduce
param_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = reduce(reduce_function, param_list)
print(result)

输出:

3628800

匿名函数 lambda

lambda语法结构 : lambda 参数:逻辑表达式
例如:

lambda x: x + 1
#相当于 下面这个函数
# def f(x): 
#     return x + 1
lambda x, y: x + y
#相当于 下面这个函数
# def f(x, y):
#     return x + y

lambda 冒号之前的元素代表 函数参数(多个参数用逗号分隔);冒号之后的表达式代表 计算逻辑,并将表达式的运算结果作为返回值 return

返回函数

函数也可以作为函数的返回值 例如:
可以直接用 lambda 作为函数的返回值 return(也可以是你自己定义的函数)
定义一个 demo_function5 函数:

def demo_function5():
    return lambda x, y: x + y

lambda作为函数的返回值 return
然后调用 demo_function5 :

f = demo_function5()
print(f)
print(f.__name__)
print(f(1, 2))

输出:

<function demo_function5.<locals>.<lambda> at ***>
<lambda>
3

可以看出demo_function5的返回值 f 是个函数;函数 f 的名字是:lambda;调用 f(x,y) 可以计算 x+y的计算结果
注意:函数作为返回值,必须进行再次调用才会真正调用返回的函数 :f(1, 2) 调用 f 之后 才会对 lambda 函数的表达式进行计算

装饰器

假如现在有一个函数,如果不想改变现有函数,而且想让函数执行的时候新增其他功能,那这时候就可以使用装饰器;先写个简单的例子:
demo_function7函数 :

def demo_function7():
    print("这里是demo_function7函数")

如果想要在demo_function7执行前再执行其他功能的话;先写一个装饰器函数:

def wrapper_function(fn):
    """装饰器函数"""
    def wrapper(*args, **keywords):
        print("这里是装饰器函数输出")
        return fn(*args, **keywords)
    return wrapper

然后修改demo_function7函数:

@wrapper_function
def demo_function7():
    print("这里是demo_function7函数")

只是在函数定义上面添加了 @wrapper_function
调用demo_function7 输出:

这里是装饰器函数输出
这里是demo_function7函数

调用demo_function7函数的时候就相当于调用了:

wrapper_function(demo_function7)()

如果想要在demo_function7函数执行前后都进行一些操作的话,
修改wrapper_function函数:

def wrapper_function(fn):
    """装饰器函数"""
    def wrapper(*args, **keywords):
        print("这里是demo_function7函数执行之前")
        func = fn(*args, **keywords)
        print("这里是demo_function7函数执行之后")
        return func
    return wrapper

调用demo_function7 输出:

这里是demo_function7函数执行之前
这里是demo_function7函数
这里是demo_function7函数执行之后

如果wrapper_function函数需要传入参数的话;
修改wrapper_function函数:

def wrapper_function(param):
    """装饰器函数"""
    def decorator(fn):
        def wrapper(*args, **keywords):
            print(f"这是wrapper_function的参数:{param}")
            print("这里是demo_function7函数执行之前")
            func = fn(*args, **keywords)
            print("这里是demo_function7函数执行之后")
            return func
        return wrapper
    return decorator

然后修改demo_function7函数:

@wrapper_function("param")
def demo_function7():
    print("这里是demo_function7函数")

“param” 就是传给wrapper_function函数的参数
调用demo_function7函数 输出:

这是wrapper_function的参数:param
这里是demo_function7函数执行之前
这里是demo_function7函数
这里是demo_function7函数执行之后

此时调用demo_function7函数,相当于执行了:

wrapper_function("param")(demo_function7)()

接下来,如果直接调用wrapper_function函数:

res = wrapper_function(demo_function7)
print(type(res))
res = wrapper_function("param")(demo_function7)
print(type(res))

输出

<class ‘function’>

返回值是个 函数 类型;那看看函数名字是什么:

print(res.__name__)#输出函数名称

输出:

wrapper

这是因为wrapper_function的返回值是wrapper函数;所以加载了装饰器的函数__name__属性,被更换成了wrapper,这样一来,有些依赖函数签名的代码执行就会出错,现在需要借助functools.wraps来解决这个问题;
现在修改wrapper_function函数:

def wrapper_function(param):
    """装饰器函数"""
    def decorator(fn):
        from functools import wraps

        @wraps(fn)
        def wrapper(*args, **keywords):
            print(f"这是wrapper_function的参数:{param}")
            print("这里是demo_function7函数执行之前")
            func = fn(*args, **keywords)
            print("这里是demo_function7函数执行之后")
            return func
        return wrapper
    return decorator

在wrapper_function函数里面的wrapper函数定义上面加装了
wraps作为装饰器,wraps是Python内置的工具
注意需要:

from functools import wraps

再次调用:

res = wrapper_function("param")(demo_function7)
print(res.__name__)#输出函数名称

输出:

demo_function7

带参数装饰器的完整示例:

def wrapper_function(param):
    """装饰器函数"""
    def decorator(fn):
        from functools import wraps

        @wraps(fn)
        def wrapper(*args, **keywords):
            print(f"这是wrapper_function的参数:{param}")
            print("这里是demo_function7函数执行之前")
            func = fn(*args, **keywords)
            print("这里是demo_function7函数执行之后")
            return func
        return wrapper
    return decorator
    
@wrapper_function("param")
def demo_function7():
    print("这里是demo_function7函数")

至此,有关Python的函数暂时告一段落;
如果有什么错误的地方,欢迎评论指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值