python 小技巧

本文基于Python 3.6,介绍了上下文管理器,需重写__enter__和__exit__方法。还提到__slots__可限制类动态绑定的属性,仅对当前类有效。此外,给出Python性能优化建议,如多用dict、set,减少循环计算,利用Lazy if-evaluation等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

比较杂,想到什么写什么

基于python3.6

上下文管理器

class PypixContextManagerDemo:

    def __enter__(self):
        print("Entering the block")

    def __exit__(self, *unused):
        print("Exiting the block")


with PypixContextManagerDemo():
    print("In the block")

自己实现很很简单,主要重写__enter__ 和 __exit__两个方法,定义好进去的时候干啥,退出的时候干啥就行

__slots__

限制class动态绑定的属性,如__slots__=('name', 'age'),则这个class只能动态绑定name和age这两属性,其他属性都不能绑定,试图绑定的话,会报 AttributeError 的一个错误。

但有一点要注意,这个属性仅对当前的类有点,对继承的子类是无效的,除非在子类中也定义了__slots__,这样子类允许的属性就是自身的__slots__和父类的__slots__

python性能优化的几个地方

套用网上的结果,在算法的时间复杂度排序上依次是:
O(1) -> O(lg n) -> O(n lg n) -> O(n^2) -> O(n^3) -> O(n^k) -> O(k^n) -> O(n!)
  1. 在需要多数据成员进行频繁的查找或者访问的时候,请使用 dict 而不是 list,可以直接使用dict.fromkeys(list,True)把list转换成dict
  2. set的union,intersection,difference操作要比list的迭代要快。因此如果涉及到求list交集,并集或者差的问题可以转换为set来操作。
  3. 循环方面,原则是尽量减少循环过程中的计算量,有多重循环的尽量将内层的计算提到上一层
  4. 充分利用 Lazy if-evaluation 的特性,如果存在条件表达式 if x and y,在 x 为 false 的情况下 y 表达式的值将不再计算。因此可以利用该特性在一定程度上提高程序效率。
  5. 字符串连接的使用尽量使用 join() 而不是 +
  6. 当对字符串可以使用正则表达式或者内置函数来处理的时候,选择内置函数。如 str.isalpha(),str.isdigit(),str.startswith(('x', 'yz')),str.endswith(('x', 'yz'))
  7. 对字符进行格式化请使用%或者format,不要使用+,这样既能增加代码可读性也能增加执行效率
  8. 使用递推式构造列表(list comprehension)或递推式构造生成器(Generator Comprehension)来代替使用常规的for循环
  9. 待后续补充...

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值