美文网首页
编写高质量的python代码(1):理解pythonic概念

编写高质量的python代码(1):理解pythonic概念

作者: DraculaWong | 来源:发表于2016-10-08 13:06 被阅读0次

    Pythonic的定义

    遵循Pythonic的代码,看起来就像是伪代码,所有的伪代码都可以轻易转换为可执行的Python代码。比如在Wikipedia的快速排序条目下有如下伪代码:

    function quicksort('array')
           if length('array') < 1 
                 return 'array'
           for each 'x' in 'array'
                 if 'x' <= 'pivot' then append 'x' to 'less'
                 else append 'x' to 'greater'
             return concatenate(quicksort('less'), list('pivot'), quicksort('greater'))
    

    实际上,它可以转化为以下同等行数的可以执行的Python代码:

    def quicksort(array):
          less = []
          greater =[]
          if len(array) <= 1:
              return array
          pivot = array.pop()
          for x in array:
               if x <= pivot: 
                     less.append(x)
               else:
                     greater.append(x)
          return quicksort(less) + [pivot] + quicksort(greater)
    

    综合这个例子来说,Pythonic也许可以定义为:充分体现Python自身特色的代码风格。

    代码风格

    对于风格,光说是没有用的,最好是通过例子来看看,因为例子看的见,会显得真实,下面以语法,库和应用程序为例给大家介绍
    在语法上,代码风格要充分体现Python自身特色。举个最常见的例子,在其他语言中,两个变量交换需要如下的代码:

    int a=1, b=2;
    int tmp =a;
    a=b;
    b=tmp;
    

    利用Python的packaging/unpackaging机制,Pythonic的代码只需下一行:

    a, b = b, a
    

    还有,在遍历一个容器的时候,类似其他编程语言的代码如下:

    length = len(alist)
    i =0
    while i < length:
           do_sth_with(alist[i])
           i += 1
    

    而Pythonic的代码如下:

    for i in alist:
         do_sth_with(i)
    

    灵活的使用迭代器也是一种Python风格,又比如,需要安全的关闭文件描述符,可以使用一下with语句:

    with open(path, 'r') as f:
           do_sth_with(f)
    

    通过上述的代码的对比,大家能够清晰的认识到Pythonic的一个要求,就是对Python语法本身的充分的发挥,写出来的代码都是带着Python
    味儿,而不是看着像C语言的代码,或者像Java代码
    应当追求的是充分利用Python语法,但不应当过分的使用奇技淫巧,比如利用Python的Slice语法,可以下厨如下代码:

    a=[1,2,3,4]
    c = 'abcdef'
    print a[::-1]
    print c[::-1]
    

    如果不是同样追求每一个语法细节的老鸟,这段代码的作用恐怕不能一眼看出来。这个时候更好的体现Pythonic的代码是充分利用Python库里的reversed()函数的代码

    print list(reversed(a))
    print list(reversed(c))
    

    标准库

    写Pythonic程序需要对标准库有充分的理解,特别是内置函数和内置数据类型。比如,对于字符串格式化,一般这样写:

    print 'hello %s' % ('Tom',)
    

    其实%s是非常影响可读性的,因为数量多了以后,很难清楚哪一个占位符对应哪一个实参。所以相对应的Pythonic代码是这样的:

    print 'hello %(name)s' %('name': 'Tom')
    

    这样在参数比较多的情况下尤其有用

    # 字符串
    value = {'greet': 'helo world', 'language': 'Python'}
    print '%(greet)s from %(language)s.' % value
    

    %占位符来自于大家的先验只是,其实对于新手而言,有点莫名其妙,所以更具Pythonic风格的代码如下:

    print '{greet} from {language}'.format(greet='hello world', language='Python')
    

    str.format()方法非常清晰地表达了这条语句的意图,而且模板的使用也减少了许多不必要的字符,使可读性得到了很大提升。事实上,str.format()也成了Python最为推荐的字符串格式化方法,当然也是最Pythonic的

    Pythonic的库或框架

    编写应用程序的时候的要求会更高一些。因为编写应用程序一般需要团队合作,那么可能你编写的那一部分正好是团队的另一成员需要调用的接口,换言之,你可能正在编写库或框架
    程序员利用Pythonic的库或框架能更加容易,更加自然的完成任务。如果利用Python编写的库或框架迫使程序员编写累赘的或不推荐的代码,那么可以说它并不Pythonic。现在业内通常认为Flask这个框架是比较Pythonic的,它的一个hello world级别的用例如下:

    from flask import Flask
    app = Flask(__name__)
    @app.route('/')
    def hello():
          return 'hello world'
    
    if __name__ == '__main__':
         app.run()
    

    稍有编程经验的人都可以通过上例认识到利用Python编程极为容易这一事实。一个Pythonic的框架不会对已经通过惯用法完成的东西重复发明“”轮子“,而且它页遵循常用的Python惯例。创建Pythonic的框架及其困难,什么理念更酷,更符合语言习惯对此毫无帮助,事实上这些年来优秀的Python代码的特性也在不断演化。比如现在认为像generators之类的特性尤为Pythonic
    另一个有关新趋势的例子是:Python的包和模块结构日益规范化。现在的库或框架跟随了以下潮流:

    • 包和模块的命名才用小写,单数形式,而且短小
    • 包通常仅作为命名空间,如只包含空的init.py文件

    相关文章

      网友评论

          本文标题:编写高质量的python代码(1):理解pythonic概念

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