整理某理工大学的 Python 总结
Python Object
- 如果就只是比较两个变量是否相同的时候,就用 == 就足够了,但是有些很特殊的时候,需要用到比较内存地址,当需要比较两个内存地址是否相同的时候就可以用 is。
- 比较内存是否相同可以用 is 或者 is not ,所以说和 == 很相似。
- 值得注意的是当调用 == 时,就会调用默认的构造方法 a.__eq__(b) 。
- 不仅如此我们经常会用 is 来比较 None 。
- 创建对象的时候会调用 __new__() 来创建新的 object ,但是还会调用 __init__() 来初始化它,这个时候只需要重写 __init__() 方法就可以初始化对象的属性。
这里需要注意的是,如果你把一个 Class 加入 Set 集合,这个时候必须要重写 __eq__ 和 __hash__ 对象,是因为 Python 优化机制的问题,当 hash 值一样的时候,Python 默认就不会新建一个对象,以便节省内存空间。当然这个时候也不希望出现新建同一个物体的时 __hash__ 都不一样、新建不同物体时,__hash__ 值都一样的情况,除非你知道你在做什么。
如果只写 __hash__ 就会有很多 bug 出现,所以官方希望你写 __hash__ 之前写上 __eq__。
a = Product('Apple ][', 1977) #新建一个类,让a指向这个类的地址 b = a #b指向与上面这个类的地址 c = Product('Canon EOS 5D', 2005) #新建一个类,c指向与这个类的地址 a = c #a = c 也就是说a和c所指的都是新建第二个类的地址 a.name = 'Canon EOS1D X' #当修改a的属性,也就是修改a所指向的地址的属性 b.year = 1980 c.year = 2011
你会发现其实 python 里面很多都是跟地址有关系的。
另外,你还可以重写很多内部函数,比如:
- __str__ :重写此函数 python 会在调用 print() 之前判断是否有返回值,如果有优先调用。
- __repo__ : 默认情况下,__repr__() 会返回和调用者有关的 “类名+object at+内存地址”信息。当然,我们还可以通过在类中重写这个方法,从而实现当输出实例化对象时,输出我们想要的信息。
- 内置的 str() 函数的工作方式类似于 repr() 函数,只是它调用的是对象的函数 __str__() 的特殊方法。这应该会返回一个更漂亮的字符串供人们阅读。
- 还可以重写一些很不常用的内部函数,比如:__abs__、__bool__、__add__、__sub__、__mul__ 等等。
Lists and Iterators
- 列表可以相乘,相乘的意思是重复多少个这样的列表。
- first, *mid, sec_last, last = [1,2,3,4,5,6] 这样 mid 就会有[2, 3, 4]。
我们还可以当作传参数的方式去使用,比如:
>>> ls = [2, 20, 3] >>> list(range(*ls)) #相当于传入参数range(2,20,3) [2, 5, 8, 11, 14, 17]
迭代器是一个通过特殊方法一次返回一个项的过程,你需要重写 __next__() 和 __iter__() 函数来达到目标,当没有结果返回的时候就会触发 StopIteration 异常,例如:
生成器,为了简化迭代器而生,当函数碰到 yield 时,就会停下来返回一个项再继续。同样的,当生成器完成的时候,它会自动触发 StopIteration 异常,例如:
class MyIter: def __init__(self, n): self.n, self.i = n, 0 def __next__(self): if self.i >= self.n: raise StopIteration x, self.i = self.i, self.i+1 return x def __iter__(self): return self >>> list(MyIter(10)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
生成器,为了简化迭代器而生,当函数碰到 yield 时,就会停下来返回一个项再继续。同样的,当生成器完成的时候,它会自动触发 StopIteration 异常,例如:
def MyGen(n): i = 0 while i < n: yield i i += 1 >>> list(MyGen(10)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In conclusion
我整理了某理工大学的第三、第四、第五章的内容,这些都是我个人总结,如需转载请附上连接,且声明作者为Mane,谢谢!
如果有问题,欢迎评论见区。
大佬天下第一
ReplyDelete一脸懵逼???
Delete