大师兄的Python学习笔记(十二): 常用高级函数
2020-02-16 本文已影响0人
superkmi
大师兄的Python学习笔记(十一): 时间模块time,datetime和calendar
大师兄的Python学习笔记(十三): 理解装饰器
一、lambda匿名函数
- 用于实现某些简单的函数功能。
- 格式是:
lambda [arg1 [,arg2,.....argn]]:expression
,lambda
和:
之间的部分为参数,:
后的部分为表达式内容。 - lambda函数没有return语句,直接返回函数的运行结果。
- 好处一:不用担心函数名冲突。
- 好处二:可以直接赋值给变量,再利用变量来调用函数。
>>># 普通函数实现
>>>def sum(x,y):
>>> return x+y
>>>print(sum(2,3))
5
>>># 匿名函数实现
>>>sum = lambda x,y:x+y
>>>print(sum(2,3))
5
二、zip(<iterable1>,<iterable2>...)函数
- 将多个可迭代对象一一对应生成元祖,并将元祖组成列表。
- 如果迭代对象长度不同,则以最短的元素长度为准。
>>>l1 = ['武汉','北京','广州','上海']
>>>l2 = [54406,375,2194,326]
>>>l3 = [2420,3,8] #这里的list长度为3,所以zip后的数据以最短的列表为准
>>>z = zip(l1,l2,l3)
>>>print([x for x in z])
[('武汉', 54406, 2420), ('北京', 375, 3), ('广州', 2194, 8)]
三、map(<function>,<iterable>)函数
- 用于映射序列。
- 以<function>为参数,为<iterable>中的每个元素做映射,并形成一个新的列表。
>>>def square(d):
>>> return d**2
>>>l = [i for i in range(10)]
>>>m = map(square,l)
>>>print([x for x in m])
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
- 通过匿名函数实现。
l = [i for i in range(10)]
m = map(lambda d:d**2,l)
print([x for x in m])
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
四、filter(<function>,<iterable>)函数
- 用于过滤序列
- 以<function>作为参数,对<iterable>中的每个元素做判断,并将返回的元素组成新的列表。
>>>def is_odd(d):
>>> if d%2==1:
>>> return d
>>>l = [i for i in range(10)]
>>>f = filter(is_odd,l)
>>>print([x for x in f])
[1, 3, 5, 7, 9]
- 通过匿名函数实现。
>>>l = [i for i in range(10)]
>>>m = filter(lambda d: d % 2 == 1 and d or None,l) # 三项判断式
>>>print([x for x in m])
[1, 3, 5, 7, 9]
五、reduce(<function>,<iterable>,<initializer=0>)函数
- reduce()函数在python3中被移出了标准库,需要从functools库中引用。
- 用于对序列中的元素进行累计。
- 以<function>作为参数, 将<iterable>的元素两两操作,并返回结果。
>>>from functools import reduce
>>>def sum(x,y):
>>> return x+y
>>>l = [i for i in range(100)]
>>>s = reduce(sum,l)
>>>print(s)
4950
- 通过匿名函数实现。
>>>from functools import reduce
>>>l = [i for i in range(100)]
>>>s = reduce(lambda x,y:x+y,l)
>>>print(s)
4950
六、enumerate(<iterator>,<start=0>)函数
- 将<iterator>中的每个元素增加一个序号,并返回一个新的元祖列表。
- <start>表示序号从几开始排起,默认为0。
>>>cities = ['北京','上海','天津','重庆']
>>>cities_with_serial = enumerate(city,101)
>>>print([x for x in cities_with_serial])
[(101, '北京'), (102, '上海'), (103, '天津'), (104, '重庆')]
七、collections模块
- collections是Python的内建模块,包含了许多有用的集合类。
1. namedtuple(<name>,<value1>,<value2>,...)
- 用来定义一个可命名的集合(tuple)数据类型。
- <name>是数据类型的名称,相当于tuple类型的标注。
- namedtuple的元素数量是在定义数据类型时固定的。
>>>from collections import namedtuple
>>># 定义数据类型
>>>Point = namedtuple('Point',['x','y']) # 坐标
>>># 实例化
>>>beijing_point = Point(100,200)
>>>shanghai_point = Point(200,300)
>>>print('北京的坐标是{}'.format(beijing_point))
>>>print('上海的坐标是{}'.format(shanghai_point))
>>>print('北京的x坐标是{}'.format(beijing_point.x))
京的坐标是Point(x=100, y=200)
上海的坐标是Point(x=200, y=300)
北京的x坐标是100
2. deque(<iterable>)
- 一种插入、删除更高效的列表(list)数据类型。
- 除了list的基本功能外,还支持
appendleft()
和popleft()
指令,用于从队列头部插入和删除元素。
>>>from collections import deque
>>># 实例化数据类型
>>>cities = ['北京','上海','天津','重庆']
>>>cities_dq = deque(cities)
>>>print(cities_dq)
deque(['北京', '上海', '天津', '重庆'])
>>># 列表操作
>>>selected = cities_dq.popleft() # 返回并删除左边第一个元素‘北京’
>>>cities_dq.appendleft('武汉') # 从左边添加一个元素'武汉'
>>>print(selected)
北京
>>>print(cities_dq)
deque(['武汉', '上海', '天津', '重庆'])
3. defaultdict(<default>)
- 一种强化的字典(dict)数据类型,当key值不存在时,返回默认值。
- <default>为默认值函数。
- 其它与dict数据类型相同。
>>>from collections import defaultdict
>>># 设置默认值
>>>cities_count = defaultdict(lambda:'数据统计中')
>>># 数据操作
>>>cities_count['北京'] = 325
>>>print(cities_count['北京'])
325
>>>print(cities_count['上海'])
数据统计中
4. OrderedDict
- 一种强化的字典(dict)数据类型,可以保持key的顺序。
- 顺序是key插入的顺序。
>>># 普通dict
>>>cities = dict()
>>>cities['北京'] = 375
>>>cities['上海'] = 326
>>>cities['武汉'] = 54406
>>>cities['广州'] = 2194
>>>print(cities) # dict是没有顺序的
{ '上海': 326, '武汉': 54406, '北京': 375,'广州': 2194}
>>># OrderedDict
>>>from collections import OrderedDict
>>>cities_od = OrderedDict()
>>>cities_od['北京'] = 375
>>>cities_od['上海'] = 326
>>>cities_od['武汉'] = 54406
>>>cities_od['广州'] = 2194
>>>print(cities_od)
OrderedDict([('北京', 375), ('上海', 326), ('武汉', 54406), ('广州', 2194)])
5. Counter
- 一个计数器,用于统计可迭代对象中元素出现的次数。
>>>import collections,random
>>># 生成一个list包含若干元素
>>>l = list()
>>>for i in range(100):
>>> l.append(random.choice(['猫','狗','兔子','熊']))
>>># 计算每种元素的个数
>>>counter = collections.Counter()
>>>for i in l:
>>> counter[i]+=1
>>>print(counter)
>Counter({'狗': 37, '猫': 26, '兔子': 20, '熊': 17})
参考资料
- https://blog.csdn.net/u010138758/article/details/80152151 J-Ombudsman
- https://www.cnblogs.com/zhuluqing/p/8832205.html moisiet
- https://www.runoob.com 菜鸟教程
- http://www.tulingxueyuan.com/ 北京图灵学院
- http://www.imooc.com/article/19184?block_id=tuijian_wz#child_5_1 两点水
- https://blog.csdn.net/weixin_44213550/article/details/91346411 python老菜鸟
- https://realpython.com/python-string-formatting/ Dan Bader
- https://www.liaoxuefeng.com/ 廖雪峰
- https://blog.csdn.net/Gnewocean/article/details/85319590 新海说
- https://www.cnblogs.com/Nicholas0707/p/9021672.html Nicholas
- 《Python学习手册》Mark Lutz
- 《Python编程 从入门到实践》Eric Matthes
本文作者:大师兄(superkmi)