特别方法,列表推导与生成器

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://zhuyulab.blog.csdn.net/article/details/86746393

《流畅的python》读书笔记 Day 1:

特别方法:

让自己的类实现python中内置的特别方法,就可以让你的自定义类对象也能被python的特别方法调用。这里体现了python的一致性。
如自定义类中实现以下特别方法:

  1. len(), 可以使用len()
  2. add(), 可以使用 +
  3. 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)

列表推导

例子:

  1. 代替for 循环
    codes = [ord(symbol) for symbol in symbols]
  2. 加上判断语句
    beyond_ascii = [ord(s) for s in symbols if ord(s) > 127]
  3. 双重循环
    tshirts = [(color, size) for color in colors for size in sizes]
    为了避免错误, 列表的作用应该只能有一个:生成新的列表。

生成器

与列表推导的最大区别在于:生成器不会直接生成整个列表,而是可以根据需要逐个地产出元素。

例子:

  1. 用生成器生成元组tuple
    tuple(ord(symbol) for symbol in symbols)
    当生成器ord(symbol) for symbol in symbols为唯一参数时,不需要再加一对圆括号。
  2. 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 

还有与其相关的*操作符:

  1. *拆包作为函数参数
>>> t = (20, 8)
>>> divmod(*t)
(2, 4)
  1. 用*处理剩下的元素(不重要的)
>>> a, b, *rest = range(5)
>>> a, b, rest
(0, 1, [2, 3, 4])

还包括了著名的*args.

展开阅读全文

没有更多推荐了,返回首页