大数跨境
0
0

极简Python:30个内置函数技巧让代码简洁而优雅

极简Python:30个内置函数技巧让代码简洁而优雅 Python数智工坊
2025-12-05
0
导读:极简Python:30个内置函数技巧让代码简洁而优雅内置函数(Built-in Functions)无需导入


内置函数(Built-in Functions)无需导入任何模块即可直接使用,它们是Python语言设计哲学的集中体现。

许多开发者在日常编码中往往只使用其中最常见的几个函数,而忽略了这些函数背后隐藏的强大功能和巧妙用法。本文将深入探讨30个鲜为人知但极具实用价值的内置函数使用技巧,帮助你写出更加Pythonic、高效且优雅的代码。


一、数据处理与转换类

1. zip() 实现矩阵转置

matrix = [[123], [456]]
transposed = list(zip(*matrix))
# 结果:[(1, 4), (2, 5), (3, 6)]

使用解包操作符*配合zip(),一行代码即可完成矩阵转置,这在数据分析中极为常用。

2. enumerate() 获取满足条件的索引

text = "hello world"
vowel_positions = [i for i, c in enumerate(text) if c in 'aeiou']
# 结果:[1, 4, 7]

在需要同时获取元素位置和值时,enumerate()比手动维护索引变量更优雅。

3. map() 处理多个可迭代对象

nums1 = [123]
nums2 = [456]
products = list(map(lambda x, y: x * y, nums1, nums2))
# 结果:[4, 10, 18]

map()不仅能处理单个序列,还能同时处理多个序列,自动配对元素进行操作。

4. filter() 配合None过滤假值

