链式比较、奇怪的字母、有趣的import...Python冷知识(六)

百家 作者:AI100 2019-05-12 11:29:10


本文转载自Python编程时光(ID:Python-Time)


冷知识系列,已经更新至第六篇。

谈谈 Python 那些不为人知的冷知识(一)

谈谈 Python 那些不为人知的冷知识(二)

谈谈 Python 那些不为人知的冷知识(三)

谈谈 Python 那些不为人知的冷知识(四)

谈谈 Python 那些不为人知的冷知识(五)


链式比较

先给看一个示例。

>>>?False?==?False?==?True
False


你知道这个表达式会返回 False 吗?

我再给你举个例子,你可能就懂了。


f?18?< ?age?????print("young?man")

如果还不明白,再给你整个等价写法。

>>>?False?==?False?and?False?==?True
False


奇怪的字母

直接看下列例子,在Python 2.x 中

>>>?value?=?11
>>>?valuе?=?32
??File?"",?line?1
????valuе?=?32
????????^
SyntaxError:?invalid?syntax

在Python 3.x 中

>>>?value?=?11
>>>?valuе?=?32
>>>?value
11

我相信你一开始看到这里,一定是目瞪口呆。你可以在自己的电脑上尝试一下,你会发现你不管在哪个版本的 Python 里运行都没有问题。

如果你想重现我这个场景,你可能复制我上面的代码粘贴至自己的命令行中即可。

在这里,也不卖关子了,上面代码中第二行的?е?和 第一行的?e?是不一样的。(为了让你区分开来,上面的两个 e 的字体我选不一样的,当你在你的 cmd 窗口中执行时,是完全区分不出来的。)

第二行的?e?是 Cyrillic(西里尔)字母,而不是我们熟悉的英文字母。

>>>?ord('е')?#?cyrillic?'e'?(Ye)
1077
>>>?ord('e')?#?latin?'e',?as?used?in?English?and?typed?using?standard?keyboard
101
>>>?'е'?==?'e'
False

细思恐极,平时可千万不要得罪同事们,万一辞职的时候,把你项目里的?e?全局替换成?e,到时候连错都不知道错哪了哈哈。

x == +x 吗

在大多数情况下,这个等式是成立的。

>>>?n1?=?10086
>>>?n2?=?+n1
>>>
>>>?n1?==?n2
True

什么情况下,这个等式会不成立呢?由于Counter的机制,+?用于两个 Counter 实例相加,而相加的结果如果元素的个数?< =0,就会被丢弃。

>>>?from?collections?import?Counter
>>>?ct?=?Counter('abcdbcaa')
>>>?ct
Counter({'a':?3,?'b':?2,?'c':?2,?'d':?1})
>>>?ct['c']?=?0
>>>?ct['d']?=?-2
>>>
>>>?ct
Counter({'a':?3,?'b':?2,?'c':?0,?'d':?-2})
>>>
>>>?+ct
Counter({'a':?3,?'b':?2})


有趣的import

import 是?Python 导包的方式。你知道 Python 中内置了一些很有(wu)趣(liao)的包吗?

Hello World

>>>?import?__hello__
Hello?World!

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!

反地心引力漫画

在 cmd 窗口中导入antigravity

>>>?import?antigravity

就会自动打开一个网页。


局部/全局变量分不清

在开始讲之前,你可以试着运行一下下面这小段代码。

a?=?1

def?func01():
????a?+=?1

func01()

看似没有毛病,但实则已经犯了一个很基础的问题,这个报错相当常见吧?

>>>?func01()
Traceback?(most?recent?call?last):
??File?"",?line?1,?in?
??File?"",?line?2,?in?func01
UnboundLocalError:?local?variable?'a'?referenced?before?assignment

当程序运行到?a += 1?时,Python 解释器就认为在函数内部要给?a?这个变量赋值,当然就把?a?当做局部变量了,报错是理所应当的。理解了上面的例子,给你留个思考题。为什么下面的代码不会报错呢?

a?=?1

def?func02():
????print(a)

func02()


(本文为 AI科技大本营转载文章,转载请联系原作者)


CTA核心技术及应用峰会



5月25-27日,由中国IT社区CSDN与数字经济人才发展中心联合主办的第一届CTA核心技术及应用峰会将在杭州国际博览中心隆重召开,峰会将围绕人工智能领域,邀请技术领航者,与开发者共同探讨机器学习和知识图谱的前沿研究及应用。


更多重磅嘉宾请识别海报二维码查看,目前会议早鸟票发售中(原票价1099元),点击阅读原文即刻抢购。添加小助手微信15101014297,备注“CTA”,了解票务以及会务详情。

推荐阅读

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

图库
公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接