Handy 发表了一个小记 《2025-05-09》
Magic Python -> ch4
heapq
是 Python 的一个标准模块,它提供了堆排序算法的实现。- 带
yield
的函数是一个生成器,而不是一个函数了。这个生成器有一个函数就是next
函数,next 就相当于“下一步”生成哪个数,这一次的 next 开始的地方是接着上一次的 next 停止的地方执行的。生成器中的 yield,可看做 “return” 。- 迭代器需要实现
__iter__()
和__next__()
方法,通常通过类来实现。 - 生成器通过函数实现,使用
yield
关键字暂停函数执行并返回一个值。
- 迭代器需要实现
- 使用
**
可以解包字典,使用*
可以解包列表 。 |
合并操作符常用于对 set、dict 取并集,但要 Python >= 3.9。- 字典解析式:
{k:v for d in [profile, ext_info] for k,v in d.items()}
- 列表解析式:
[x for l in (list01, list02, list03) for x in l]
- 条件语法糖:
<on_true> if <condition> else <on_false>
- Lambda 表达式(匿名函数):
lambda arguments: expression
,如lambda x: x**2
- 判断是否包含子串:
"llo" in "hello, python"
、"hello, python".find("llo") != -1
、"hello, python".__contains__("llo")
、operator.contains("hello, python", "llo")
、re.findall(sub_str, full_str)
- 海象运算符,很像 Golang 的短变量声明:
while (line := file.readline()): print(line.strip())
,在推导式中也能用,[bmi for m in members if (bmi := get_bmi(m)) > 24]
- 装饰器:本质上是一个函数,返回值也是函数。让其他函数在不需要做任何代码变动的前提下增加额外功能,常用于切面需求,如插入日志、性能测试、事务处理、缓存、权限校验等场景,从而可以抽离出大量与函数功能本身无关的雷同代码并继续重用。
- 偏函数:也叫部分应用。是指在计算机科学中,固定多元函数的部分参数,并返回一个可以接受剩余部分参数的函数的转换过程。
- 动态执行函数:使用
eval(函数名的字符串)()
来执行函数。若把所有的函数是放在类中,并定义成静态方法,那就不需要用 eval 了,接着使用getattr
去获取并调用。
## 生成器
def foo():
print("starting...")
while True:
res = yield 4
print("res:",res)
g = foo()
print(next(g))
print("*"*20)
print(g.send(7))
## result
starting...
4
********************
res: 7
4
## 装饰器
# 这是装饰器函数,参数 func 是被装饰的函数
def logger(func):
def wrapper(*args, **kw):
print('我准备开始执行:{} 函数了:'.format(func.__name__))
# 真正执行的是这行。
func(*args, **kw)
print('主人,我执行完啦。')
return wrapper
## 带参数的函数装饰器
def say_hello(country):
def wrapper(func):
def deco(*args, **kwargs):
if country == "China":
print("你好!")
elif country == "America":
print('hello.')
else:
return
# 真正执行函数的地方
func(*args, **kwargs)
return deco
return wrapper
## 偏函数
from functools import partial
power_2=partial(power, n=2)
power_2(2) # output: 4
Handy 发表了一个小记 《高情已逐晓云空 不与梨花同梦》
Handy 发表了一个小记 《AVL 树的旋转》
AVL 树所谓的旋转其实是针对 Root 来说的,双旋可分成两次单旋来看。四种情况:
- 左子树插入左儿子导致失衡:右旋
- 右子树插入右儿子导致失衡:左旋
- 左子树插入右儿子导致失衡:先左旋后右旋
- 右子树插入左儿子导致失衡:先右旋后左旋
从文字上看也是有规律的:单旋反方向,双旋同方向
Handy 发表了一个小记 《P 问题和 NP 问题》
P 和 NP 问题:想当初计算理论是真的没学太明白。
- P(Polynominal)多项式时间解决的问题。规模 n 出现在底数的位置,如 O(1),O(logn),O(n) 等
- NP(Non-deterministicPolynomial)非多项式时间解决的问题,能在多项式时间验证。规模 n 出现在顶部的位置,如 O(n!),O(2^n) 等
- NPC(Complete)问题,首先是 NP 问题,然后所有 NP 问题都可以归约到它,归约就是把一个问题转化为另一个问题,这也就是说 NPC 问题是 NP 问题中最难的
- NP-Hard 问题,首先所有 NP 问题都可以约化到它,然后它不一定是 NP 问题,也就是描述了一种类至少和 NP 中最难的问题一样难的问题,且这个问题不一定是 NP 问题
Handy 发表了一个小记 《docker 镜像代理》