美文网首页
《Effective Python》 读书笔记

《Effective Python》 读书笔记

作者: FlyingPig_ | 来源:发表于2019-04-06 20:47 被阅读0次

    本文档处于不断更新的状态中

    一 Pythonic Thinking

    条目1 要知道你在用哪个 Python 版本

    Python2 or Python3
    CPython or Jython or IronPython or PyPy
    确保当前使用的 Python 版本是你预期的版本
    (推荐使用 virtualenv 等工具为当前项目创造一个独立的环境)

    条目2 Follow PEP8 Style Guide ★★★

    包含空格的使用
    变量,函数,Class 等命名
    一些表达式应采用更加 Pythonic 的方式,参考 Zen of Python
    (推荐使用 VSCode 编辑器写 Python 代码,开启 lint 工具,安装一个 autopep8 的插件实现自动化应用 PEP8 规范)

    条目3 搞清楚 bytes,str,and unicode

    对于 Python3 bytes 存储 8-bit,str 存储 utf-8,二者不可直接连接(如 + )
    对于 Python2 str 储存 8-bit,unicode 储存 utf-8,str 存储 7-bit,str 和 unicode 可以直接连接
    使用 helper 函数实现不同编码的转换
    打开二进制文件时,打开模式应采用 'wb' or 'rb'

    条目4 将复杂的表达书转换成 helper function

    Python 的语法使得非常容易写出单行包含复杂逻辑的表达式,这样的代码往往可读性不佳。
    应将复杂的表达书转换成 helper function,特别是在使用逻辑判断时。
    if-else 表达式要比使用 Boolean 操作符如 or 和 and 更加易读。
    如:

    green = int(my_values.get(‘red’, [”])[0] or 0)
    

    VS

    green = my_values.get(‘green’, [”])
    if green[0]:
        green = int(green[0])
    else:
        green = 0
    

    条目5 Know How to Slice Sequence

    对于内置的 list,str,bytes,本身就支持,对于 diy 的类, 只需实现 getitem and setitem 方法。
    注意 list[a:b] 是前闭后开的模式。
    对于 slicing 的处理要考虑到种种边界和内容/长度变化情况。

    条目6 避免使用 [start : end : stride] slicing

    因为这种方式容易带来 bug,如 [::-1],对于 utf-8 也有问题(?),也容易让人迷惑。
    如果必须要使用它,写成以下的模式更好。

    b = a[::2]    # [‘a’, ‘c’, ‘e’, ‘g’]
    c = b[1:-1]  # [‘c’, ‘e’]
    

    条目7 使用 list comprehensions 而非 map 函数 和 filter

    prefer

    a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    squares = [x**2 for x in a]
    even_squares = [x**2 for x in a if x % 2 == 0]
    

    to

    squares = map(lambda x: x ** 2, a)
    alt = map(lambda x: x**2, filter(lambda x: x % 2 == 0, a))
    assert even_squares == list(alt)
    

    对于 dict 和 set 同理

    条目8 对条目7的补充,在 list comprehensions 应避免使用超过两个以上的表达式

    这里主要考虑到了代码可读性的问题。
    list comprehensions 支持多层的循环和多种判断条件。

    条目9 对条目7的补充,在 list comprehensions 中使用 gennerator expressions

    list comprehensions 在处理大量输入时会消耗极大的内存,容易因为问题。
    gennerator expressions 通过输出 iterator 的方式避免了上述的内存问题。
    gennerator expressions 可以组合到一起。
    代码片段

    a = ["1","22","333"]
    value = [len(x) for x in a]
    print(value)
    

    vs

    a = ["1","22","333"]
    val = [len(x) for x in a]
    print(val)
    
    it = (len(x) for x in a)
    print(it) 
    # print(next(it))
    # print(next(it))
    
    roots = ((x, x**2) for x in it)
    print(next(roots))
    print(next(roots))
    

    条目10 prefer enum over range

    相关文章

      网友评论

          本文标题:《Effective Python》 读书笔记

          本文链接:https://www.haomeiwen.com/subject/yjcdiqtx.html