隐藏在Python中的15个彩蛋

在python环境下输入这些命令,就会出现有趣的画面
import __hello__ import this
import antigravity
from __future__ import braces

在python环境下输入这些命令,就会出现有趣的画面。
比如import this

彩蛋指电影中不仔细寻觅,会被忽略的有趣细节;还有就是影片剧情结束后,在演职员表滚屏时或之后出现的电影片段(通常是一些幽默场景或是跟续集有关的情节线索)

当一门编程语言是开源的时候,往往会有产生一些搞笑和有趣的东西。通常,这意味着社区的贡献者会为该语言添加一些有趣和特别的彩蛋以及隐藏的特性(当然前提是不会增加在生产环境中使用的风险)。

Python 就是一个很好的例子。作为一门开源的语言,它的社区为其贡献了一些十分幽默的东西。

旁注:如果您想观察彩蛋,请注意,它们只能在第一次工作。如果希望重新运行它们,需要重新启动 Python shell。

第一蛋:Hello World

程序员们都熟悉 Hello World 的概念。在大多数情况下,它指的是使用该编程语言编写的最小程序,它会将“Hello World”打印到屏幕。这可能是在学习新的编程语言时首先要做的。

Python 有一个酷酷的隐藏的库,做了一些有点与众不同的事:

>>> import __hello__
Hello World...

hello world 的起源要追溯到 1972 年,贝尔实验室著名研究员 Brian Kernighan 在撰写“B语言教程与指导 (Tutorial Introduction to the Language B)”时初次使用,Python 首次把 hello world 引入到了内置模块中

第二蛋:经典的 Python 之禅

import this

运行此命令将显示由 Tim Peters 编写的”Zen Of Python(Python 之禅)”。据传这是 Python 中的『八荣八耻』,每个有追求的 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!

参考翻译:

 优美胜于丑陋。
显式胜于隐式。
简单胜于复杂。
复杂胜于难懂。
扁平胜于嵌套。
稀疏胜于紧密。
可读性应当被重视。
尽管实用性会打败纯粹性,特例也不能凌驾于规则之上。
不要忽略任何错误,除非你确认要这么做
面对不明确的定义,拒绝猜测的诱惑。
找到一种最好唯一的一种方法去解决问题。
虽然一开始这种方法并不是显而易见,因为你不是 Python 之父。
做好过不做,但没有思考的做还不如不做
如果实现很难说明,那它是个坏想法。
如果实现容易解释,那它有可能是个好想法。
命名空间是个绝妙的想法,请多加利用

第三蛋:反地心引力漫画

>>> import antigravity

导入 antigravity,浏览器会跳转到一副漫画网页 http://xkcd.com/353/,漫画非常有意思。


(学 Python 咋不能上天了?)

参考翻译:

上图:
“你在飞!怎么做到的?”
“Python!”
下左:
“我昨晚学习了 Python,一切都是那么简单”
“运行 HELLO WORLD 只需要 print “Hello World!””
下中:
“我还是不明白……动态类型,还是空格?”
“来加入我们吧,编程又再次变得有趣起来了,Python 是一个全新的世界”
“但你是怎么飞起来的?”
下右:
“我只是输入了  import antigravity”
“就这样?”
“我还对药品柜中的所有东西进行了采样比较”(暗指他对比过多种编程语言,但还是觉得 Python 最简单)
“但我想这就是 Python.”

第四蛋:C++ 程序员的福利

‘braces’库也是一个具有浓厚程序员风格的玩笑,它在其文档中提到,当在编写 Python 代码时使用这个库可提供使用 C++ 花括号的功能。但当你尝试使用它的时候,你将会看到社区对此的看法:

>>> from __future__ import braces
SyntaxError: not a chance

哈哈哈,以为导入 braces 就可以使用花括号来结束代码块?Python 的答案是:没门儿!

C++、Java编程中使用花括号表示代码块,而 Python 社区却给 C++ 一类程序员开了一个玩笑,braces 翻译过来是「花括号」的意思,导入 braces 就可以使用花括号,然而,Python 社区对此的真实态度是:没门儿!

第五蛋:愚人节彩蛋

下面的 April fool 玩笑是由 Barry Warsaw 提出的,与他的退休有关。他是一位著名的 Python 开发者,在他宣布正式退休的时候,就诞生了下面这个彩蛋:

>>> 1<>2
  File "<stdin>", line 1
    1<>2
      ^
SyntaxError: invalid syntax
>>> from __future__ import barry_as_FLUFL
>>> 1<>2
True
>>> 1!=2
  File "<stdin>", line 1
    1!=2
      ^
SyntaxError: invalid syntax

这是 Python3 中的一个彩蛋,怎么解释呢?

