python企业面试题

企业面试题


  1. python新式类和经典类的区别?
  • python2中继承object的是新式类,没写父类的是经典类(旧式类)
  • python3里只有新式类
  • 保持class与type的统一,对新式类的实例执行a.__class__type(a)的结果是一致的,对于旧式类来说就不一样了
  • 对于多重继承的属性搜索顺序不一样,新式类是采用广度优先搜索(MRO使用C3算法),旧式类采用深度优先搜索
  1. python中内置的数据结构有几种?
  • 整型 int(Python3 中没有 long,只有无限精度的 int)、浮点型 float、 复数 complex
  • 字符串 str、 列表 list、 元祖 tuple
  • 字典 dict 、 集合 set
  1. 设计实现遍历目录与子目录,抓取.py文件
# 方法1:使用Path.rglob
from pathlib import Path

p = Path()
print(p.resolve())
print(list(p.rglob('*.py')))

# 方法2:使用os.walk
import os

def get_files(dir, suffix):
    res = []
    for root, dirs, files in os.walk(dir):
        for filename in files:
            name, suf = os.path.splitext(filename)
            if suf == suffix:
                res.append(os.path.join(root, filename))
    return res

if __name__ == '__main__':
    print(get_files("./", ".py"))

# 其他:如使用from glob import iglob,这自行尝试
  1. 一行代码实现1-100之和
# 使用sum函数
print(sum(range(1, 101)))

# 非一行实现
ret = 0
for i in range(1, 101):
    ret += i
print(ret)
  1. 遍历列表时删除元素的正确做法
# 遍历在新在列表操作,删除时在原来的列表操作

# 删除小于6的元素
# 方法1:
a = [1, 2, 3, 4, 5, 6, 7, 8]
# print(id(a))
# print(id(a[:]))
for i in a[:]:
    if i > 5:
        pass
    else:
        a.remove(i)
print(a)
# print(id(a))

# 方法2: filter
a = [1, 2, 3, 4, 5, 6, 7, 8]
print(list(filter(lambda x: x > 5, a)))

# 方法3: 列表推导式
a = [1, 2, 3, 4, 5, 6, 7, 8]
print([i for i in a if i > 5])
  1. 可变类型和不可变类型
  • 可变类型有list,dict.不可变类型有string,number,tuple.
  • 当进行修改操作时,可变类型传递的是内存中的地址,也就是说,直接修改内存中的值,并没有开辟
    新的内存。
  • 不可变类型被改变时,并没有改变原内存地址中的值,而是开辟一块新的内存,将原地址中的值复制
    过去,对这块新开辟的内存中的值进行操作。
  1. is和==有什么区别?
  • is:比较的是两个对象的id值是否相等,也就是比较俩对象是否为同一个实例对象。是否指向同一个内存
    地址
  • == : 比较的两个对象的内容/值是否相等,默认会调用对象的__eq()__方法
  1. 求出列表所有奇数并构造新列表
a = [1, 2, 3, 4, 5, 6, 7, 8]
print(list(filter(lambda x: x % 2, a)))
# 或者
print([i for i in a if i % 2 == 1])
  1. Python中变量的作用域?(变量查找顺序)
  • 函数作用域的LEGB顺序
    L:local 函数内部作用域
    E:enclosing 函数内部与内嵌函数之间
    G:global 全局作用域
    B:build-in 内置作用
  1. 字符串"123" 转换成 123 ,不使用内置api,例如 int()
# 方法1:使用ord
def atoi(s):
    num = 0
    for v in s:
        num = num * 10 + ord(v) - ord('0')
    return num

if __name__ == '__main__':
    a = '123'
    print(atoi(a))

# 方法2:
  1. 统计一个文本中单词频次最高的10个单词?
import re
from collections import Counter

def most_common_word(filepath):
    with open(filepath) as f:
        return list(map(lambda c: c[0], Counter(re.sub("\W+", " ", f.read()).split()).most_common(10)))

