风火编程--弱引用weakref, __slots__属性, reprlib.repr缩略显式, slice处理切片, __setattr__()动态属性, chain()合并多各序列

《流畅的python》读书笔记(五)

8.2 is和==
is比较的是的标识,由于is不支持重载,因此会直接比较, ==比较的是值,

只有绝对不可变的元组才可以作为字典的键或集合的元素.

8.4 不能使用可变数据类型作为参数.

8.5 del 只是删除名称,而不是善处对象, 对象的引用计数会减1

8.6 弱引用weakref
不增加引用计数的引用. 常用于缓存

import weakref
a = {1,2}
wref = weakref.ref(a)
print(wref())
a = {1,1}
print(wref())

weakref.WeakValueDictionary
值是对象的弱引用, 当对象消失时, 对应的键值对会自动删除, 常用于缓存.

弱引用的对象不能是原生的list和dict,可以是他们的子类或set

8.7 拷贝
序列使用[:]进行拷贝, 非序列使用.copy()进行拷贝. 对于可变数据类型是深拷贝, 对于不可变类型是浅拷贝.

9.7 私有属性和受保护的属性
python会对前置双_的方法和属性进行名字重整,在前面拼接类名, 因此不能通过原名字访问到.

前置单_的属性不会被特殊处理, 但是约定俗成不会在类的外部访问, 成为受保护的属性/方法.

9.8 __slots__属性
slots__属性只能作为类属性定义, 不能继承.
slots = (“属性名1”, “属性名2”)
使用元组存储实力是维护性,而不再使用字典.从而大大节约空间(若干数量级), 但是初始化后,不能赋值或新增实例属性.
实现了__slots__属性得到类不再支持弱引用, 除非在__slots__中加入__weakref

10.2 缩略显式
显式指定长度的内容,中间用…省略
import reprlib
s = “0123456789”*4
s1 = reprlib.repr(s)
print(s)
print(s1)

10.3 协议和鸭子
序列需要实现__len__和__getitem__
切片的数据会交给slice进行处理

cut = slice(start, stop, stride).indices(len)
#  返回非负不越界的索引和步长的三元组
cut = slice(-10, 100, 2).indices(10)
print(cut)

10.5 动态存取属性
在实例和父类中查找不到的属性,会调用__getattr__()方法, 对动态赋值进行限制需要重写__setattr__()方法.

10.6
规约函数sum, any, all, reduce把有限元素的可迭代对象编程一个聚合结果.

eq()的实现
def eq(self, other):
return self == other

判断相同数据类型的序列相等
len(seq1) == len(seq2) and all([i1 == i2] for i1, i2 in zip(seq1, seq2))

组包zip(seq1, seq2, …,fillvalue=False)函数, 返回生成器, 并行迭代.

itertools封装了一系列返回生成器的方法
chain(seq1, seq2)合并多个序列,返回生成器对象

from itertools import chain
s1 = "111"
s2 = "222"
s = chain(s1, s2)
print(s)
print(list(s))

10.9 协议
模拟内置类型实现类的时候只需要实现用到的部分协议即可

处理多维列表运算的时候,应该转成ndarray

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值