整理某理工大学的 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 异常,例如:

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,谢谢!

如果有问题,欢迎评论见区。

Comments

Post a Comment