关于Python的学习记录(十二)
标签: 关于Python的学习记录(十二) 博客 51CTO博客
2023-07-21 18:24:29 69浏览
函数装饰器
定义一个装饰器函数 execute_time_decorator()
,它的作用是在被装饰函数执行前后分别输出时间:
import datetime
def execute_time_decorator(func):
def wrapper():
print("执行开始:", datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
func()
print("执行结束:", datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
return wrapper
在上述代码中,我们定义了一个名为 execute_time_decorator()
的装饰器函数,它接受一个函数作为参数,并返回一个内部函数 wrapper()
。在 wrapper()
函数中,我们先输出一条信息表示函数即将执行,然后调用被装饰函数 func()
,最后输出一条信息表示函数执行完成。
使用 @ 符号来应用装饰器到我们的函数上,如下所示
import datetime
def execute_time_decorator(func):
def wrapper():
print("执行开始:", datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
func()
print("执行结束:", datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
return wrapper
@execute_time_decorator
def hello():
print("Hello, world!")
hello()
# 执行开始: 2023-05-23 15:32:52
# Hello, world!
# 执行结束: 2023-05-23 15:32:52
@函数名
就是装饰器的语法,是不是相当优雅和简洁!需要注意的是,装饰器函数接收的参数一定是一个函数,原理很简单,就是通过在函数内部定义了一个 wrapper 函数
,在执行原函数的前后,封装一些具体的逻辑,从而实现了通过非侵入性的方式为原函数添加额外功能的例子,装饰器是一种非常优美的设计,在日常的编程中都会见到对它的一些应用,比如为函数打印时间、日志、传递参数等等
高阶函数
Python 中的高阶函数是指可以接受函数作为参数或返回函数作为结果的函数。
map 函数
map 函数可以将一个函数应用到一个序列的每个元素上,并返回一个新的序列,语法如下:
map(function, iterable, ...)
其中,function 是要应用的函数,iterable 是要处理的可迭代序列。下面是一个 map 函数的例子,用于计算给定 numbers 列表中每个数字的平方:
numbers = [1, 2, 3, 4, 5]
def get_square(x):
return x**2
squares = map(get_square, numbers)
print(list(squares)) # [1, 4, 9, 16, 25]
在这段代码中,get_square
函数用于计算单个数字的平方,map 函数轻松的将该函数应用到了 numbers 列表的每个元素上,然后得到一个新的平方列表。
reduce 函数
reduce 可以对一个序列进行累积计算,返回一个单一的结果,语法如下:
reduce(function, iterable[, initializer])
其中,function 是要应用的函数,iterable 是要处理的可迭代序列,initializer 是可选的初始值。整个计算过程大体如伪代码所示:
# reduce(function, iterable[, initialize])
result = initializer
for element in iterable:
result = function(result, element)
return result
reduce 函数首先将初始值赋给 result,然后对于 iterable 中的每个元素,都将 result 和该元素作为参数传递给 function 函数进行计算,并将计算结果赋给 result。最终,reduce 函数返回 result 作为计算结果。需要注意的是,如果没有提供初始值,reduce 函数会将 iterable 中的第一个元素作为初始值,并从 iterable 的第二个元素开始进行计算。如果 iterable 为空并且没有提供初始值,reduce 函数会抛出一个 TypeError 异常。因此,在使用 reduce 函数时,最好提供一个初始值。
下面是一个 reduce 函数的例子,用于计算给定 numbers 序列的乘积:
from functools import reduce
def get_product(x, y):
return x * y
numbers = [1, 2, 3, 4, 5]
product = reduce(get_product, numbers)
print(product) # 120 1 * 2 * 3 * 4 * 5
在这段代码中,我们定义了 get_product
函数,用于计算传入的两个参数的乘积。reduce 函数首先将初始值 1 赋给 result,然后对于 numbers 序列中的每个元素,都将 result 和该元素作为参数传递给 get_product
函数进行计算,并将计算结果赋给 result。具体来说,reduce 函数的计算过程如下:
result = 1
result = get_product(result, 2) = 1 * 2 = 2
result = get_product(result, 3) = 2 * 3 = 6
result = get_product(result, 4) = 6 * 4 = 24
result = get_product(result, 5) = 24 * 5 = 120
filter 函数
filter 函数可以根据一个函数的返回值为 True 或者 False 来过滤一个序列(返回值为 True 的元素被保留),返回一个新的序列,语法如下:
filter(function, iterable)
其中,function 是要应用的函数,iterable 是要处理的序列。下面是一个 filter 函数的例子:
def get_even_numbers(x):
return x % 2 == 0
numbers = [1, 2, 3, 4, 5]
evens = filter(get_even_numbers, numbers)
print(list(evens)) # [2, 4]
在这段代码中,我们定义了 get_even_numbers
函数用于判断一个数字是否是偶数,如果是返回 True,否则返回 False。filter 函数将其应用到 numbers 序列上,它会过滤出函数结果为 True 的值组成一个新的序列,所以新序列中中只包含偶数。
lambda 函数
在使用函数的时候,如果作为参数或者返回值的函数本身非常简单,一行代码就能够完成,那么我们可以使用Lambda 函数来表示。Python 中的 Lambda 函数是没有的名字函数,所以很多人也把它叫做匿名函数,匿名函数只能有一行代码,代码中的表达式产生的运算结果就是这个匿名函数的返回值。
lambda 函数的语法如下:
lambda arguments: expression
其中,lambda
是关键字,arguments
是函数的参数,expression
是函数的返回值。lambda 函数可以有任意数量的参数,但只能有一个表达式。
例如,下面的代码定义了一个 lambda 函数,它接受两个参数并返回它们的和:
sum_nums = lambda x, y: x + y
print(sum_nums(2, 3)) # 输出 5
lambda 函数还可以与其他函数一起使用
numbers = [1, 2, 3, 4, 5]
squares = list(map(lambda x: x**2, numbers))
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(squares) # 输出 [1, 4, 9, 16, 25]
print(evens) # 输出 [2, 4]
在这个例子中,map()
函数将 lambda 函数应用于 numbers 列表中的每个元素,并返回一个新的列表,其中包含每个元素的平方。filter()
函数将 lambda 函数应用于 numbers
列表中的每个元素,并返回一个新的列表,其中包含所有偶数。
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
展开评论