Python 竞赛题-02-Python 的函数是否很赖

2022-10-25 20:59:43 浏览数 (1)

今天看到 5 个比较有趣的题目,来看看你能否全部答对,也丰富一下你的 Python 知识。

第 1 题:万物皆对象

猜下这段代码的输出

代码语言:javascript复制
print(isinstance(object, type))
print(isinstance(type, object))
print(isinstance(type, type))
print(isinstance(object, object))

正确答案是:

代码语言:javascript复制
>>> print(isinstance(object, type))
True
>>> print(isinstance(type, object))
True
>>> print(isinstance(type, type))
True
>>> print(isinstance(object, object))
True
>>>

这是因为 Python 的世界里,万物皆对象。所有类型,如 int、str 和 object 都是 type 类的实例,而 type 类本身也是 type 类的实例,因此在 Python 中一切都是对象。

第 2 题:sum 的结果

猜下这段代码的输出,是关于 sum 函数的:

代码语言:javascript复制
print(sum(""))
print(sum("", []))
print(sum("", {}))

正确答案是:

代码语言:javascript复制
>>> print(sum(""))
0
>>> print(sum("", []))
[]
>>> print(sum("", {}))
{}
>>>

要理解这个结果,我们先要知道 sum 函数是如何工作的:

代码语言:javascript复制
sum(iterable,/, start = 0)

sum 从左到右开始对可迭代的项目进行求和,并返回求和的结果。但是当 iterable 为空时,返回 start 的值。由于 "" 是空字符串,因此总是返回 start 的值,start 的值如果不传入,那就会返回 start 的默认值 0.

第 3 题:Python 的函数懒吗?

猜下这段代码的输出:

代码语言:javascript复制
class follow:
   def func(self):
      return fol()
a = follow()
fol= int
print(a.func())

正确结果是 0 :

代码语言:javascript复制
>>> class follow:
...    def func(self):
...       return fol()
...
>>> a = follow()
>>> fol = int
>>> a.func()
0
>>>

发生这种情况是因为 python 函数中的代码仅在调用时执行。这意味着只有在我们实际调用该方法时才会检查变量是否定义,并绑定变量的值。因此,在上面的例子中,在方法定义期间,Python 允许我们引用尚未定义的类 fol。但是,在调用的时候,Python 会从外部范围绑定名称 fol = int,这意味着函数方法将返回一个新创建的 int 实例,是不是相当的懒啊?

第 4 题:会不会报错

猜一下这段代码的输出:

代码语言:javascript复制
print(sum([a.imag for a in [0,5,10e9,float('inf'),float('nan')]]))

正确的结果是 0.0

你可能会认为这会出错,对吧?它不会。这是因为 Python 中的所有数值类型,如 int、float 等;从基础对象类继承,它们都返回包括 Infinity 和 NaN 在内的实部和虚部。

注:imag 表示负数的虚部,比如 z = 1 2j,那 imag 就是 2。

第 5 题:这符合数学常识吗:

猜一下结果:

代码语言:javascript复制
a=(1 << 53) 1
print(a 1.0 > a)

正确的结果是 False

演算过程如下:

代码语言:javascript复制
>>> 1 << 53
9007199254740992
>>> _   1
9007199254740993
>>> _   1.0
9007199254740992.0
>>>

你可能会问,为什么加 1 的结果还变小了呢?

首先,由于任意精度算术(长算术)的反直觉行为,Python 支持 long 类型的非常大的整数,但是 Python 中浮点精度的限制是有限的。

数字是 2⁵³ 1 = 9007199254740993

其次是浮点精度限制,这意味着它不能完全表示为 Python 浮点数,因此,为了执行 1.0,python 将 a 转换为浮点数,将其四舍五入为 Python 可以轻松表示的 9007199254740992.0,然后将其添加 1.0。但由于相同的表示限制,它将其设置回 9007199254740992.0。

第三是由于比较规则。与其他语言不同,Python 不会在 float 与 int 比较时抛出错误,也不会尝试将两个操作数转换为相同的类型。相反,他们比较实际的数值。并且因为 9007199254740992.0 低于 9007199254740993,所以它打印 False。

最后的话

今天分享了 5 个 Python 题目,如果有收获,还请请点赞、关注、评论

0 人点赞