barry 是指 Barry Warsaw, 也是著名 Python 开发者,FLUFL 是 Barry 大叔的绰号,Python之父的绰号是 BDFL 。

Barry 大叔认为不等式 != 两个字符在键盘的两端,因为两个键隔太远,敲键盘的时候引起手指疼痛,所以 Barry 希望能恢复 Python2 中的 <>符号来表示”不等于”。

于是,导入 barry_as_FLUFL 就可以使用 <> 了,而 !=却失效了。

https://www.tianqiweiqi.com/hidden-features-of-python.html

第六蛋:Python知道爱是复杂的

>>> love = this
>>> this is love
True
>>> love is True
False
>>> love is False
False
>>> love is not True or False
True
>>> love is not True or False; love is love  # Love is complicated
True

Python中的this模块是Python禅宗(PEP 20)(source:https://www.python.org/dev/peps/pep-0020/) 中的一个彩蛋。有趣吧?你可以看看this.py(source:https://hg.python.org/cpython/file/c3896275c0f6/Lib/this.py)中的具体实现。

有趣的是,禅宗的代码是自相矛盾的(这可能是Python里唯一发生这种情况的地方)。爱不是真或假,爱就是爱这句话读起来有点讽刺,却不言自明。

第七蛋:无穷大

Python中的拼写是有目的的。

>>> infinity = float('infinity')
>>> hash(infinity)
314159
>>> hash(float('-inf'))
-314159

在Python中,无穷大的hash是105×π。有趣的是, float(“-inf”)的hash在Python 3版本里是“-105×π”而在Python 2版本里是“-105×e”。

第八蛋:
使用re.DEBUG查看正则表达式的匹配过程

正则表达式是Python的一大特色,但是调试起来会很痛苦,很容易得出一个bug。幸运的是,Python可以打印出正则表达式的解析树,通过re.debug来显示re.compile的完整过程。

>>> re.compile("^\[font(?:=(?P<size>[-+][0-9]{1,2}))?\](.*?)[/font]",
    re.DEBUG)
at at_beginning
literal 91
literal 102
literal 111
literal 110
literal 116
max_repeat 0 1
  subpattern None
    literal 61
    subpattern 1
      in
        literal 45
        literal 43
      max_repeat 1 2
        in
          range (48, 57)
literal 93
subpattern 2
  min_repeat 0 65535
    any None
in
  literal 47
  literal 102
  literal 111
  literal 110
  literal 116

一旦你理解了语法,你就可以发现你的错误。在这里我们可以看到[/font]忘了去除[]

第九蛋:enumerate函数用于遍历列表中的元素以及它们的下标

>>> a = ['a', 'b', 'c', 'd', 'e']
>>> for index, item in enumerate(a): print index, item
...
0 a
1 b
2 c
3 d
4 e
>>>

第十蛋:对默认实参要多加小心

>>> def foo(x=[]):
...     x.append(1)
...     print x
... 
>>> foo()
[1]
>>> foo()
[1, 1]
>>> foo()
[1, 1, 1]

相反,你应该使用一个标记值表示“无定义”,来替换“[]”。

第十一蛋:切片操作中的tricks

a= [1,2,3,4,5] >>> a[::2] [1,3,5]

特殊的例子是x[::-1],它可以将列表反转

>>> a[::-1] [5,4,3,2,1]

第十二蛋:装饰器

装饰器实现了在一个函数中调用其它函数或方法来增加功能性,从而修改参数或结果等,在函数定义前加上装饰器,只需一个“@”符号。

以下示例显示了一个print_args装饰器的用法:

>>> def print_args(function):
>>>     def wrapper(*args, **kwargs):
>>>         print 'Arguments:', args, kwargs
>>>         return function(*args, **kwargs)
>>>     return wrapper

>>> @print_args
>>> def write(text):
>>>     print text

>>> write('foo')
Arguments: ('foo',) {}
foo

第十三蛋:取参的trick

你可以用*或者**来取出列表或字典作为函数参数

def draw_point(x, y):
    # do some magic

point_foo = (3, 4)
point_bar = {'y': 3, 'x': 2}

draw_point(*point_foo)
draw_point(**point_bar)

第十四蛋:Exception else语句

try:
  put_4000000000_volts_through_it(parrot)
except Voom:
  print "'E's pining!"
else:
  print "This parrot is no more!"
finally:
  end_sketch()

使用“else”比在“try”语句中添加多余的代码更好,因为它避免了意外获取不被try语句保护的异常…除了声明之外。

第十四蛋:嵌套列表推导式和生成器表达式

 [(i,j)foriinrange(3)forjinrange(i) ]

 ((i,j)foriinrange(4)forjinrange(i) )

参考:https://stackoverflow.com/questions/101268/hidden-features-of-python

作者:

喜欢围棋和编程。

 
发布于 分类 编程标签

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注