Fluent Python

之前计划看一下 Fluent Python,一直没排出时间,最近正好有空,来断断续续的看,顺便做一些笔记。

第一章 Prologue 序言
  • 介绍了collections中的namedtuple类型,其实应该是一个封装后的type,理解难度不大,看下怎么用就清楚:
  1. import collections
  2. Card = collections.namedtuple('Card', ['rank', 'suit'])
  3. beer_card = Card('7', 'diamonds')
  • 后面都在各种扯淡,实现了一套扑克牌的数据结构,如果他把洗牌的算法也举例实现了我会感兴趣点。。然而只写了排序:

  1. suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0)
  2. def spades_high(card):
  3. rank_value = FrenchDeck.ranks.index(card.rank) # 这里的ranks = range(2,11) + list('JQKA')
  4. return rank_value * len(suit_values) + suit_values[card.suit]
  5. for card in sorted(deck, key=spades_high):
  6. print card
  • 之后介绍了特殊函数,注意这里 __bool__ 的调用我在python2.7.10测试过,是不生效的,估计是因为作者用的是python3的原因:
  • 另外这段代码里的 __repr__ 也挺有意思的
  1. from math import hypot
  2. class Vector(object):
  3. def __init__(self, x=0, y=0):
  4. self.x = x
  5. self.y = y
  6. def __repr__(self):
  7. return 'Vector(%r, %r)' % (self.x, self.y)
  8. def __abs__(self):
  9. return hypot(self.x, self.y)
  10. def __bool__(self):
  11. #TODO didn't call this
  12. return False
  13. return bool(abs(self))
  14. def __add__(self, other):
  15. x = self.x + other.y
  16. y = self.y + other.y
  17. return Vector(x, y)
  18. def __mul__(self, scalar):
  19. return Vector(self.x * scalar, self.y * scalar)
  20. v = Vector(0, 0)
  21. print abs(v*3)
  22. print bool(v)
  23. print v.__bool__()
第二章 Data structures 数据结构
  • 上来介绍了一些内置的数据结构分类,我倒是觉得 ordchr 应该给大家介绍(备忘)下:
  1. >>> chr(1)
  2. '\x01'
  3. >>> chr(65)
  4. 'A'
  • 其次信息量比较大的filter,map,lambda结合用法:
  1. symbols = '$亼亽\€.'
  2. :69
  3. beyond_ascii = list(filter(lambda c: c>127, map(ord, symbols)))
  • 再就是比较传统的二重for循环:
  1. tshirts = [(color, size) for color in colors for size in sizes]
  • 举了一个array.array的例子,装作好像很有用的样子:
  1. import array
  2. array.array('I', (ord(symbol) for symbol in symbols))
  • 但是紧接而来的容器放置,提取的内容很赞:
  • 注意看 print passport 的方法,和 _ 符号的使用
  1. >>> lax_coordinates = (33.9425, -118.408056)
  2. >>> city, year, pop, chg, area = ('Tokyo', 2003, 32450, 0.66, 8014)
  3. >>> traveler_ids = [('USA', '31195855'), ('BRA', 'CE342567'),
  4. ... ('ESP', 'XDA205856')]
  5. >>> for passport in sorted(traveler_ids):
  6. ... print('%s/%s' % passport)
  7. ...
  8. BRA/CE342567
  9. ESP/XDA205856
  10. USA/31195855
  11. >>> for country, _ in traveler_ids:
  12. ... print(country)
  13. ...
  14. USA
  15. BRA
  16. ESP
  • 看起来很厉害是吧,其实是python3的语法,在容器释放的时候现在可以智能释放了:
  1. >>> *head, b, c, d = range(5)
  2. >>> head, b, c, d
  3. ([0, 1], 2, 3, 4)

目前看到 Part2 -> Tuples are not just immutable list -> Named tuple 下回有空继续填坑

此条目发表在Python分类目录,贴了, 标签。将固定链接加入收藏夹。

发表评论

邮箱地址不会被公开。 必填项已用*标注