分享|Python 冷知识进阶版:那些让你惊呼"还能这样?"的技巧
匿名用户
203
2025.07.21
2025.07.21
发布于 广东

下面这些Python技巧可能会让你重新认识这门语言,有些甚至看起来像是"作弊":

1. 字典键值互换的极致写法

d = {'a': 1, 'b': 2}
# 常规写法
reverse_d = {v: k for k, v in d.items()}

# 冷知识写法
reverse_d = dict(zip(d.values(), d.keys()))

2. 列表展平的魔法方法

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))

3. 函数参数的"黑洞"技巧

def func(a, b, *_, **__):
    print(a, b)
    
func(1, 2, 3, 4, 5, x=6, y=7)  # 只输出1 2
# *_ 吞噬所有多余位置参数
# **__ 吞噬所有多余关键字参数

4. 用迭代器实现懒加载的无限列表

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' 又回到开头

5. 使用字典实现switch-case结构

def case1():
    return "这是情况1"

def case2():
    return "这是情况2"

switch = {
    1: case1,
    2: case2
}

result = switch.get(1, lambda: "默认情况")()
print(result)  # 输出"这是情况1"

6. 利用布尔值做数学运算

# 统计列表中大于5的元素个数
nums = [1, 6, 3, 8, 5, 9]
count = sum(x > 5 for x in nums)  # 因为True=1, False=0
print(count)  # 3

7. 一行代码实现快速排序

qsort = 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]

8. 使用slice对象实现多维切片

# 创建一个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]      # 冷知识写法

9. 利用装饰器缓存函数结果

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

10. 使用__import__动态导入

# 根据字符串动态导入模块
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.0

11. 利用生成器实现协程

def coroutine():
    while True:
        received = yield
        print(f"收到: {received}")

c = coroutine()
next(c)  # 启动协程
c.send("第一条消息")  # 收到: 第一条消息
c.send("第二条消息")  # 收到: 第二条消息

12. 使用exec动态执行代码

# 动态创建函数
func_code = """
def dynamic_func(x):
    return x * 2
"""
namespace = {}
exec(func_code, namespace)
dynamic_func = namespace['dynamic_func']
print(dynamic_func(5))  # 10

13. 利用闭包实现私有变量

def 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变量对外完全不可见

14. 使用else子句处理循环完成情况

for i in range(5):
    if i == 10:
        break
else:
    print("循环完整执行完毕,没有遇到break")

15. 利用property实现属性计算

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的灵活性和强大表现力,但在实际项目中应谨慎使用,确保代码的可读性和可维护性。你最惊讶的是哪个技巧?

评论 (0)