Python 经典面试题(一)

1、浮点数运算

题目

判断浮点数的运行结果是否相等:html

 a = 0.1
 b = 0.2
 c = 0.3
 assert a + b == c

题目解析:

本题考查的是计算机的浮点运算知识点。不只是 python 语言,其余的编程语言也面临一样的问题:在进行浮点运算的时候,10 进制表示方式会丢掉它的精度,形成运算结果与实际结果不符合。python

这是因为底层 CPU 和运算标准经过本身的浮点单位去执行算术时的特征决定的。看似有穷的小数, 在计算机的二进制表示里倒是无穷的。面试

因此在进行高进度浮点运算的时候必定要注意,尤为是自动化测试过程当中须要进行断言很是容易出错。编程

题目答案:

断言失败,抛出 AssertionError 错误。app

解决方案:

使用 Decimal 模块:编程语言

 from decimal import Decimal
 
 a = 0.1
 b = 0.2
 c = 0.3
 assert Decimal(str(a)) + Decimal(str(b)) == Decimal(str(c))

Decimal() 能够维持浮点数的精度,在金融领域和测试领域等精度要求高的行业有很是大的做用。 可是必定要注意: Decimal() 传的参数必定要是字符串类型,若是是数据类型会再次丢掉精度。函数

  Decimal(0.1) + Decimal(0.2) == Decimal(0.3) # False
  Decimal('0.1') + Decimal('0.2') == Decimal('0.3') # True

2、列表的扁平化和降维

题目

有一个二维列表,降成普通的一维的。好比说柠檬班都会有学员分组,咱们想经过分组信息去获取全部的学员名称。测试

 groups = [['huahua', 'xiaojian'], ['musen', 'yuze'], ['keyou']]
 # 获得结果 ['huahua', 'xiaojian', 'musen', 'yuze', 'keyou']

方法一

最简单的方式能够经过 for 循环的方式一一提取:spa

 names = []
 for group in groups:
  for name in group:
  names.append(name)
 print(names)

方法二

可是在面试的时候可能会加一些限制,好比让你用一行代码实现,这个时候就须要对 python 基础有进一步的理解了,好比说使用 sum 函数:code

 names = sum(groups, [])

很是简单就实现了一样的功能。 sum 函数为何能够作到呢?先看一个简单的例子:

 a = sum([1,2,3])

获得的结果是 6, 也就是说, sum 函数会把一个列表里面的每一个元素相加。可是 sum 函数还能够有第二个参数:开始值,默认为 0 , 因此上述过程其实能够写成:

 a = sum([1,2,3], 0)
 # 0 + 1 + 2 + 3

依据一样的道理,能够对列表进行降维操做:

a = sum([['yuze'], ['is'], ['a']], [])
# [] + ['yuze'] + ['is'] + ['a']
# 列表拼接

方法三

经过列表推导式也能够方便的解决:

a = [e for group in groups for e in group]

3、多重继承

class A:
    def run(self):
        print("a is running")

class B:
    def run(self):
        print("b is running")

class C(A, B):
    pass

# 会打印什么???
C().run()

多重继承常常用来出面试题。在这个考题中,C 类的父类 A 和 B 都实现了 run 方法,那在 C 的对象里究竟是优先调用哪个呢?

答案是: a running

菱形问题

class A:
    def run(self):
        print("a running")

class B(A):
    pass

class C(A):
    def run(self):
        print("C running")

class D(B, C):
    pass

# 会打印什么???
D().run()

他们的继承关系图能够简化以下,这个问题又称为菱形问题或者钻石问题:

 

 

答案是: c running

若是咱们不让 C 类继承 A 呢?

class A:
    def run(self):
        print("a running")

class B(A):
    pass

class C:
    def run(self):
        print("C running")

class D(B, C):
    pass

# 会打印什么???
D().run()

他们的继承关系图能够简化以下,能够简称为 v 型问题:

 

答案会变成 a running

题目解析

具体缘由是 python 的继承会遵循特定的顺序,优先级排在前面的,子类会优先使用。怎么快速查看这种继承顺序呢?经过D.__mro__去查看

好比在 菱形问题上,d 的顺序是这样的:

(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

D 排在最前面,若是 D 定义了 run 方法,就会被优先使用,而后是 B, 而后是C, 而后是 A, 最后是 object 基类。

而在 V 行问题上,d 的顺序又变成了这样:

(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.C'>, <class 'object'>)

A 和 C 互换了顺序。形成 2 个题目的答案不一致。


原文出处:https://www.cnblogs.com/wagyuze/p/11661434.html

相关文章
相关标签/搜索