今天看到 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 题目,如果有收获,还请请点赞、关注、评论。