之前计划看一下 Fluent Python,一直没排出时间,最近正好有空,来断断续续的看,顺便做一些笔记。
第一章 Prologue 序言
- 介绍了collections中的namedtuple类型,其实应该是一个封装后的type,理解难度不大,看下怎么用就清楚:
import collections
Card = 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 hypot
class Vector(object):
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):
#TODO didn't call this
return False
return bool(abs(self))
def __add__(self, other):
x = self.x + other.y
y = self.y + other.y
return 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 = '$亼亽\€.'
:69
beyond_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 array
array.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/CE342567
ESP/XDA205856
USA/31195855
>>> for country, _ in traveler_ids:
... print(country)
...
USA
BRA
ESP
- 看起来很厉害是吧,其实是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 下回有空继续填坑