极限的 Python
in python翻译 with 0 comment

极限的 Python

in python翻译 with 0 comment

0. 前言

这篇文章旨在记录 Python 中各类极限情况,这种情况在正常编码中几乎不会出现。但十分有趣。谨以此文记录。

1. map() 函数

Python 对于函数式编程提供了很好的实现。令人惊讶的是,仅仅采用几个函数(map(),reduce(),filter())和算子(lambda)就基本上可以实现任意Python程序。

map()函数接受两个参数,第一个是函数,第二个是一个可迭代对象(列表,元组等)。这个函数的功能很简单,会将可迭代对象的每一个元素作为参数传入第一个函数中。依次执行后,其返回的结果组成一个新的 list 对象返回。也就是说,返回结果永远是第一个函数执行结果的 list。

假如第一个函数式 None,传入一个 list 会有什么结果?

map(None, [1, 2, 3, 4])

在 Python2 中,会返回原先的第二个参数。

zVHit.png

而在 Python3 中,会返回一个 map 对象(迭代器)。

zVbJP.png

产生不一样结果的原因是 Python3 中对 map 的运算结果进行了延迟计算。其官方描述为:

Wraps map() in a list call. It also changes map(None, x) to list(x). Using from future_builtins import map disables this fixer.

2. Python 中的最大数

原文传送门
这个问题的准确的描述应该是 Maximum and Minimum values for ints in Python
在 Python2中sys 模块存储了这一常量。

$ python -c 'import sys;print sys.maxint'
9223372036854775807

当然也可以用-sys.maxint - 1来计算最小值。

$ python -c 'import sys;print -sys.maxint - 1'
-9223372036854775808

但是,如果数字超过了 sys.maxint,Python 会将它转换为长整型:

>>> import sys
>>> type(sys.maxint)
<type 'int'>
>>> type(sys.maxint+1)
<type 'long'>
>>>

但是在 Python3 中,超过 maxint 却不受影响:

In [1]: 9223372036854775807+1
Out[1]: 9223372036854775808

In [2]: type(9223372036854775807+1)
Out[2]: int

3. True

Python2中有一个奇妙的 Bug:
9TUXCj.md.png
不用怀疑,是的没有屏蔽关键字作为变量名,这一点在 Python3中已经得到了修复:
9TUxvq.md.png
所以,拥抱 Python3 吧~

4. is

is 是同一运算符,这意味着 is 的两端的变量不仅要相等,地址也需要一样。比如这样:

In [1]: x, y =5, 5
In [2]: x is y
Out[2]: True

但是,也有翻车的操作,比如这样:

In [7]: x = 257

In [8]: y = 257

In [9]: x is y
Out[9]: False

这是因为此时的 x 和 y 的 ID 不同:

In [10]: id(x)
Out[10]: 4414787408

In [11]: id(y)
Out[11]: 4414786320

不同的原因是 Python 会对区间 [-128, 127] 内的值使用相同的引用。

Responses