《流畅的python》读书笔记 Day 1:
特别方法:
让自己的类实现python中内置的特别方法,就可以让你的自定义类对象也能被python的特别方法调用。这里体现了python的一致性。 如自定义类中实现以下特别方法:
- len(), 可以使用len()
- add(), 可以使用 +
- repr(), 可以使用print()
就是重载的意思,但是因此使得python中所有的类保持着一致的能被内置特殊方法调用的性质。 示例:实现vector类, 复写特别方法
class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __repr__(self):
return 'Vector(%r, %r)' % (self.x, self.y)
def __abs__(self):
return hypot(self.x, self.y)
def __bool__(self):
return bool(abs(self))
def __add__(self, other):
x = self.x + other.x
y = self.y + other.y
return Vector(x, y)
def __mul__(self, scalar):
return Vector(self.x * scalar, self.y * scalar)
列表推导
例子:
- 代替for 循环
codes = [ord(symbol) for symbol in symbols]
- 加上判断语句
beyond_ascii = [ord(s) for s in symbols if ord(s) > 127]
- 双重循环
tshirts = [(color, size) for color in colors for size in sizes]
为了避免错误, 列表的作用应该只能有一个:生成新的列表。
与列表推导的最大区别在于:生成器不会直接生成整个列表,而是可以根据需要逐个地产出元素。
例子:
- 用生成器生成元组tuple
tuple(ord(symbol) for symbol in symbols)
当生成器ord(symbol) for symbol in symbols
为唯一参数时,不需要再加一对圆括号。 - for循环中使用生成器
for tshirt in ('%s %s' % (c, s) for c in colors for s in sizes):
print(tshirt)
生成器表达式逐个产出元素,从来不会一次性产出一个含有 6 个 T 恤样式的列表。
今日感想:第一天,但感觉这本书真的很好,希望可以坚持下来。
次日补充: 元组拆包自己写python的时候就感受到了元组拆包 平行赋值的便捷。 如:
lax_coordinates = (33.9425, -118.408056)
latitude, longitude = lax_coordinates
还有与其相关的*操作符:
- *拆包作为函数参数
>>> t = (20, 8)
>>> divmod(*t)
(2, 4)
- 用*处理剩下的元素(不重要的)
>>> a, b, *rest = range(5)
>>> a, b, rest
(0, 1, [2, 3, 4])
还包括了著名的*args.