duang ! Duang!PandaZhangs的python小笔记


正是吾日三省吾身:

实现了__getitem__方法的类可以看作是一个可以迭代的对象
上面是No.1
实现__iter__方法的对象可以是看做是一个迭代の对象。

当当得当,问题来了这两者差别在哪里?

getitem这个dunder实现了可以实现对象的迭代,同时可以通过下标来访问对象元素

iter优先级会比getitem更高,同时实现的时候使用for循环迭代的时候是通过next方法来调用实例对象的。

  1. No.2 自定义对象の陷阱:

我们习惯性使用 if object:的方式来判断是否为空值对象,但是自定义对象custom object
永远只会返回true 因为自定义对象没有实现__bool__方法,解释器一律默认为真

No.3 推导式迷宫:

card = [(rank,suit) for rank in ranks for suit in suits ] 我们可能会认为这样能够得到zip(ranks,suits)的同等结果,但是显然不会,这就是一个嵌套的双层循环,这会首先执行rank上的检索,然后对suit开始做遍历。

No.4 字典遍历困惑:

我们可能按照习惯
做出左边这种操作,直接对字典的遍历就是取字典的键值

No.5 列表拼接和复制

小问题: list a + list b 的方式会拼接两个列表,但是如果这两个列表是一个列表的无交集切片,

更加简便的方式是对原始列表做简单的del 删除掉部分切片元素

比较深的陷阱:

对列表中元素的复制是浅拷贝,如果使用list *n的形式就要考虑是否列表对象存在嵌套对象
对这种可变嵌套元素的修改是python的隐藏陷阱。