if __name__ == '__main__':
    print(most_common_word('test.txt'))
  1. 请写出一个函数满足以下条件,元素值为偶数且该元素在列表(index)是偶数
l = [0, 1, 2, 3, 4]
print([i for i in l if not (i % 2 and l.index(i) % 2)])
# print([i for i in l[::2] if not i % 2])
  1. 用一行代码生成[1,4,9,16,25,36,49,64,81,100]
[x * x for x in range(1,11)]
  1. 给定一个任意长度字符串,实现一个函数:让所有奇数都在偶数前面,而且奇数升序排列,偶数降序排序,如字符串'1982376455',变成'1355798642'
# 方法1:
def func(l):
    a = []
    b = []
    for i in l:
        if int(i) % 2:
            a.append(i)
        else:
            b.append(i)
    a.sort()
    b.sort(reverse=True)
    a.extend(b)
    return "".join(a)

if __name__ == '__main__':
    a = '1982376455'
    print(func(a))

  1. 写一个函数找出一个整数数组中,第二大的数
# 方法1:
def find_second_large_num(num_list):
    tmp_list = sorted(num_list)
    return tmp_list[-2]

if __name__ == '__main__':
    a = [1, 100, 99, 2]
    print(find_second_large_num(a))
  1. 阅读一下代码他们的输出结果是什么?
def multi():
    return [lambda x : i*x for i in range(4)]
print([m(3) for m in multi()])
-------输出结果-----
[9, 9, 9, 9]

这是Python的闭包的后期绑定导致的,这意味着在闭包中的变量是在内部函数被调用的时候被查找的,因为,最后函数被调用的时候,for循环已经完成, i 的值最后是3,因此每一个返回值的i都是3,所以最后的结果是[9,9,9,9]

  1. 统计一段字符串中字符出现的次数
# 方法1:
def count_str(str_data):
    d = dict()
    for i in sorted(list(set(str_data)), key=str_data.index):
        d[i] = a.count(i)
    return d

if __name__ == '__main__':
    a = "AAACBBCCAC"
    print(count_str(a))
# 方法2:
from collections import Counter
def count_str(str_data):
    return dict(Counter(str_data).most_common())

if __name__ == '__main__':
    a = 'AAACBBCCAC'
    print(count_str(a))
  • Shopee 面试真题
    一面:

自我介绍后直接做题:
编程题(大多都在leetcode上有,多刷题,学院也有每日一题的帖子,多练习问题不大):
1.回文数
2.二分查找
3.自己负责的项目,工作内容介绍
4.sql(学生成绩表排名,相同分数名次并列)
5.http 三次握手
6.用例设计(商城优惠券使用)

二面:
1.自动化测试,pytest
2.性能测试,会问压测遇到的问题,怎么分析,怎么解决
3.消息中间件kafka重复消费问题怎么解决 ,因为简历中有写,面试官会问到
4.持续集成CI/CD
5.如何保证项目质量

三面:
1.hr 面试
2.为什么离职
3.期望薪资
4.以后规划

其他公司面试:
sql 层面
1.where后面不要用null <> !=
2.不要用join
3.表定义不要有冗余

sql优化
1.系统层面
2.分库分表,读写分离,表分区,合理的新建索引(根据查询较多的where 条件),使用缓存

SQL&redis
1.数据持久化,将内存数据保存在磁盘,重启时可以再次加载并使用
2.数据类型:string list, set, zset, hash
3.数据备份(主从模式)

语言Python:
is 和 ==的区别
Python装饰器
算法题,冒泡排序,[{()}] 判断是否为有效的括号

http与https的区别?
https是怎么实现的?
TCP的七层模型?IP在哪一层?

linux:
一行代码杀掉python 进程

Kafka的特性:
高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒
可扩展性:kafka集群支持热扩展
持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
高并发:支持数千个客户端同时读写

Kafka一些重要设计思想:
Consumergroup:各个consumer可以组成一个组,每个消息只能被组中的一个consumer消费,如果一个消息可以被多个consumer消费的话,那么这些consumer必须在不同的组