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.5
v = 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 asyncio
class 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.count
async 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 True
result = 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([])) # True
print(any([])) # False
# 在设计API时要特别注意
def process_data(data_list):
if not all(data_list): # 空列表会返回True!
return "数据不全"
# 处理逻辑...看完后你有什么不一样的看法?欢迎在评论区分享你的学习心得,特别是那些“原来这个内置函数还能这样用”的惊喜时刻!
阅读推荐:
Python 世界的"三层身份证":__dict__的魔法与秘密
✨关注我,获取更多Python学习资源、实战项目和行业动态!在公众号后台回复"python学习",获取Python学习电子书籍!