函数装饰器

作用

装饰器本质上是一个函数,它可以让其他函数在不需要做任何变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象。

应用场景

记录日志、性能测试、权限校验等。

通俗理解就是,在不改变源代码的基础上给源函数增加新的代码。

无参数示例

源函数

def source():
    print("我是原函数")

装饰器

def decorator(func):    # 定义装饰器函数名字,传参为一个函数名
    def f():            # 定义一个嵌套函数,用于给原函数新增功能
        print("开始执行原函数")     # 新增功能
        func()                    # 执行传参进来的原函数
        print("原函数结束了")      # 新增功能
    return f                      # 返回结果

源函数使用装饰器

result = decorator(source)
result()

以上的方法是根据嵌套函数的方法来使用的,Python 提供了语法糖(@)来优化装饰器代码。

# 定义装饰器
def decorator(func):
    def f():
        print("开始执行原函数")
        func()
        print("原函数结束了")
    return f

# 使用语法糖@引用装饰器,装饰器引用必须不隔行定义功能函数
@decorator
def source():
    print("我是原函数")
source()

带参数示例

我学到的就是因为语法糖的存在而方便的在使用装饰器的情况下,原函数携带参数

def decorator(func):
    def f(msg):    # 用于原函数传参
        print("开始执行原函数")
        func(msg)  # 原函数传参
        print("原函数结束了")
    return f

@decorator
def source(msg):   # 原函数需要的参数
    print(msg)

source("FeiYi")

内建函数

字面意思,Python 自带函数

内建函数 描述
map() 根据提供的函数处理序列中的元素,处理完后返回一个迭代器对象
filter() 用于过滤序列,过滤掉不符合条件的元素,处理完后返回一个迭代器对象
sorted() 对所有可迭代对象进行排序操作
reversed() 返回一个反向的可迭代对象
min() 返回可迭代对象中最小的元素
max() 返回可迭代对象中最大的元素
sum() 对可迭代对象求和
zip() 对多个可迭代对象创建一个聚合,返回一个元组的迭代器
locals() 字典格式返回当前范围的局部变量
globals() 字典格式返回当前范围的全局变量

高阶函数

能接收一个或者多个函数作为输入

输出一个函数

map()

根据提供的函数处理序列中的元素,处理完后返回一个迭代器对象。可以用于对序列中的每个元素进行相同的操作,从而简化代码。

使用方法:map(函数, 可迭代对象)

# 列表内都乘以2,传统方法
num = range(1,11)

for i in num:
    print(i * 2)

# 高阶函数
num = range(1,11)
def a(n):
    return n * 2
result = map(a, num)
print(result)
# 输出结果为
<map object at 0x000002A6ADCEE208>   # 是一个map对象,需要转换
# 可视化迭代器对象
print(list(result))
# 输出结果为
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

匿名函数特殊示例

num = range(1,11)
result = list(map(lambda n: n * 2, num))
print(result)

lambda n: n * 2:lambda用来创建一个匿名函数(没有名字的函数),n是它的参数,这个函数执行的内容是n*2,即这个函数返回的结果。以下就是lambda具象化后的样子,但是实际不能这么写

def (n):
    return n * 2

map(lambda n: n * 2, num):map传参里面以冒号为分割,冒号之前lambda n是定义匿名函数,冒号之后n * 2是函数执行内容,逗号后面num是传参。这也符合map(函数, 传参)的使用方法。

filter()

用于过滤序列,过滤不符合条件的元素,处理完后返回一个迭代器对象。使用方法和map()一样。

例:将列表中的奇数过滤出来

# 匿名函数示例
num = range(1, 11)
result = list(filter(lambda n :n % 2 != 0, num))
print(result)
# 非匿名函数示例
num = range(1, 11)
def a(n):
    if n % 2 != 0:
        return n
result = list(filter(a, num))
print(result)

sorted()

对所有可迭代对象进行排序操作

num = [1, 7, 2, 6, 4, 10]
alphabet = ['abc', 'cba', 'acd']
print(sorted(num))
print(sorted(alphabet))

# 字典排序
dict = {'a': 12, 'cd': 86, 'ih': 78}
# 后面使用匿名函数只对字典中的key或者value排序
result = sorted(dict.items(), key=lambda x:x[0])
print(result)

reversed()

返回一个反向(将本身的顺序反向)的可迭代对象

num = [1, 7, 2, 6, 4, 10]
print(list(reversed(num)))

min()、max()、sum()

num = [1, 7, 2, 6, 4, 10]

print(min(num))
print(max(num))
print(sum(num))

zip()

对多个可迭代对象创建一个聚合,返回一个元组的迭代器,其实就是合并多个列表成为字典,传参前者为key,后者为value

num = [1, 7, 2, 6, 4, 10]
alphabet = ['abc', 'cba', 'acd']

print(list(zip(num, alphabet)))
# 使用场景
for x,y in zip(num, alphabet):
    print(f"num列表值:{x},字母列表值:{y}")

变量范围函数

locals():字典格式返回当前范围的局部变量

globals():字典格式返回当前范围的全局变量

a = 1
def b():
    c = 2
    print("局部变量 %s" % locals())
b()
print("全局变量 %s" % globals())

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0