zoukankan      html  css  js  c++  java
  • Python面试题解答

    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 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)三次

  • 相关阅读:
    累加和校验算法(CheckSum算法)
    云锵投资 2021 年 09 月简报
    云锵投资 2021 年 08 月简报
    断言与忽略断言
    出现 undefined reference to `cv::String::deallocate()'的解决方法
    about of string
    esp32: A stack overflow in task spam_task has been detected.
    IDEA部署Tomcat报错:No artifacts marked for deployment
    在safari浏览器上使用php导出文件失败
    laravel中使用vue热加载时 Cannot read property 'call' of undefined BUG解决方案
  • 原文地址:https://www.cnblogs.com/richiewlq/p/8298368.html
Copyright © 2011-2022 走看看