Python面试题解答

时间:2022-08-22 19:05:43

1. 一个谜题

>>> t = (1, 2, [30, 40])
>>> t[2] += [50, 60]

到底会发生下面 4 种情况中的哪一种?

a. t变成(1, 2, [30, 40, 50, 60])。
b. 因为tuple不支持对它的元素赋值,所以会抛出TypeError异常。
c. 以上两个都不是。
d. a和b都是对的

开始我很确定的选择B,但是实际答案是d,这是为什么呢?

通过pythontutor我们可以看到

Python面试题解答

Python面试题解答

元组赋值之谜的初始和最终状态(图表由Python Tutor网站生成)
 
我们来看看Python为表达式s[a] += b生成的字节码,这个现象背后的原因会变得清晰起来
>>> dis.dis('s[a]+=b')
  1           0 LOAD_NAME                0 (s)
              2 LOAD_NAME                1 (a)  
              4 DUP_TOP_TWO              ------>将s[a] 存入TOS(Top Of Stack,栈顶)
              6 BINARY_SUBSCR
              8 LOAD_NAME                2 (b)
             10 INPLACE_ADD             --------> TOS +=b 因为TOS指向的是可变对象,所以通过
             12 ROT_THREE
             14 STORE_SUBSCR          --------->s[a] = TOS 因为s是不可变的元组,所以失败
             16 LOAD_CONST               0 (None)
             18 RETURN_VALUE
>>>

  这个问题一般很少遇到,不过由此我们在以后的编程中要注意:

  1. 不要把可变对象放在元组里面。
  2.  增量赋值不是一个原子操作。我们刚才也看到了,它虽然抛出了异常,但还是完成了
    操作。

 

对字典排序:

dic={'a':26,'g':20,'e':22,'c':24}

按值进行排序:

解答:

sorted(dic.items(),key= lambda x:x[1])

 

for key in sorted(dic,key=dic.get):
     print(key,dic[key])

解答2

def value_high(key):
     return dic[key]

for key in sorted(dic,key=value_high):
     print(key,dic[key])

 解答3

l=[]

for k,v in dic.items():
    l.append(v)
l.sort()
dic={}
for i in l:
    for k,v in dic.items():
        if i==v:
            dic[k]=v
print(dic)

 

一个二维向量加法的例子,Vector(2,4) + Vextor(2,1) = Vector(4,5)
第一步:实现向量加法
>>> v1 = Vector(2, 4)
>>> v2 = Vector(2, 1)
>>> v1 + v2
Vector(4, 5)

 第二部:通过abs求模

>>> v = Vector(3, 4)
>>> abs(v)
5

 第三部:实现向量乘法:

>>>v = Vector(3, 4)
>>> v * 3
Vector(9, 12)

 解答:我们主要通过几个特殊方法(__repr__、__abs__、__add__和__mul__)

# encoding:utf-8
# Author:Richie
# Date:1/16/2018
from math import hypot

class Vector:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def __abs__(self):
        return hypot(self.x, self.y)

    def __bool__(self):
        return bool(self.x or self.y)

    def __repr__(self):
        return 'Vector(%s,%s)' % (self.x, self.y)

    def __add__(self, other):
        x = self.x + other.x
        y = self.y + other.y
        return Vector(x, y)

    def __mul__(self, scalar):
        return Vector(self.x * scalar, self.y * scalar)

 对于列表

board = [['_']*3] *3

board[1][2]='0'

print(board) 的输出结果是什么?

答:

[['_', '_', '0'], ['_', '_', '0'], ['_', '_', '0']]

这个答案和你想的可能会有些出入,这是为什么呢?

其实上面的代码可以看做是这样的:

row=['_'] * 3
board = []
for i in range(3):
    board.append(row)

追加同一个对象(row)到游戏板(board)三次