python-QA Acemyzoe

python Interview

Python基本功和基本原理,重点考察运算符、装饰器、生成器的原理和实现,垃圾回收机制、各种数据类型,以及线程、进程、协程的概念和应用。

计算机基础,重点考察数据结构(链表、哈希、堆栈、二叉树)和算法分析(时间复杂度分析)

  • 这两个参数是什么意思:*args,**kwargs?我们为什么要使用它们?

    如果我们不确定往一个函数中传入多少参数,或者我们希望以元组(tuple)或者列表(list)的形式传参数的时候,我们可以使用*args(单星号)。如果我们不知道往函数中传递多少个关键词参数或者想传入字典的值作为关键词参数的时候我们可以使用**kwargs(双星号),args、kwargs两个标识符是约定俗成的用法。

  • 谈一谈Python的装饰器(decorator)

    装饰器本质上是一个Python函数,它可以让其它函数在不作任何变动的情况下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景。比如:插入日志、性能测试、事务处理、缓存、权限校验等。有了装饰器我们就可以抽离出大量的与函数功能无关的雷同代码进行重用。

  • 简要描述Python的垃圾回收机制(garbage collection)

  • Python多线程(multi-threading)。这是个好主意吗?

  • 说明os,sys模块不同,并列举常用的模块方法?

  • 什么是lambda表达式?它有什么好处?

  • Python中pass语句的作用是什么?

  • Python是如何进行类型转换的?

  • Python里面如何拷贝一个对象?

  • __new____init__的区别。

  • Python中单下划线和双下划线分别是什么?

  • 说一说Python自省。

  • 如何反序迭代一个序列?

  • 如何用Python来进行查询和替换一个文本字符串?

  • 使用Python实现单例模式。

  • 重新实现str.strip(),注意不能使用string.*strip()

  • super

  • Python的函数参数传递

    Pythonstring、tuple、number属于不可更改对象,而listdict属于可修改对象。

  • 类变量和实例变量

  • Python在函数式编程方面的支持。lambda表达式\内建函数:filter()、reduce()、map()

  • 试图访问一个列表的以超出列表成员数作为开始索引的切片将不会导致IndexError,并且仅仅返回一个空list

    templist = [1,2,3,4,5]
    print(temolist[10:])
    
  • late binding

    def testfun():
        temp = [lambda x: i*x for i in range(4)]
        return temp
      
    for lb in testfun():
        print(lb(2))
      
    def testfun():
        temp = [lambda x,i=i : i*x for i in range(4)]
        return temp
      
    for lb in testfun():
        print(lb(2))
          
    def testfun():
        return (lambda x: i*x for i in range(4))
      
    for lb in testfun():
        print(lb(2))
    
  • 笔试试题“一个芬兰人进了一个房间,房间有一排椅子,椅子上有一些人坐着,还剩一些空位,他要选择一个位子坐下,这个位子要尽可能远离已经坐着的人,请给出算法。请自行定义数据结构和输入输出。”

    import unittest
    # 分析空位情况:1,首位有人;2,尾位有人;3中间占人
    # 输入:空位列表 输出:结果位置和最大距离
    # 1.输入:list=[1,0,0,0] 输出:[3],3
    # 2.输入:list=[0,0,0,1] 输出:[0],3
    # 3.输入:list=[1,0,0,0,1,0,1] 输出:[2],2
    # 4.输入:list=[1,0,0,1,0] 输出:[1,2,4],1
      
    class Testlist(unittest.TestCase):
      
        def test_case1(self):
            list=[1,0,0,0]
            self.assertEqual(solution(list),([3], 3))
          
        def test_case2(self):
            list=[0,0,0,1]
            self.assertEqual(solution(list), ([0], 3))
      
        def test_case3(self):
            list=[1,0,0,0,1,0,1]
            self.assertEqual(solution(list), ([2], 2))
      
        def test_case4(self):
            list=[1,0,0,1,0]
            self.assertEqual(solution(list), ([1,2,4], 1))
      
    def solution(seats):
        """
        seats: List[int]
        return: ans[int],int
        """
        persons = [p for p, seat in enumerate(seats) if seat == 1]
        nullseat = [p for p, seat in enumerate(seats) if seat == 0]
        maxdict = max(persons[0], 
                  len(seats)-1-persons[-1], 
                  max([(persons[r]-persons[r-1])//2 for r in range(1, len(persons))]+[0]))
        ans=[]
        for i in nullseat:
            if min([abs(i-j) for j in persons])==maxdict:
               ans.append(i) 
        return ans,maxdict
      
    if __name__ == '__main__':
        unittest.main()