今日复习内容:竞赛常用标准库:heapq,functool,itertools
一.heapq
- 堆:完全二叉树,每个节点小于等于子节点(默认为最小堆)
- 每个节点k都有两个子节点 2k+1,2k+2
- 如图:
从这个图中可以看出,每个节点的数字大小关系,这个是一定要注意的。
- 使用 list 表示一个堆
- 1.将无序 list 转换成最小堆:heapq.heapify(a)
- 2.最小堆a中添加元素x:heapq.heappush(a,x)
- 3.弹出并返回最小元素:heapq.heappop(a)
- 4.弹出并返回最小元素,同时添加元素x:heapq.heapreplace(a,x)
import heapq
a = [6,2,3,5,4,1]
heapq.heapify(a)
print('list = ',a)
del_item = heapq.heappop(a)
print('弹出元素:',del_item)
print('list1 = ',a)
运行结果:
运行结果:
二.functool
- functool 模块应用于高阶函数,即参数或(和)返回值为其他函数的函数
- 此处只介绍偏函数:partial
- partial:“冻结”某些函数的参数或者关键字参数,然后返回一个函数
functools.partial (func,*args,**keywords)
- func:需要被扩展的函数,返回的函数其实是一个类似func的函数
- *args:需要被固定的位置参数
- **keywords:需要被固定的关键字参数
from functools import partial
def Add(a,b,c):
print('a = ',a)
print('b = ',b)
print('c = ',c)
print('a + b + c = ',a + b + c)
Add(1,2,3)
add_fix_c = partial(Add,c = 10)
add_fix_c(1,2)
add_fix_c = partial(Add,5)
add_fix_c(2,3)
运行结果:
这里有一个隐藏的知识点:位置参数必须在关键字参数前面 。
from functools import partial
def add(*args,**kwargs):
#打印位置参数
for n in args:
print(n)
#打印关键字参数
for k,v in kwargs.items():
print('%s:%s'% (k,v))
#普通调用:
add(1,2,3,v1 = 10,v2 = 20)
print('-'*10)
# partial
add_partial = partial(add,10,k1 = 10,k2 = 20)
add_partial(1,2,3,k3 = 20)
运行结果:
三.itertools
-
创建迭代器的模块
(1) 有限迭代器
(2)无限迭代器
(3)排列组合迭代器
-
itertool----无限迭代器
(1) 生成长度为无限的迭代器
(2)count(start = 0,step = 1):创建一个迭代器,它从start值开始,返回均匀 间隔的值。
(3)cycle(iterable):创建一个迭代器,循环遍历iterable中所有元素。
(4)repeat(object[,times]):创建一个迭代器,如果没有指定times则无限循环遍历object,否则指定times。
from itertools import count,cycle,repeat
for x in count(0,1):
print(x)
if x > 10:
break
运行结果:
from itertools import count,cycle,repeat
for x in cycle([1,2,3]):
print(x)
运行结果:
(结果是死循环)
from itertools import count,cycle,repeat
for x in repeat(5):
print(x)
运行结果:
(没有规定次数,结果是死循环)
-
itertool---有限迭代器
1.accumulate(iterable[,func]):创建一个迭代器,返回累积汇总值或其他双目运算函数的累积结果值;
from itertools import accumulate
a = [1,2,3,4]
print(a)
b = accumulate(a)
print(b)
for x in b:
print(x)
运行结果:
accumulate的另一种用法,找出前几项(累积) 的最大值或最小值
from itertools import accumulate
a = [3,1,2,4]
print(a)
b = list(accumulate(a,min))
print(b)
c = list(accumulate(a,max))
print(c)
运行结果:
还有累乘的用法:
from itertools import accumulate
import operator
a = [3,1,2,4]
print(a)
b = list(accumulate(a,operator.mul))
print(b)
运行结果:
2.chain(*iterables) :合并多个迭代器
from itertools import chain
for x in chain('ABC','DEF'):
print(x,end=' ')
运行结果:
3.product(*iterables,repeat = 1) :可迭代对象的笛卡尔积
- iterables:表示多个可迭代对象
- repeat:表示这些可迭代序列重复的次数
普通版本:
ans = []
for i in [1,2,3]:
for j in [4,5,6]:
ans.append([i,j])
print(ans)
product版本:
from itertools import product
ans = list(product([1,2,3],[4,5,6]))
print(ans)
运行结果都一样,如下:
加上重复次数:
from itertools import product
ans = list(product([1,2,3],repeat = 2))
print(ans)
运行结果:
4.permutations(iterable,r = None) :由iterable元素生成长度为r的排列,如果r未指定或为None,r默认设置为iterable的长度
from itertools import permutations
a = list(permutations([1,2,3,4],r = 2))
for i in a:
print(i)
运行结果:
5.combinations(iterable,r) :返回由输入iterable元素中元素组成长度为r的子序列
from itertools import combinations
a = list(combinations([1,2,3,4],r = 2))
for i in a:
print(i)
运行结果:
OK,这次写到这里,不出意外的话,下一篇文章全是题,期末考考完继续!