[Python] 一行代码让你明白什么叫艺术

信仰:一个人走得远了,就会忘记自己为了什么而出发,希望你可以不忘初心,不要随波逐流,一直走下去
欢迎关注点赞收藏留言
本文由 程序喵正在路上 原创,CSDN首发!
系列专栏:Python学习
首发时间:2022年5月10日
✅ 如果觉得博主的文章还不错的话,希望小伙伴们三连支持一下哦

什么样的程序是好的?

如何编写漂亮的代码?

这是学习编程一段时间最经常提出的问题,却最难回答。程序设计语言如同自然语言一样,好的代码就像文学作品,不仅达意,更要优美。

那什么是“好”? 什么是“优美”?

今天,我就用一行代码来回答你。

领悟编程代码优美的过程类似参禅,除了不断练习,也需要理解一些原则。

Python 编译器以函数库的形式内置了一个有趣的文件,被称为 “Python之禅” (The Zen of Python)。当调用如下一行语句后,会出现一段有趣的运行结果。

import this

程序执行结果如下:

The Zen of Python, by Tim Peters

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!

这是一篇由 Tim Peters 撰写的文章,介绍了编写优美的 Python 程序所需要关注的一些重要原则。下面是 Python 之禅的参考翻译。

Python之禅作者: Tim Peters                
     
优美胜于丑陋
明了胜于隐晦
简洁胜于复杂
复杂胜于凌乱
扁平胜于嵌套
间隔胜于紧凑
可读性很重要
即便假借特例的实用性之名,也不要违背上述规则
除非你确定需要,任何错误都应该有应对
当存在多种可能,不要尝试去猜测
只要你不是 Guido,对于问题尽量找一种最好是唯一明显的解决方案
做也许好过不做, 但不假思索就动手还不如不做
如果你无法向人描述你的实现方案,那肯定不是一个好方案
如果实现方案容易解释,可能是个好方案
命名空间是绝妙的理念,要多运用

好的程序代码不仅能够完成功能,也是一件艺术作品。对于程序员来说,大多数时间在阅读并修改代码,好的代码可读性能将这种阅读变成一种享受。

如何能够编写好的代码呢?

请大家首先熟练掌握一门语言,如 Python;其次,要阅读一定量优质的代码,思考这些代码的编程思路和风格;最后,选择一个有兴趣的项目编写代码、修改、再修改,直到你认为它是个作品为止。

除了 Python 之禅所表达的 Python 设计理念,该程序还有另一段魅力。 我们可以在 Python 安装目录中找到 Lib/this.py 文件,忘记安装位置的小伙伴可以在安装 PyCharm 的盘中搜索 this.py 就可以搜索出来,该程序内容如下:

s = """Gur Mra bs Clguba, ol Gvz Crgref

Ornhgvshy vf orggre guna htyl.
Rkcyvpvg vf orggre guna vzcyvpvg.
Fvzcyr vf orggre guna pbzcyrk.
Pbzcyrk vf orggre guna pbzcygrq.
Syng vf orggre guna arfgrq.
Fcnefr vf orggre guna qrafr.
Ernqnovyvgl pbhagf.
Fcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf.
Nygubhtu cenpgyvgl orngf chevgl.
Reebef fubhyq arire cnff fvyragyl.
Hayrff rkcyvpvgyl fvyraprq.
Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff.
Gurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg.
Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu.
Abj vf orggre guna arire.
Nygubhtu arire vf bsgra orggre guna *evtug* abj.
Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn.
Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn.
Anzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!"""

d = {}
for c in (65, 97):
    for i in range(26):
        d[chr(i+c)] = chr((i+13) % 26 + c)

print("".join([d.get(c, c) for c in s]))

该程序第 1 到第 21 行是一个字符串 s,但该字符串并非明文。将 s 转换成明文内容的代码是从第 23 行到第 28 行。在这些代码中,可以看到字典、列表和元组类型,下面我们逐行来分析这个代码的功能。

23 行定义了一个空字典 d,第 26 行对字典 d 填充了内容,这个填充将i+c 对应的字符替换为 (i+13)%26 +c,即将编号循环增加了 13chr(65) 代表字符 ‘A’,chr(97) 代表字符 ‘a’,因此,第 23 到第 26 行建立了字母 az 和字母 AZ 的一个 13 位循环移动的对应表,如下所示:

密文:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

原文:N O P Q R S T U V W X Y Z A B C D E F G H I J K L M

密文:a b c d e f g h i j k l m n o p q r s t u v w x Y z

原文:n o p q r s t u v w x y z a b c d e f g h i j k l m

这个算法可以看作是凯撒密码的一种扩展, 相比凯撒密码,这个算法采用循环移动 13 个位置,直接好处是原文和密文之间的相互转换可以使用同一个程序,如果我们掌握这个算法,传递个小纸条、发个小消息就不怕被别人看懂了,哈哈哈。

这次的分享就到这里啦,继续加油哦^^
有出错的地方欢迎在评论区指出来,共同进步,谢谢啦

你可能感兴趣的:(Python学习,python,pycharm)