之前计划看一下 Fluent Python,一直没排出时间,最近正好有空,来断断续续的看,顺便做一些笔记。
第一章 Prologue 序言
- 介绍了collections中的namedtuple类型,其实应该是一个封装后的type,理解难度不大,看下怎么用就清楚:
import collectionsCard = collections.namedtuple('Card', ['rank', 'suit'])beer_card = Card('7', 'diamonds')
- 后面都在各种扯淡,实现了一套扑克牌的数据结构,如果他把洗牌的算法也举例实现了我会感兴趣点。。然而只写了排序:
suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0)def spades_high(card):rank_value = FrenchDeck.ranks.index(card.rank) # 这里的ranks = range(2,11) + list('JQKA')return rank_value * len(suit_values) + suit_values[card.suit]for card in sorted(deck, key=spades_high):print card
- 之后介绍了特殊函数,注意这里 __bool__ 的调用我在python2.7.10测试过,是不生效的,估计是因为作者用的是python3的原因:
- 另外这段代码里的 __repr__ 也挺有意思的
from math import hypotclass Vector(object):def __init__(self, x=0, y=0):self.x = xself.y = ydef __repr__(self):return 'Vector(%r, %r)' % (self.x, self.y)def __abs__(self):return hypot(self.x, self.y)def __bool__(self):#TODO didn't call thisreturn Falsereturn bool(abs(self))def __add__(self, other):x = self.x + other.yy = self.y + other.yreturn Vector(x, y)def __mul__(self, scalar):return Vector(self.x * scalar, self.y * scalar)v = Vector(0, 0)print abs(v*3)print bool(v)print v.__bool__()
第二章 Data structures 数据结构
- 上来介绍了一些内置的数据结构分类,我倒是觉得 ord 和 chr 应该给大家介绍(备忘)下:
>>> chr(1)'\x01'>>> chr(65)'A'
- 其次信息量比较大的filter,map,lambda结合用法:
symbols = '$亼亽\€.':69beyond_ascii = list(filter(lambda c: c>127, map(ord, symbols)))
- 再就是比较传统的二重for循环:
tshirts = [(color, size) for color in colors for size in sizes]
- 举了一个array.array的例子,装作好像很有用的样子:
import arrayarray.array('I', (ord(symbol) for symbol in symbols))
- 但是紧接而来的容器放置,提取的内容很赞:
- 注意看 print passport 的方法,和 _ 符号的使用
>>> lax_coordinates = (33.9425, -118.408056)>>> city, year, pop, chg, area = ('Tokyo', 2003, 32450, 0.66, 8014)>>> traveler_ids = [('USA', '31195855'), ('BRA', 'CE342567'),... ('ESP', 'XDA205856')]>>> for passport in sorted(traveler_ids):... print('%s/%s' % passport)...BRA/CE342567ESP/XDA205856USA/31195855>>> for country, _ in traveler_ids:... print(country)...USABRAESP
- 看起来很厉害是吧,其实是python3的语法,在容器释放的时候现在可以智能释放了:
>>> *head, b, c, d = range(5)>>> head, b, c, d([0, 1], 2, 3, 4)
目前看到 Part2 -> Tuples are not just immutable list -> Named tuple 下回有空继续填坑