美文网首页Python小哥哥python
对比几段代码,看看你是 Python 菜鸟还是老鸟

对比几段代码,看看你是 Python 菜鸟还是老鸟

作者: 我爱学python | 来源:发表于2019-04-21 14:52 被阅读38次

    Python 里有个小彩蛋:

    在 Python Shell 里输入 import this

    这段话被称作“Python 之禅”(The Zen of Python),它列举了一些 Python 所推崇的理念,比如:

    优美胜于丑陋

    明确胜于隐晦

    简单胜于复杂

    可读性很重要

    不要忽略错误

    面对不确定时,拒绝猜测

    现在做好过不做,但盲目动手不如不做

    如果你的实现很难说清楚,那是个坏想法;反之亦然

    当你学完基础,可以写点代码的时候,可能经常感觉自己的实现很别扭。有经验的程序员会一眼看出你的代码出自一个初学者之手。这就是我们经常说的,代码不够 pythonic

    所谓 pythonic,我觉得包含两方面:一是代码的风格符合 Python 的特点,能合理使用 Python 的“语法糖”;二是代码简洁优美,稳定性高,可读性好,便于维护和修改。所谓“Python 之禅”并不仅限于 Python,很多理念是编程普适的。

    比如来实现对一个列表中元素的遍历访问,我见过很多次有人这么写:

    foriinrange(len(lst)):    print(lst[i])

    这样的同学很可能是之前有过 C/C++ 或 Java 的经验。这么写功能上没问题,但不够简洁,不够 pythonic。更好的实现方式:

    foriinlst:    print(i)

    这种不影响功能,但能简化程序、提高可读性的语法,我们称之为“语法糖”(Syntactic sugar)。Python 中类似的例子还有不少,来举几个:

    1、交换两个变量的值,普通写法:

    temp = aa = bb = temp

    pythonic 写法:

    a, b = b, a

    2、类似的解包(unpacking)用法还可以实现多个返回值的函数。普通写法:

    deffunc(a, b):result = [b, a]

    returnresultr = func(a, b)x = r[0]y = r[1]

    pythonic 写法:

    deffunc(a, b):returnb, ax, y = func(a, b)

    3、读写文件,普通写法:

    f = open('filename.txt')text = f.read()print(text)f.close()

    pythonic 写法:

    withopen('filename.txt')asf:

    forlineinf:        print(line)

    with 的好处是即使出错,也会帮你关闭文件。

    4、拼接字符串,普通写法:

    letters = ['h', 'e', 'l', 'l', 'o']s = ''for l in letters:    s += lprint(s)

    pythonic 写法:

    print(''.join(letters))

    5、关于前面遍历列表的例子,如果你想带上索引,可以这么写:

    fori, eleminenumerate(lst):    print(i, elem)

    遍历字典项:

    forkey, valueindct.items():    print(key, value)

    6、取出列表中大于 0 的元素,生成新列表。普通写法:

    new_lst = []

    foriinlst:

    ifi >0:        new_lst.append(i)

    pythonic 写法:

    new_lst = [iforiinlstifi >0]

    这个被称为“列表解析式”(List comprehension,中文翻译说法有很多),可以说是非常 pythonic 的一个用法了。

    更进一步,如果数据量很大,而你对新列表仅仅是遍历操作,并不需要一个列表对象,可以采用生成器

    new_lst = (iforiinlstifi >0)

    foriinnew_lst:    print(i)

    这样会更节省资源,提升执行效率。

    7、判断一个值是否为True、是否为空列表、是否是None,普通写法:

    pythonic 写法:

    8、根据键名获取字典中对应的值,普通写法:

    value = dct[key]

    这样的问题在于,如果 key 不存在,代码就报错跳出。于是你不得不增加更多的判断。

    pythonic 写法:

    value = dct.get(key,0)

    改用 get 方法,不存在时会得到 None,或者指定的默认值(这里是 0)。

    篇幅所限,以上仅仅是一些比较具有代表性的例子。但凡事要有度,过分追求 pythonic 的写法也可能导致代码的可读性下降。比如有人喜欢把很多功能写在一个语句中,这反倒不 pythonic 了。所以,我们需要有一些设计的原则,但又不必拘泥于具体的形式,否则就钻入牛角尖了。

    那么对于学习者来说,如何才能写出更 pythonic 的代码呢?说到底还是个经验积累的过程,菜鸟不可能看本书、上个课就一夜变成老鸟,但只要坚持得够久就可以。

    相关文章

      网友评论

        本文标题:对比几段代码,看看你是 Python 菜鸟还是老鸟

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