defverify_demorgan(): """穷举验证德摩根定律""" for a, b in itertools.product([True, False], repeat=2): # 法则一:NOT(A AND B) = (NOT A) OR (NOT B) lhs1 = not (a and b) rhs1 = (not a) or (not b) assert lhs1 == rhs1, f"法则一失败: a={a}, b={b}" # 法则二:NOT(A OR B) = (NOT A) AND (NOT B) lhs2 = not (a or b) rhs2 = (not a) and (not b) assert lhs2 == rhs2, f"法则二失败: a={a}, b={b}"
for values in itertools.product([False, True], repeat=len(variables)): env = dict(zip(variables, values)) result = eval(expr_str, {"__builtins__": {}}, env) row = ' | '.join(str(int(v)) for v in values) print(f"{row} | {int(result)}")
print("=== AND ===") truth_table("A and B") print("\n=== XOR ===") truth_table("A ^ B") print("\n=== 德摩根 ===") truth_table("not (A and B)") truth_table("(not A) or (not B)")
defcheck(self, request): """检查请求是否应该被拦截""" triggered = [] for rule inself.rules: if rule.condition(request): triggered.append(rule) return triggered
# 创建 WAF 实例 waf = SimpleWAF()
# 规则1:SQL 注入检测(OR 逻辑——任一特征命中) sql_keywords = ["union", "select", "drop", "delete", "insert", "--", "/*"] waf.add_rule(WAFRule( "SQL注入", lambda req: any(kw in req.get('url', '').lower() for kw in sql_keywords) orany(kw instr(req.get('body', '')).lower() for kw in sql_keywords) ))
# 规则2:XSS 检测 xss_patterns = ["<script", "javascript:", "onerror=", "onload="] waf.add_rule(WAFRule( "XSS", lambda req: any(p in req.get('url', '').lower() for p in xss_patterns) orany(p instr(req.get('body', '')).lower() for p in xss_patterns) ))
for req in test_requests: triggered = waf.check(req) if triggered: rules_str = ', '.join(r.name for r in triggered) print(f"🚫 拦截: {req['url'][:50]} → 触发规则: {rules_str}") else: print(f"✅ 放行: {req['url'][:50]}")
for x in test_values: # 原始写法 v1 = not (x >= 5and x < 10) # 德摩根化简 v2 = x < 5or x >= 10 assert v1 == v2 print(f"x={x:2d}: not (x>=5 and x<10) = {v1}, x<5 or x>=10 = {v2}")
print("两种写法完全等价!但第二种更直观。")
simplify_range_check()
实际应用场景
安全方向
WAF 规则组合:多个检测条件用 AND/OR 组合(见上面代码)
SQL 注入检测:has_keyword AND (not is_whitelisted) AND is_user_input
ACL 权限判断:(is_owner OR is_admin) AND (NOT is_banned)
入侵检测:多个弱信号 AND 在一起形成强告警
后端方向
业务规则引擎:复杂的审批/风控规则本质上就是布尔表达式树
状态机条件:current_state == 'pending' AND event == 'approve'
数据库索引优化:WHERE a AND b vs WHERE a OR b 对索引使用的影响
配置开关:feature_enabled AND (is_beta_user OR is_internal)
大数据方向
数据过滤:Spark/Pandas 的 filter 条件就是布尔表达式
ETL 数据清洗规则:is_not_null AND is_valid_format AND in_range
A/B 测试分组:hash(user_id) % 100 < 50 AND is_new_user
常见误区
❌ 误区1:not a == b 等于 (not a) == b
✅ Python 中 not a == b 实际是 not (a == b),因为 == 优先级高于 not
✅ 要明确写括号避免歧义
❌ 误区2:if x is not None and x > 0 可以简写成 if x > 0
✅ 如果 x 可能是非数字类型(如字符串),直接比较会出错
✅ 显式检查 None 更安全
❌ 误区3:if a or b == 'yes' 检查 a 或 b 等于 yes
✅ 实际是 if a or (b == 'yes'),a 只要 truthy 就通过
✅ 正确写法:if a == 'yes' or b == 'yes'
❌ 误区4:短路求值没有副作用问题
✅ 被短路的表达式中的函数调用不会执行,如果有日志/计数等副作用会出 bug
❌ 误区5:布尔代数太理论,写代码用不上
✅ 每次你化简 if 条件、用 Guard Clause、写规则引擎,都在用布尔代数
练习题
题1:德摩根化简
用德摩根定律化简以下表达式:
not (is_active and has_permission)
not (is_error or is_timeout)
答案:
(not is_active) or (not has_permission)
(not is_error) and (not is_timeout)
题2:条件化简
把下面代码化简成无嵌套的版本:
1 2 3 4
if user: if user.age >= 18: if user.is_verified: allow()