python的几个常用高级函数

介绍几个较为常用的高级函数:

  • Counter:计数器
  • defaultdict:带默认值的字典
  • map、reduce、filter:针对序列操作的函数
  • groupby:类似SQL中groupby的聚合函数(但只会相邻相同元素聚合)

1、Counter 计数器

Counter(计数器):用于追踪值的出现次数,Counter类继承dict类,所以它能使用dict类里面的方法。

对iterable进行计数:

import collections
counter = collections.Counter(['a', 'b', 'c', 'a', 'b', 'a'])
print(counter)
# 结果: Counter({'a': 3, 'b': 2, 'c': 1})

使用update可以往Counter新增内容:

counter.update(['c', 'b', 'c', 'd', 'c'])
print(counter)
# 结果: Counter({'c': 4, 'a': 3, 'b': 3, 'd': 1})

可像字典一样输出key/value:

for key, value in counter.items():
    print(key, value)

很方便的输出最高频率的数据:

print(counter.most_common(3))

2、defaultdict

直接访问字典不存在的key是会报错的,所以一般需要做初始化:

if key not in d:
    d[key] = 0
    d[key] = []
d[key] += 3
d[key].append(123)
# 这样设置比较麻烦,使用defaultdict更简单

dict = defaultdict(factory_function)
factory_function可以是str、int、list、set,可以省略初始化

from collections import defaultdict
# 默认的value为int类型,直接加数字
dint = defaultdict(int)
dint["a"] += 3
dint["b"] += 4
print(dint)
# 结果:defaultdict(<class 'int'>, {'a': 3, 'b': 4})

# 默认的value为list类型,直接添加元素
dlist = defaultdict(list)
dlist["a"].append(1)
dlist["a"].extend([2,3,4])
print(dlist)
# 结果:defaultdict(<class 'list'>, {'a': [1, 2, 3, 4]})

3、map、reduce、filter函数

map(function,iterable,…)
给序列的每个元素应用一个函数,返回一个迭代器。

list1 = [1,2,3,4]
result = map(lambda x: x**2, list1)
print(list(result)
# 结果:[1, 4, 9, 16]

reduce(function,iterable)
使用function(x,y)函数,将序列缩减成1个元素结果。

from functools import reduce
res = reduce(lambda x, y: x+y,list1)
print(res)
# 结果:10,等于将每个元素相加

filter(function,iterable)
使用返回bool的function对序列过滤,返回满足条件的结果。

list2 = range(10)
result = filter(lambda x: x%2==0,list2)
print(result)
print(type(result))
print(list(result))
# 结果:
# <filter object at 0x000001B1EC1D3FD0>
# <class 'filter'>
# [0, 2, 4, 6, 8]

这里生成的是filter的类,需要用list()转换为列表。

4、groupby函数

按照指定key进行数据分组:groupby(iterable,key=None)

datas = [
    {"id": 101, "title": "标题1", "category": "Python"},
    {"id": 102, "title": "标题2", "category": "Java"},
    {"id": 103, "title": "标题3", "category": "C++"},
    {"id": 104, "title": "标题4", "category": "Python"},
    {"id": 105, "title": "标题5", "category": "Python"},
    {"id": 106, "title": "标题6", "category": "Java"}
]
from itertools import groupby
# 先将数据按目标key排序
datas = sorted(datas, key = lambda x: x["category"])
result = groupby(datas,key=lambda x: x["category"])
print(result)
print(list(result))

result = groupby(datas,key=lambda x:x["category"])
for key, values in result:
    print(key, list(values))
# 结果:
# <itertools.groupby object at 0x000001DF87348590>
# [('C++', <itertools._grouper object at 0x000001DF871A5EE0>), ('Java', <itertools._grouper object at 0x000001DF8732E610>), ('Python', <itertools._grouper object at 0x000001DF8732E460>)]
# C++ [{'id': 103, 'title': '标题3', 'category': 'C++'}]
# Java [{'id': 102, 'title': '标题2', 'category': 'Java'}, {'id': 106, 'title': '标题6', 'category': 'Java'}]
# Python [{'id': 101, 'title': '标题1', 'category': 'Python'}, {'id': 104, 'title': '标题4', 'category': 'Python'}, {'id': 105, 'title': '标题5', 'category': 'Python'}]
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python 中,可以通过以下几种方式来创建高级函数: 1. 使用lambda表达式:lambda表达式是一种简洁的方式来创建匿名函数。它通常用于需要一个简单的函数,而不想为其定义一个完整的函数。例如,你可以使用lambda表达式创建一个计算平方的函数: ```python square = lambda x: x**2 print(square(5)) # 输出:25 ``` 2. 使用装饰器:装饰器是一个特殊的函数,它可以用来修改或扩展其他函数的行为。通过使用装饰器,你可以在不修改原始函数定义的情况下,为其添加额外的功能。下面是一个简单的装饰器示例,用于在函数调用前后打印日志信息: ```python def logger(func): def wrapper(*args, **kwargs): print("Calling function:", func.__name__) result = func(*args, **kwargs) print("Function", func.__name__, "finished execution") return result return wrapper @logger def add(a, b): return a + b print(add(2, 3)) # 输出:Calling function: add 5 Function add finished execution ``` 3. 使用闭包:闭包是一个函数对象,它可以访问并修改定义在其封闭作用域内的变量。通过使用闭包,你可以在函数内部创建另一个函数,并将其返回。这个内部函数可以访问外部函数的变量,即使外部函数已经执行完毕。以下是一个闭包的示例: ```python def outer_function(x): def inner_function(y): return x + y return inner_function closure = outer_function(10) print(closure(5)) # 输出:15 ``` 这些是创建高级函数的几种常见方法,它们可以帮助你在 Python 中更灵活地处理函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔跑的小猪侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值