流畅的Python,Fluent Python,书中错误记录。

书p129页,示例5-15

def clip(text:str, max_len:'int' =8) -> str:
    '''
    :param text: 在max_len前面或后面的第一个空格处截断文本
    '''
    end = None
    if len(text) > max_len:
        space_before = text.rfind(' ', 0, max_len)  # 从右向左找,rfind,对应max_len前面的第一个空格
        if space_before >= 0:
            end = space_before
        else:
            space_after = text.find(' ', max_len) # 找max_len的后面了
            if space_after >= 0:
                end = space_after
    if end is None:   # 没有找到,很聪明定义了一个None的开关
        end = len(text)
    return text[:end].rstrip()

 if space_after >= 0: end = space_after

缩进错误。

 

p566页,示例A.2

import sys

MAX_BITS = len(format(sys.maxsize, 'b'))  # 确定位数,我是64位
print('%s-bit Python build' % (MAX_BITS + 1))


def hash_diff(o1, o2):
    h1 = '{:0>{}b}'.format(hash(o1), MAX_BITS)  # 取出哈希值,用2进制格式化输出,右对齐,空位用0填充
    # print(h1)
    h2 = '{:>0{}b}'.format(hash(o2), MAX_BITS)
    # print(h2)
    diff = ''.join('|' if b1 != b2 else ' ' for b1, b2 in zip(h1, h2))  # 通过zip压缩循环取值,对比是否相等
    # print(diff)   相等留空,不想等划线
    count = '|={}'.format(diff.count('|'))  # 统计不想等的个数
    width = max(len(repr(o1)), len((repr(o2))), 8)  # 确定起头的宽度
    # print(width)
    sep = '-' * (width * 2 + MAX_BITS)  # 最后的过度线,
    # print(sep)
    return '{!r:{width}}=>{}\n  {}{:{width}} {} \n{!r:{width}}=>{}\n{}'.format(
        o1, h1, ' ' * (width), diff, count, o2, h2, sep, width=width)
    # 这个格式化最骚,首先标题订宽度用width,接着输入原始数字o1,=>输出哈希值,第二行输出|竖线,后面输出不同的数量
    # 第三排逻辑跟第一排一样,最后换行输出------线,这个太骚的格式化输出了


if __name__ == '__main__':
    print(hash_diff(1,True))
    print(hash_diff(1, 1.01))
    print(hash_diff(1.0, 1))
    print(hash_diff('a', 'A'))
    print(hash_diff('a1', 'a2'))
    print(hash_diff('sidian', 'sidian'))

 return '{!r:{width}}=>{}\n {}{:{width}} {} \n{!r:{width}}=>{}\n{}'.format( o1, h1, ' ' * (width), diff, count, o2, h2, sep, width=width)

return的格式化输出中多了一个{}

 

书P196-197页,示例8-17,代码在shell运行不正确:

import weakref                                                                           

In [214]: a_set = {0, 1}                                                                           

In [215]: wref = weakref.ref(a_set)                                                                

In [216]: wref                                                                                     
Out[216]: <weakref at 0x107c0a290; to 'set' at 0x107f4c410>

In [217]: wref()                                                                                   
Out[217]: {0, 1}

In [218]: a_set = {2, 3, 4}                                                                        

In [219]: wref()                                                                                   
Out[219]: {0, 1}

In [220]: wref() is None                                                                           
Out[220]: False

In [221]: wref() is None                                                                           
Out[221]: False

 原因是执行了wref(),对象{0, 1}上面的变量标签迅速上涨,但在Py文件可以运行。

为什么具体上涨,水平有限,无法解释。

该链接有具体实例:https://www.cnblogs.com/sidianok/p/12094479.html

 

p566页,示例A.3

memtest.py中的代码:

else:
    print('Usage: {} < vector - module - to - test>'.format('XXX.py'))
    sys.exit(1)

 书中format内容为空,报错。

posted @ 2019-12-18 17:38  就是想学习  阅读(405)  评论(0编辑  收藏  举报