美文网首页Python
代码这样写更优雅python

代码这样写更优雅python

作者: 一曲广陵散 | 来源:发表于2017-03-09 11:02 被阅读115次

    引用
    一个程序员的微站

    一,概述

    Programs must be written for people to read , and only incidentally for machines to execute.
    Harold Abelson, Structure and Interpretation of Computer Programs(计算机程序的构造和解释)

    要写出Pythonic 优雅的,道地的,整洁的代码,需要平时多观察大牛代码,

    Github上的requests, flask , tornado 等优秀源代码是学习对象,下面是一些总结的常见的pythonic写法
    一份优雅简洁的代码通常自带文档和注释属性,读代码就是读作者的思路
    python 开发中很少像Java一样遵循某种设计模式作为开发原则中应用于系统中
    代码清晰是最终目的

    二,Pythonic集锦

    1 变量交换

    大部分编程语言交换两个变量的值,不得不引入一个临时变量


    2 循环遍历区间元素


    xrange 返回的是生成器对象,生成器比列表更加节省内存,
    需要注意xrange是python 2的写法, python3中只有range 方法,特点和xrange一样


    3 带有索引位置的集合遍历

    遍历集合时候需要使用到集合的索引位置,直接对集合迭代没有索引信息,


    4 字符串连接

    字符串连接时候,普通的方式可以用 + 操作
    join 是一种更加高效的字符串连接方式,使用+操作时候,
    每执行一次+操作在内存中生成一个新的字符串对象,
    遍历8次有8个字符串生成,造成无谓的内存浪费
    用join 方法整个过程中只会生成一个字符串对象


    5 打开/关闭 文件

    执行文件操作时候,最后一定不能忘记关闭文件,即使报错了也要close,
    普通的方法是在finnally 块中显示的调用close()方法
    使用with 语句,系统会在执行玩文件操作后,自动关闭文件对象


    6 列表推导式

    能够使用一行代码简明扼要的解决问题时候,不要使用两行
    与之类似的还有生成器表达式,字典推导式


    7 善用装饰器

    装饰器可以把与业务逻辑无关的代码抽离出来,让代码保持干净清爽,
    而且装饰器还能被多个地方重复使用, 比如一个爬虫网页的函数
    如果该URL曾经被爬过就直接从缓存中获取,否则爬下来之后加入到缓存,
    防止后续重复爬取

    使用装饰器写代码表面上感觉代码量更多,但是它把缓存相关的逻辑抽离出来了
    可以给更多的函数调用,这样总的代码量减少,而且业务看起来简洁


    8 合理使用列表

    列表对象list 是一个查询效率高于更新操作的数据结构,
    例如删除一个元素和插入一个元素的执行效率非常低,因为要对剩下的元素进行移动

    deque 是一个双向队列的数据结构,删除元素和插入元素会很快


    9 序列解包


    10 遍历字典的key 和 value

    方法一速度没有那么快,因为每一次迭代时候还要重新进行hash查找key 对应的value
    方法二遇到字典非常大的时候,会导致内存的消耗增加一倍以上

    iteritems 返回迭代器对象,可以节省更多的内存,
    不过在python3中没有该方法了,只有items方法,作用等价于iteritems


    11, 链式比较操作

    链式比较操作 False == False == True 等价于 False == False and False == True
    所以输出结果是False


    12, if/else 三目运算

    在类C的语言中都支持三目运算b ? x: y , Python 之禅

    There should be one -- and preferably only one --obvious way to do it.

    能够使用if/else 清晰表达逻辑时候,就没有必要在额外新增一种方式来实现



    13,真值判断

    检查某个对象是否是真值, 显示地使用True 和 False 作比较多此一举,不专业


    14,for/else 语句

    for else 是Python 特有的语法格式,else 中的代码在for 循环遍历完所有元素之后执行


    15,字符串格式化

    很难说用format 比用%s 的代码少,但是format 更加易于理解


    16,列表切片

    获取列表中的部分元素最先想到的是用for 循环根据条件提取元素,这也是其他语言中
    管用的手段,但是python中有强大的切片功能
    列表元素的下标不仅可以用正数表示,还可以用负数表示,最后一个元素的位置是-1,
    从右到左,依次递减


    17,善用生成器

    上面是用生成器生成斐波那契数列,生成器的好处是无需一次性将所有的元素
    加载到内存,只有迭代获取元素的时候才返回元素,
    而列表预先一次性把全部的元素加载到内存,
    此外使用yield,代码看起来更加简洁


    18,获取字典元素


    19,预设字典默认值

    通过key 分组时候,不得不每次都检查key 是否已经存在于字典中


    20,字典推导式

    在python2.7之前,构建字典对象一般使用下面这种方式,可读性非常差

    字典推导式是python2.7新增的特性, 可读性增强了很多,类似的还有列表推导式和集合推导式

    相关文章

      网友评论

        本文标题:代码这样写更优雅python

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