zoukankan      html  css  js  c++  java
  • 建议1---理解Pythonic的概念

      对于Pythonic的概念,众人都有自己的看法,但大家心中都认同一个更具体的指南,即Tim Peters的《The Zen of Python》。在这一篇充满禅意的诗篇中,有几点非常深入人心:

    • 美胜丑,显胜隐,简胜杂,杂胜乱,平胜陡,疏胜密。
    • 找打一个简单问题的一个方法,最好是唯一的方法。
    • 难以解释的实现,源自不好的主意;如有好的主意,它的实现肯定易于解释。
    Beautiful is better than ugly.
    Explicit is better than implicit.
    Simple is better than complex.
    Complex is better than complicated.
    Flat is better than nested.
    Sparse is better than dense.
    Readability counts.
    Special cases aren't special enough to break the rules.
    Although practicality beats purity.
    Errors should never pass silently.
    Unless explicitly silenced.
    In the face of ambiguity, refuse the temptation to guess.
    There should be one-- and preferably only one --obvious way to do it.
    Although that way may not be obvious at first unless you're Dutch.
    Now is better than never.
    Although never is often better than *right* now.
    If the implementation is hard to explain, it's a bad idea.
    If the implementation is easy to explain, it may be a good idea.
    Namespaces are one honking great idea -- let's do more of those!

    (1)Pythonic的定义

    遵循Pythonic的代码,看起来像是伪代码。其实,所有伪代码都可以轻易的转换为可执行的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自身特色的代码风格。

    (2)代码风格

    举个最常见的例子,在其它语言中(如C语言),两个变量交换需要如下的代码:

    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)

    灵活的使用迭代器是一种Pyhton风格,但不应过分使用奇技淫巧,比如利用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)))

    (3)标准库

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

    print('Hello %s!' % ('Tom',))

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

    print('Hello %(name)s' % {'name':'Tom'})

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

    #字符串
    value = {'greet':'Hello 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的。

    (4)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()
    做一枚奔跑的老少年!
  • 相关阅读:
    厚积薄发,丰富的公用类库积累,助你高效进行系统开发(9)各种常用辅助类
    厚积薄发,丰富的公用类库积累,助你高效进行系统开发(7)声音播放、硬件信息、键盘模拟及钩子、鼠标模拟及钩子等设备相关
    厚积薄发,丰富的公用类库积累,助你高效进行系统开发(6)全屏截图、图标获取、图片打印、页面预览截屏、图片复杂操作等
    厚积薄发,丰富的公用类库积累,助你高效进行系统开发(4)CSV、Excel、INI文件、独立存储等文件相关
    DevExpress控件使用经验总结
    Winform开发框架之通用自动更新模块
    详解在数据查看界面中增加记录导航功能,你应该需要的
    使用Aspose.Cell控件实现多个Excel文件的合并
    厚积薄发,丰富的公用类库积累,助你高效进行系统开发(8)非对称加密、BASE64加密、MD5等常用加密处理
    WCF开发框架形成之旅如何实现X509证书加密
  • 原文地址:https://www.cnblogs.com/xiaoshayu520ly/p/10485708.html
Copyright © 2011-2022 走看看