data = [01'''hello'None, [], [12], False]
truthy = list(filter(None, data))
# 结果:[1, 'hello', [1, 2]]

当filter()的第一个参数为None时,会自动过滤掉所有假值(False、0、''、None、[]等)。

5. sorted() 的key参数实现多级排序

students = [
    {'name''Alice''grade'85'age'20},
    {'name''Bob''grade'85'age'19}
]
sorted_students = sorted(students, key=lambda s: (-s['grade'], s['age']))

通过在key函数中返回元组,可以实现多级排序:先按成绩降序,成绩相同按年龄升序。


二、类型检查与转换类

6. isinstance() 检查多种类型

def process(data):
    if isinstance(data, (list, tuple, set)):
        return len(data)
    return None

isinstance()的第二个参数可以是元组,用于同时检查多种类型,避免多个or条件。

7. all() 验证数据完整性

user = {'name''Alice''email''a@b.com''age'25}
required = ['name''email''age']
is_valid = all(field in user for field in required)

all()配合生成器表达式,简洁地验证所有条件是否满足。

8. any() 检查存在性

keywords = ['python''java''go']
text = "I love python programming"
has_keyword = any(kw in text.lower() for kw in keywords)

any()在需要判断"至少满足一个条件"时特别有用。

9. int() 的进制转换

binary = int('1010'2)    # 二进制转十进制: 10
hex_num = int('FF'16)    # 十六进制转十进制: 255
octal = int('77'8)       # 八进制转十进制: 63

int()的第二个参数指定进制,可以轻松实现各种进制转换。

10. bool() 的真值测试

def is_empty(obj):
    return not bool(obj)

is_empty([])      # True
is_empty('')      # True
is_empty({})      # True
is_empty(0)       # True

利用bool()可以统一判断各种类型的"空"状态。


三、序列操作类

11. reversed() 反向迭代不创建副本

# 不推荐:创建新列表
nums = [12345]
for n in nums[::-1]:
    print(n)

# 推荐:使用reversed()节省内存
for n in reversed(nums):
    print(n)

reversed()返回迭代器而非列表,在处理大数据时更高效。

12. slice() 创建可复用的切片对象

data = list(range(20))
first_five = slice(05)
last_five = slice(-5None)

print(data[first_five])   # [0, 1, 2, 3, 4]
print(data[last_five])    # [15, 16, 17, 18, 19]

将切片逻辑封装成对象,代码更清晰且便于复用。

13. iter() 的哨兵模式

# 读取文件直到遇到空行
with open('file.txt'as f:
    for line in iter(f.readline, '\n'):
        print(line.strip())

iter()的双参数形式会不断调用第一个参数,直到返回值等于第二个参数(哨兵值)。

14. next() 设置默认值避免异常

iterator = iter([123])
print(next(iterator, 'No more'))  # 1
print(next(iterator, 'No more'))  # 2
print(next(iterator, 'No more'))  # 3
print(next(iterator, 'No more'))  # 'No more'

为next()提供默认值,避免StopIteration异常。

15. sum() 的start参数妙用

# 连接列表
lists = [[12], [34], [56]]
flattened = sum(lists, [])
# 结果:[1, 2, 3, 4, 5, 6]

# 计算总和并加初始值
nums = [12345]
total = sum(nums, 100)  # 115

sum()的第二个参数不仅可以设置初始值,还能用于列表拼接(但要注意性能)。


四、对象与属性操作类

16. getattr() 动态访问属性

class Config:
    debug = True
    timeout = 30

config = Config()
attr_name = 'debug'
value = getattr(config, attr_name, False)

getattr()支持动态属性名,并可设置默认值防止AttributeError。

17. setattr() 批量设置属性

class User:
    pass

user = User()
attrs = {'name''Alice''age'25'email''a@b.com'}
for key, value in attrs.items():
    setattr(user, key, value)

在需要根据配置或数据动态创建对象时特别有用。

18. hasattr() 安全检查属性

obj = {'key''value'}

# 不推荐
try:
    value = obj.attribute
except AttributeError:
    value = None

# 推荐
if hasattr(obj, 'attribute'):
    value = obj.attribute

hasattr()避免了异常处理,代码更简洁。

19. dir() 动态探索对象

class MyClass:
    def public_method(self): pass
    def _private_method(self): pass

obj = MyClass()
public_methods = [m for m in dir(obj) if not m.startswith('_')]

dir()结合过滤可以动态获取对象的公开接口。

20. vars() 获取对象的__dict__

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

p = Person('Alice'25)
print(vars(p))  # {'name': 'Alice', 'age': 25}

vars()是访问对象__dict__属性的快捷方式,在序列化时很有用。


五、数值计算类

21. divmod() 同时获取商和余数

total_seconds = 12345
minutes, seconds = divmod(total_seconds, 60)
hours, minutes = divmod(minutes, 60)
print(f"{hours}小时{minutes}{seconds}秒")
# 3小时25分45秒

divmod()一次调用返回商和余数,在时间转换等场景中非常实用。

22. pow() 的三参数模式

# 计算 (2^10) % 1000
result = pow(2101000)  # 24
# 等价于但更高效:(2 ** 10) % 1000

三参数pow()在大数幂运算取模时性能远超先算幂再取模,常用于密码学。

23. round() 的银行家舍入

print(round(2.5))   # 2 (偶数)
print(round(3.5))   # 4 (偶数)
print(round(2.6752))  # 2.67

Python3的round()使用"四舍六入五取偶"规则,在金融计算中减少累积误差。

24. abs() 处理复数

complex_num = 3 + 4j
magnitude = abs(complex_num)  # 5.0

abs()不仅能处理实数,还能计算复数的模(magnitude)。

25. min()/max() 的key参数

words = ['apple''pie''a''banana']
shortest = min(words, key=len)  # 'a'
longest = max(words, key=len)   # 'banana'

# 找出最接近目标值的数
nums = [10253045]
target = 28
closest = min(nums, key=lambda x: abs(x - target))  # 30

通过key参数自定义比较规则,实现复杂的最值查找。


六、进制与编码类

26. bin(), oct(), hex() 快速转换进制

num = 255
print(bin(num))  # '0b11111111'
print(oct(num))  # '0o377'
print(hex(num))  # '0xff'

# 去除前缀
print(hex(num)[2:])  # 'ff'

这三个函数快速将整数转换为对应进制的字符串表示。

27. ord() 和 chr() 字符编码转换

# 字符转Unicode码点
print(ord('A'))    # 65
print(ord('中'))   # 20013

# Unicode码点转字符
print(chr(65))     # 'A'
print(chr(20013))  # '中'

# 实现简单加密
encrypted = ''.join(chr(ord(c) + 3for c in 'hello')

在字符串处理和简单加密中经常使用。

28. bytes() 和 bytearray() 处理二进制数据

# 创建不可变字节序列
b = bytes([656667])
print(b.decode())  # 'ABC'

# 创建可变字节序列
ba = bytearray(b'hello')
ba[0] = 72  # 修改第一个字节
print(ba)   # bytearray(b'Hello')

在网络编程和文件I/O中处理二进制数据时必不可少。


七、高级应用类

29. eval() 的安全使用

# 危险:不要对不可信输入使用eval()
# user_input = "__import__('os').system('rm -rf /')"
# eval(user_input)  # 危险!

# 相对安全:限制命名空间
safe_dict = {'x'10'y'20}
result = eval('x + y', {"__builtins__": {}}, safe_dict)
print(result)  # 30

如果必须使用eval(),务必限制其命名空间以防止代码注入攻击。

30. format() 高级格式化

# 数字格式化
print(format(1234567','))           # '1,234,567'
print(format(0.123456'.2%'))        # '12.35%'
print(format(42'08b'))              # '00101010'

# 对齐和填充
print(format('test''>10'))          # '      test'
print(format('test''*^10'))         # '***test***'

# 日期时间格式化
from datetime import datetime
now = datetime.now()
print(format(now, '%Y-%m-%d %H:%M:%S'))

format()提供了比%和f-string更灵活的格式化控制。


结语

Python的内置函数是语言设计者精心打磨的工具集,它们简洁、高效且功能强大。掌握这些函数的高级用法,不仅能让你的代码更加Pythonic,还能显著提升开发效率和程序性能。

需要注意的是,虽然这些技巧很强大,但在实际应用中应该遵循"Simple is better than complex"的原则。代码的可读性和可维护性永远比炫技更重要。只有在确实能带来明显好处时,才使用这些高级技巧。

最后,建议大家在日常开发中多查阅Python官方文档,深入理解每个内置函数的设计意图和适用场景。随着经验的积累,你会发现这些看似简单的函数蕴含着深刻的编程智慧。


【声明】内容源于网络
0
0
Python数智工坊
从上海回归二线城市深耕多年,央企算法工程师。专注数据分析、机器学习、运筹优化、可视化、AI实战! 公众号回复 :数据分析,免费领取 价值满满的 20G 数据科学与AI学习资料包!用数据思维,优化你的技术人生。
内容 605
粉丝 0
Python数智工坊 从上海回归二线城市深耕多年,央企算法工程师。专注数据分析、机器学习、运筹优化、可视化、AI实战! 公众号回复 :数据分析,免费领取 价值满满的 20G 数据科学与AI学习资料包!用数据思维,优化你的技术人生。
总阅读57
粉丝0
内容605