下面这些Python技巧可能会让你重新认识这门语言,有些甚至看起来像是"作弊":
d = {'a': 1, 'b': 2}
# 常规写法
reverse_d = {v: k for k, v in d.items()}
# 冷知识写法
reverse_d = dict(zip(d.values(), d.keys()))nested = [[1, 2], [3, 4], [5, 6]]
# 常规写法
flat = []
for sublist in nested:
flat.extend(sublist)
# 冷知识写法
flat = sum(nested, [])
# 或者
from itertools import chain
flat = list(chain(*nested))def func(a, b, *_, **__):
print(a, b)
func(1, 2, 3, 4, 5, x=6, y=7) # 只输出1 2
# *_ 吞噬所有多余位置参数
# **__ 吞噬所有多余关键字参数import itertools
# 无限计数器
counter = itertools.count()
print(next(counter)) # 0
print(next(counter)) # 1
# 可以无限next下去...
# 无限循环列表
cycle = itertools.cycle(['a', 'b', 'c'])
print(next(cycle)) # 'a'
print(next(cycle)) # 'b'
print(next(cycle)) # 'c'
print(next(cycle)) # 'a' 又回到开头def case1():
return "这是情况1"
def case2():
return "这是情况2"
switch = {
1: case1,
2: case2
}
result = switch.get(1, lambda: "默认情况")()
print(result) # 输出"这是情况1"# 统计列表中大于5的元素个数
nums = [1, 6, 3, 8, 5, 9]
count = sum(x > 5 for x in nums) # 因为True=1, False=0
print(count) # 3qsort = lambda L: L if len(L) <= 1 else qsort([x for x in L[1:] if x < L[0]]) + [L[0]] + qsort([x for x in L[1:] if x >= L[0]])
print(qsort([3,1,4,1,5,9,2])) # [1, 1, 2, 3, 4, 5, 9]# 创建一个3x3矩阵
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 获取第二列
col_2 = [row[1] for row in matrix] # 常规写法
col_2 = list(zip(*matrix))[1] # 冷知识写法from functools import lru_cache
@lru_cache(maxsize=None)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
# 第一次计算会实际执行
print(fibonacci(50)) # 12586269025
# 第二次直接从缓存读取
print(fibonacci(50)) # 立即返回12586269025# 根据字符串动态导入模块
module_name = "math"
math = __import__(module_name)
print(math.sqrt(4)) # 2.0
# 动态导入函数
function_name = "sqrt"
func = getattr(math, function_name)
print(func(9)) # 3.0def coroutine():
while True:
received = yield
print(f"收到: {received}")
c = coroutine()
next(c) # 启动协程
c.send("第一条消息") # 收到: 第一条消息
c.send("第二条消息") # 收到: 第二条消息# 动态创建函数
func_code = """
def dynamic_func(x):
return x * 2
"""
namespace = {}
exec(func_code, namespace)
dynamic_func = namespace['dynamic_func']
print(dynamic_func(5)) # 10def counter():
count = 0
def inner():
nonlocal count
count += 1
return count
return inner
c = counter()
print(c()) # 1
print(c()) # 2
print(c()) # 3
# count变量对外完全不可见for i in range(5):
if i == 10:
break
else:
print("循环完整执行完毕,没有遇到break")class Circle:
def __init__(self, radius):
self.radius = radius
@property
def area(self):
return 3.14 * self.radius ** 2
c = Circle(5)
print(c.area) # 78.5
# area看起来像属性,实际上是计算得到的这些技巧展示了Python的灵活性和强大表现力,但在实际项目中应谨慎使用,确保代码的可读性和可维护性。你最惊讶的是哪个技巧?