“邪修 Python” 通常指用非常規(guī)、違反直覺,但又巧妙到令人拍案叫絕的黑魔法寫法。下面 10 個片段,每個都在 “千萬別在正式項目里用” 的前提下,展示 Python 的極限玩法??赐昴銜@呼:原來還能這么寫!
?? 警示:僅供技術(shù)獵奇、面試談資、代碼高爾夫(Code Golf)或 “邪修” 自嗨。生產(chǎn)代碼請遵守 PEP 8 與可讀性原則。
1?? 列表推導(dǎo)的“核爆”寫法
# 一行生成九九乘法表
_ = [print(f'{j}×{i}={i*j}', end='\t'*(j!=i)) for i in range(1, 10) for j in range(1, i+1)]
把
2?? or
/ and
鏈實現(xiàn)“短路”賦值
# 看似三元,實則短路
value = a and b or c # 當(dāng) b 為假時直接翻車
正確寫法:
b if a else c
,別用邪修。
3?? 字典字面量“原地爆炸”
# 字典推導(dǎo) + 條件表達式
d = {k: v for k, v in zip('abc', range(3)) if (lambda x: x**2)(v) < 4}
把
lambda
塞到if
里,閱讀體驗當(dāng)場去世。
4?? 一行合并多層嵌套列表
# 三重列表推導(dǎo) + sum
flat = sum([sum([[i*j*k for k in range(3)] for j in range(3)], []) for i in range(3)], [])
用
sum
當(dāng)flatMap
,速度感人。
5?? __import__
動態(tài)導(dǎo)入 + 鏈?zhǔn)秸{(diào)用
# 一行實現(xiàn)“打印當(dāng)前時間”
__import__('datetime').datetime.now().strftime('%Y-%m-%d %H:%M:%S')
把
import
當(dāng)函數(shù),比import datetime
更“邪”。
6?? setattr
+ lambda
批量裝彈
# 給類動態(tài)掛 100 個方法
class A: pass
[setattr(A, f'f{i}', lambda self, x=i: x**2) for i in range(100)]
運行期改類字典,IDE 永遠猜不到。
7?? 裝飾器“套娃”地獄
# 三層裝飾器,每層都用 lambda
@lambda f: (lambda g: (lambda h: lambda *a: h(g(f(*a)))))
def add(x): return x + 1
真正的“裝飾器洋蔥”。
8?? exec
+ 字符串模板生成代碼
# 動態(tài)生成并執(zhí)行函數(shù)體
code = 'def foo(x): return x * 2'
exec(code)
把 Python 當(dāng) PHP 用,安全審計直接爆炸。
9?? 元類“暗改”類行為
class Meta(type):
def __new__(cls, name, bases, ns):
ns['__repr__'] = lambda self: "I am evil"
return super().__new__(cls, name, bases, ns)
class Evil(metaclass=Meta): pass
類還沒出生就被“邪修”附體。
?? 一行實現(xiàn)“斐波那契”
# 遞歸 + 三目 + 切片
fib = lambda n: n if n < 2 else fib(n-1) + fib(n-2)
[fib(i) for i in range(10)]
復(fù)雜度 O(2?),運行即“獻祭”CPU。
邪修心法口訣
“能寫一行絕不寫兩行,能用黑魔法絕不走正道,
可讀性?那是正道修士才考慮的事!”
彩蛋:把 Python 變成“JS”
# 鏈?zhǔn)綄傩栽O(shè)置
class ChainDict(dict):
def __getattr__(self, key): return self.setdefault(key, ChainDict())
d = ChainDict(); d.a.b.c = 1
體驗一把“點語法”無限鏈?zhǔn)秸{(diào)用。