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


冷知识系列,直至今日,已经更新至第五篇。


前四篇传送门小明给你准备好了,还没阅读的可以学习一下。


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

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

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

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

还是老规矩,一篇只分享五个,有时间了就整理。不想错过的,千万记得关注一下

01


空字符串计数



求一个字符串里,某子字符(串)出现的次数。在Python中使用 count() 函数,就可以轻松实现。

比如下面几个常规例子

>>"aabb".count("a")
2
>>"aabb".count("b")
2
>>"aabb".count("ab")
1

但是如果使用空字符串呢,你可能想不到会是这样的结果。

>>"aabb".count("")
5

具体原因,我不敢妄下结论。

由此我还衍生出另一个想法,实验了下。不知道空字符串,是一种什么样的存在,难道字母与字母之间 “缝隙” 也算吗?

>>> "" in ""
True
>>> "" in "ab"
True

有兴趣的可以去看看CPython的源码实现。如果有结论,还请后台回复一下。不胜感激。


02


负负得正



从初中开始,我们就开始接触了负数 这个概念。知道了负负得正这和武侠世界里的以毒功毒,有点神似。

Python 作为一门高级语言,它的编写符合人类的思维逻辑,这其中也包括负负得正这个思想。

>>> 5-3
2
>>> 5--3
8
>>> 5+-3
2
>>> 5++3
8
>>> 5---3
2



03


数值与字符串比较



在 Python2 中,数字可以与字符串直接比较。结果是数值永远比字符串小。

>>100000000 < ""
True
>>100000000 < "ming"
True

但在 Python3 中,却不行。

>>100000000 < ""
TypeError: '<' not supported between instances of 'int' and 'str'



04


循环中的局部变量泄露


在Python 2中x的值在一个循环执行之后被改变了。

# Python2
>>> x = 1
>>> [x for x in range(5)]
[01234]
>>> x
4

不过在Python3 中这个问题已经得到解决了。

# Python3
>>> x = 1
>>> [x for x in range(5)]
[01234]
>>> x
1



05


让字典可排序



字典不可排序的思想,似乎已经根深蒂固。

# Python2.7.10
>>> mydict = {str(i):i for i in range(5)}
>>> mydict
{'1'1'0'0'3'3'2'2'4'4}

在 Python3 中字典已经是有序的。

# Python3.6.7
>>
> mydict = {str(i):i for i in range(5)}
>>> mydict
{'0'0'1'1'2'2'3'3'4'4}