蓝桥杯python语言基础(5)——函数
目录
一、作业:四个函数
二、math
三、collections
1. Counter
2. deque
3. defaultdict
4. OrderedDict
四、heapq
五、functool
partial偏函数
六、itertools
1.无限迭代器
2.有限迭代器
3.排列组合迭代器
一、作业:四个函数
计算最大公约数、最小公倍数、判断是否为质数以及根据三边长度求三角形面积的函数
import math def gcd(a, b): while b: a, b = b, a % b return a def lcm(a, b): return a * b // gcd(a, b) def is_prime(n): if n <= 1: return False for divisor in range(2, int(n ** 0.5) + 1): if n % divisor == 0: return False return True def triangle_area(a, b, c): if a + b <= c or a + c <= b or b + c <= a: return 0 s = (a + b + c) / 2 area = math.sqrt(s * (s - a) * (s - b) * (s - c)) return area
二、math
常用数学函数
三角函数
math.sin(x)
:返回x
(弧度)的正弦值。
math.cos(x)
:返回x
(弧度)的余弦值。
math.tan(x)
:返回x
(弧度)的正切值。
math.asin(x)
:返回x
的反正弦值(结果为弧度)。
math.acos(x)
:返回x
的反余弦值(结果为弧度)。
math.atan(x)
:返回x
的反正切值(结果为弧度)。指数和对数函数
math.exp(x)
:返回e
的x
次方,其中e
是自然常数。
math.log(x)
:返回x
的自然对数(以e
为底)。
math.log10(x)
:返回x
的常用对数(以10为底)。
math.pow(x, y)
:返回x
的y
次方。
math.sqrt(x)
:返回x
的平方根。数值处理函数
math.ceil(x)
:返回大于或等于x
的最小整数。
math.floor(x)
:返回小于或等于x
的最大整数。
math.trunc(x)
:返回x
的整数部分,直接舍去小数部分。
math.fabs(x)
:返回x
的绝对值。
math.modf(x)
:返回一个包含x
的小数部分和整数部分的元组数学常量
math.pi
:圆周率π,约为3.141592653589793。
math.e
:自然常数e,约为2.718281828459045。
三、collections
1.
Counter
Counter
是一个用于计数可迭代对象中元素出现次数的类。它返回一个字典,其中键是元素,值是元素出现的次数。
from collections import Counter
# 统计列表中元素出现的次数
lst = [1, 2, 2, 3, 3, 3]
counter = Counter(lst)
print(counter) # Counter({3: 3, 2: 2, 1: 1})
# 统计字符串中字符出现的次数
string = "ababcc"
char_counter = Counter(string)
print(char_counter) # Counter({'a': 2, 'b': 2, 'c': 2})
# 获取出现次数最多的元素
most_common = counter.most_common(1)
print(most_common) # [(3, 3)]
2.
deque
deque
(发音为 “deck”,是 “double-ended queue” 的缩写)是一个双端队列,支持在队列两端进行高效的添加和删除操作。
from collections import deque
# 创建一个deque
dq = deque([1, 2, 3])
# 在右端添加元素
dq.append(4)
print(dq) # deque([1, 2, 3, 4])
# 在左端添加元素
dq.appendleft(0)
print(dq) # deque([0, 1, 2, 3, 4])
# 从右端删除元素
dq.pop()
print(dq) # deque([0, 1, 2, 3])
# 从左端删除元素
dq.popleft()
print(dq) # deque([1, 2, 3])
3.
defaultdict
defaultdict
是一个字典的子类,它在访问不存在的键时会自动创建一个默认值。默认值的类型由用户指定。
from collections import defaultdict
# 创建一个默认值为整数0的defaultdict
dd = defaultdict(int)
dd['a'] += 1
print(dd['a']) # 1
print(dd['b']) # 0,自动创建默认值
# 创建一个默认值为列表的defaultdict
dd_list = defaultdict(list)
dd_list['key'].append(1)
print(dd_list['key']) # [1]
4.
OrderedDict
OrderedDict
是一个字典的子类,它会记住元素插入的顺序。在Python 3.7+ 中,普通字典已经默认保持插入顺序,但OrderedDict
提供了一些额外的方法来处理有序性。
popitem(last=True)
从
OrderedDict
中移除并返回一个 (键, 值) 对。如果
last=True
(默认值),则移除并返回字典中的最后一个元素;如果last=False
,则移除并返回第一个元素。
from collections import OrderedDict
od = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3
# 移除并返回最后一个元素
item1 = od.popitem()
print(item1) # ('c', 3)
print(od) # OrderedDict([('a', 1), ('b', 2)])
# 移除并返回第一个元素
item2 = od.popitem(last=False)
print(item2) # ('a', 1)
print(od) # OrderedDict([('b', 2)])
四、heapq
用于堆数据结构操作。堆是一种特殊的完全二叉树,分为最小堆和最大堆。在最小堆中,每个节点的值都小于或等于其子节点的值;最大堆则相反。heapq
模块默认实现的是最小堆。
1. 基本操作
heapify(list)
将一个列表转换为堆结构。这个操作是在原列表上进行的,时间复杂度为 O(n)。
heappush(heap, item)
将元素
item
插入到堆heap
中。插入操作的时间复杂度为 O(logn),其中 n 是堆的大小。heappop(heap)
弹出堆
heap
中的最小元素(堆顶元素),并返回该元素。弹出操作后,堆会自动调整以保持堆的性质,时间复杂度也是 O(logn)。
heappushpop(heap, item)
将元素
item
插入堆heap
中,然后弹出并返回堆中的最小元素。这个操作比先调用heappush()
再调用heappop()
更高效,因为它在内部进行了优化,时间复杂度为 O(logn)。heapreplace(heap, item)
先弹出堆
heap
中的最小元素,然后将新元素item
插入堆中。返回值是被弹出的元素。这个操作的时间复杂度也是 O(logn)。
2. 应用场景
-
优先队列:
heapq
可以用来实现优先队列,其中元素按照优先级进行排序,优先级高的元素先出队。 -
图算法:在 Dijkstra 算法等图算法中,使用堆来存储节点的距离,以快速获取距离最小的节点。
-
数据处理:在处理大量数据时,使用
nsmallest
或nlargest
方法可以快速获取最大或最小的k
个元素。
五、functool
partial偏函数
创建一个新的可调用对象,这个新对象是基于一个现有的函数,并为其部分参数预先赋值。这样在调用新函数时,就不需要再次提供这些已经预先赋值的参数。
partial
函数的完整语法是:functools.partial(func, *args, **keywords)
。其中:
func
是要创建偏函数的原始函数。
*args
是为原始函数预先提供的位置参数。
**keywords
是为原始函数预先提供的关键字参数。
from functools import partial
def multiply(a, b, c):
return a * b * c
# 创建偏函数,固定第一个参数为 2,第三个参数为 5
multiply_partial = partial(multiply, 2, c=5)
result = multiply_partial(b=3)
print(result)
调用 multiply_partial(b = 3)
,实际上调用的是 multiply(2, 3, 5)
,结果为 30
六、itertools
用于处理迭代器的模块,它提供了各种生成迭代器的函数,这些迭代器可以用来生成不同类型的序列组合,在数据处理、算法设计等方面非常有用。
1.无限迭代器
count(start=0, step=1)
从
start
开始,以step
为步长生成无限整数序列。
cycle(iterable)
无限循环迭代
iterable
中的元素。
repeat(object[, times])
重复生成
object
,如果指定times
,则重复times
次,否则无限重复。
2.有限迭代器
accumulate(iterable[, func])
对
iterable
中的元素进行累积计算。如果不提供func
,默认进行累加。
chain(*iterables)
将多个可迭代对象连接成一个连续的迭代器。
3.排列组合迭代器
product(*iterables, repeat=1)
计算输入可迭代对象的笛卡尔积,类似于嵌套循环。
repeat
参数指定重复次数。
permutations(iterable, r=None)
生成
iterable
中元素的全排列,如果指定r
,则生成长度为r
的排列。
combinations(iterable, r)
生成
iterable
中元素的组合,组合是无序的。