zoukankan      html  css  js  c++  java
  • 《Effective Python》笔记——第1章 用Pythonic方式来思考

    一. 遵循PEP8风格指南。

    PEP8是对python代码格式而编订的风格指南。地址:https://www.python.org/dev/peps/pep-0008/

    个人觉得不一定完全按照PEP8写python代码,但有些规范的格式建议还是应该遵守,方便后期维护代码。

    1. 空白(whitespace)
    • 每个缩进层级使用4个空格,不要使用tab制表符;
    • 每行最多79个字符;
    • 文件中的函数与类之间应该用两个空行隔开;
    • 在同一个类中,各方法之间应该用一个空行隔开。
    • 在使用下标来获取列表元素、调用函数或给关键字参数赋值的时候,不要在两旁添加空格;
    • 为变量赋值的时候,赋值符号的左侧和右侧应该各加一个空格。
    1. 命名
    • 类名与异常采用驼峰法,如CamelCase;
    • 函数名、变量及属性用小写字母加下划线,如foo_test;
    • 定义私有属性或方法用下划线开头,如_private;
    • 模块级别的常量,应该全部采用大写字母来拼写,单词之间下划线,如ALL_CAPS;
    1. 表达式和语句
    • import语句放在文件开头
    • 每行import语句只导入一个模块,按照标准库、第三方库、本地库的导入顺序;
    • 不要通过if len(list) == 0 来判断list是否为空,而应采用if not list这种写法,空值将返回False;
    • 判断list是否为非空,使用if list,返回True;
    • 不要写单行的if、for、while及except语句,应分多行以示清晰;
    1. 其他
    • 采用ASCII或UTF-8编码文件;
    • 逗号之前没有额外空格;
    • 小括号、中括号、大括号之间没有额外空格;

    二、了解bytes、str与unicode的区别

    Python3有两种表示字符序列的类型:bytes和str。
    bytes包含二进制数据(原始的8位值);
    str包含Unicode字符。

    想要把Unicode字符转换成二进制数据,必须使用encode方法;
    把二进制数据转换成Unicode字符,则必须使用decode方法。

    def to_str(bytes_or_str):
        # 输入str和bytes,返回str
        if isinstance(bytes_or_str, bytes):
            value = bytes_or_str.decode('utf-8')
        else:
            value = bytes_or_str
        return value
    
    def to_bytes(bytes_or_str):
        # 输入str和bytes,返回bytes
        if isinstance(bytes_or_str, str):
            value = bytes_or_str.encode('utf-8')
        else:
            value = bytes_or_str
        return value

    编写Python程序的时候,一定要把编码和解码操作放在界面最外围来做。程序的核心部分应该使用Unicode字符类型(Python3的str、Python2的Unicolde)。

    注意:python3通过open打开文件的时候,默认是str格式。写入二进制格式,需要'wb'方式打开文件,不能用'w'。

    三、用辅助函数来取代复杂的表达式

    pass

    四、切片

    对list、str、bytes进行切割

    list[start:end]

    list[start:end:stride]

    stride为步值,stride为-1时可以反转字节串,不能反转已经编码成UTF-8的Unicode

    切割还可以使用内置itertools模块的islide方法。

    五、用列表推导来取代map和filter

    #filter()   用函数对元素进行筛选,filter(函数,可迭代的对象)
    #map() 对每个元素进行函数处理,map(函数,可迭代的对象)
    # 列表推导
    li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    squares = [x**2 for x in li]
    print(squares)
    
    # 结果
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    
    
    # map()
    squares = list(map(lambda x: x ** 2, li))
    # 计算可以被2整除的数的平方
    even_squares = [x**2 for x in li if x % 2 == 0]
    
    # map和filter
    alt = map(lambda x: x**2, filter(lambda x: x % 2 == 0, li))
    even_squares = list(alt)

    字典与元组也有类似的推导机制。

    六、用生成器表达式来改写数据量较大的列表推导

    列表推导如果输入数据太多,可能大量消耗内存。为了解决这个问题python提供了生成器表达式,

    把列表推导的[]改为()即返回一个迭代器。

    li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    # squares = [x**2 for x in li]    
    squares = (x**2 for x in li)
    
    print(squares)
    while True:
        print(next(squares))

    七、尽量用enumerate取代range

    内置函数enumerate可以把各种迭代器包装为生成器,输出两个值,前者表示下标,后者是迭代器中获取的元素

    f_list = ['a', 'b', 'c']
    for i, f in enumerate(f_list, 1):
        #表示下标从1开始,默认从0开始
        print('%d:%s' % (i, f))

    八、用zip函数同时遍历两个迭代器

    python3中的zip函数可以把两个或两个以上的迭代器封装成生成器。

    # 找出字母数最多的名字
    names = ['Cecilia', 'Lise', 'Marie']
    letters = [len(i) for i in names]
    max_letters = 0
    longest_name = ''
    for name, count in zip(names, letters):
        if count > max_letters:
            longest_name = name
            max_letters = count
    print(longest_name)

    九、合理利用try/except/else/finally结构中的每个代码块

    执行完try语句,无论是否异常,一定会执行finally。一般用于关闭文件句柄,也可用with语法替代。

    执行完try语句,发生异常执行except,未发生异常执行else。

  • 相关阅读:
    二级评论
    AFN上传数组
    简单播放音频
    好久不见~~ iOS开发动画(Animation)总结
    iOS开发中的单元测试(一)
    在 Xcode 中进行自动化测试 (2/2)
    在 Xcode 中进行自动化测试 (1/2)
    iOS中Bitcode的介绍及配置
    大牛博客
    关于iOS Push Notification的响应问题
  • 原文地址:https://www.cnblogs.com/maxgongzuo/p/10744801.html
Copyright © 2011-2022 走看看