abs():不仅仅是取绝对值你以为的abs():
# 不就是取绝对值嘛result = abs(-10) # 10实际上的abs():自定义对象的__abs__用法比较少用
# 自定义对象的绝对值class Vector: def __init__(self, x, y): self.x = x self.y = y def __abs__(self): """计算向量的模(长度)""" return (self.x**2 + self.y**2) ** 0.5v = Vector(3, 4)print(f"向量长度: {abs(v)}") # 5.0使用场景:
__abs__()方法,自定义绝对值逻辑小技巧:通过实现__abs__(),你可以让任何自定义对象支持绝对值运算。
all():完美的"全员通过"基本用法:
# 检查列表中所有元素都为真checks = [True, True, True, True]if all(checks): print("所有检查都通过了!")# 实际应用:表单验证form_data = { "username": "john_doe", "email": "john@example.com", "password": "secure123"}# 检查所有字段都已填写fields_filled = all([ form_data["username"], form_data["email"], form_data["password"]])print(f"表单完整: {fields_filled}") # True工作原理解析:
all()函数内部实现类似这样:
def all(iterable): for element in iterable: if not element: # 只要有一个为假 return False return True # 全部为真使用时机:
any():只要一个"对的"就好基本用法:
# 检查列表中是否有任意元素为真options = [False, False, True, False]if any(options): print("至少有一个选项是真的!")# 实际应用:权限检查user_permissions = ["read", "write", "delete"]required_permissions = ["admin", "write"]# 用户只要拥有任意一个所需权限即可has_access = any( perm in user_permissions for perm in required_permissions)print(f"有访问权限: {has_access}") # True实用技巧:
all()和any()经常配合使用,但注意它们的逻辑是相反的:
all([])返回True(空可迭代对象)any([])返回False(空可迭代对象)aiter()和anext():异步迭代的利器同步 vs 异步:
# 同步版本for item in [1, 2, 3]: # iter()隐式调用 print(item)# 异步版本(Python 3.10+)import asyncioclass AsyncCounter: def __init__(self, limit): self.limit = limit self.count = 0 def __aiter__(self): return self async def __anext__(self): if self.count >= self.limit: raise StopAsyncIteration self.count += 1 await asyncio.sleep(0.1) # 模拟异步操作 return self.countasync def main(): async for number in aiter(AsyncCounter(3)): print(f"异步获取: {number}")# 运行异步程序asyncio.run(main())使用场景:
重要区别:
iter()有两个参数版本(可迭代对象 + 哨兵值)aiter()只有一个参数版本,更简洁ascii():安全的字符表示问题场景:
当你需要将包含特殊字符的字符串安全地表示时:
# 普通repr()的问题text = "你好,世界!"print(repr(text)) # '你好,世界!'# ascii()的安全表示print(ascii(text)) # '\u4f60\u597d\uff0c\u4e16\u754c\uff01'实际应用:
# 1. 日志记录data = { "name": "张三", "message": "特殊字符: © ¥ €"}# 安全记录,避免编码问题safe_log = ascii(data)print(f"安全日志: {safe_log}")# 2. 数据序列化前的清理user_input = "用户输入可能有各种字符🚀"safe_input = ascii(user_input)[1:-1] # 去掉两边的引号print(f"安全字符串: {safe_input}")为什么有用:
短路求值:
all()和any()都支持短路求值,一旦结果确定就立即返回:
# all()遇到第一个False就返回def check_all(): print("检查1") yield False print("检查2") # 这行不会执行 yield Trueresult = all(check_all()) # 只打印"检查1"# any()遇到第一个True就返回def find_any(): print("查找1") yield False print("查找2") yield True print("查找3") # 这行不会执行result = any(find_any()) # 打印"查找1"和"查找2"误区1:过度使用all()/any()
# 不推荐if all([x > 0 for x in numbers]): ...# 推荐:使用生成器表达式避免创建额外列表if all(x > 0 for x in numbers): ...误区2:忽视空可迭代对象
# 空列表的行为print(all([])) # Trueprint(any([])) # False# 在设计API时要特别注意def process_data(data_list): if not all(data_list): # 空列表会返回True! return "数据不全" # 处理逻辑...看完后你有什么不一样的看法?欢迎在评论区分享你的学习心得,特别是那些“原来这个内置函数还能这样用”的惊喜时刻!
阅读推荐:
Python 世界的"三层身份证":__dict__的魔法与秘密
✨关注我,获取更多Python学习资源、实战项目和行业动态!在公众号后台回复"python学习",获取Python学习电子书籍!