年薪百万的Python工程师总结的一套面试笔试题以及答案

Posted 程序猿中的BUG

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了年薪百万的Python工程师总结的一套面试笔试题以及答案相关的知识,希望对你有一定的参考价值。

目录


~~在这里插入图片描述~~

​1、Redis中默认有多少个哈希槽

1、 2^14个

2、 Redis 集群没有使用一致性hash, 而是引入了哈希槽的概念。

2、实例变量和类变量的区别

1、 实例变量是对于每个实例都独有的数据

2、 类变量是该类所有实例共享的属性和方法

3、解释一下Python中的身份运算符

这也是一个在Python面试中常问的问题。

通过身份运算符‘is’和‘is not’,我们可以确认两个值是否相同。

>>> 10 is '10'
False
 
>>> True is not False
True

4、yield from 和 yield 的区别

简述yield和yield from

# 下面a()和b()是等价的
def a():
yield from [1,2,3,4,5]
def b():
for i in [1,2,3,4,5]:
yield i
for i in a():
print(i)
for i in b():
print(i)

yield将一个函数变成一个生成器

yield 返回一个值

yield from后面接可迭代对象,一个一个返回值。

5、py2项目如何迁移成py3

1、 先备份原文件,然后使用python3自带工具2to3.py将py2文件转换位py3文件

2、 手动将不兼容的代码改写成兼容py3的代码

6、生产者消费者模型的应用场景

说明

生产者只在仓库未满时进行生产,仓库满时生产者进程被阻塞;消费者只在仓库非空时进行消费,仓库为空时消费者进程被阻塞;

应用场景:处理数据比较消耗时间,线程独占,生产数据不需要即时的反馈等。比如说写入日志,将多线程产生的日志放在队列中,然后写入。

7、简述数据库的读写分离

读写分离就是在主服务器上修改,数据会同步到从服务器,从服务器只能提供读取数据,不能写入,实现备份的同时也实现了数据库性能的优化,以及提升了服务器安全。

8、解释//、%、* *运算符?

//(Floor Division)-这是一个除法运算符,它返回除法的整数部分。

例如:5 // 2 = 2

%(模数)-返回除法的余数。

例如:5 % 2 = 1

**(幂)-它对运算符执行指数计算。a ** b表示a的b次方。

例如:5 ** 2 = 25、5 ** 3 = 125

9、什么是轮询和长轮询

轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客户端的浏览器。

这种传统的HTTP request 的模式带来很明显的缺点 – 浏览器需要不断的向服务器发出请求,然而HTTP request 的header是非常长的,里面包含的有用数据可能只是一个很小的值,这样会占用很多的带宽。

var xhr = new XMLHttpRequest();
setInterval(function() {
    xhr.open('GET', '/user');
    xhr.onreadystatechange = function() {};
    xhr.send();
}, 1000)

长轮询是ajax实现:在发送ajax后,服务器端会阻塞请求直到有数据传递或超时才返回。 客户端javascript响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接。

function ajax() {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', '/user');
    xhr.onreadystatechange = function() {
        ajax();
    };
    xhr.send();
}

10、如果Redis中的某个列表中的数据量非常大,如何实现循环显示每一个值?

使用生成器一个一个取

11、Python的局限性?

1、 速度

2、 移动开发

3、 内存消耗(与其他语言相比非常高)

4、 两个版本的不兼容(2,3)

5、 运行错误(需要更多测试,并且错误仅在运行时显示)

6、 简单性

12、区分Python中的remove,del和pop?

  • remove:将删除列表中的第一个匹配值,它以值作为参数。
  • del:使用索引删除元素,它不返回任何值。
  • pop:将删除列表中顶部的元素,并返回列表的顶部元素。
numbers = [1,2,3,4,5]
numbers.remove(5)
> [1,2,3,4]

del numbers[0]
>[2,3,4]

numbers.pop()
>4

13、什么是ajax请求?手写一个ajax请求

ajax(异步JavaScript和XML)是指一种创建交付式网页应用的网页开发技术。可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

// 不使用第三方
var xhr = new XMLHttpRequest();
xhr.open("GET", url, false);
xhr.onreadtstatechange = function() {
    if (xhr.readystate == 4) {
        //响应内容解析完成,可以在客户端调用了
        if (xhr.status == 200) {
            //客户端的请求成功了
            alert(xhr.responseText);
        }
    }
}
xhr.send(null);
// 使用ajax
$.ajax({
    type: "GET",
    url: "",
    dataType: "json",
    success: function(data) {},
    error: function(jqXHR) {}
});

14、什么是覆盖索引

覆盖索引又可以称为索引覆盖。

1、 解释一: 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。

2、 解释二:
索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了。如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫做覆盖索引。

3、 解释三:
是非聚集组合索引的一种形式,它包括在查询里的Select、Join和Where子句用到的所有列(即建立索引的字段正好是覆盖查询语句[select子句]与查询条件[Where子句]中所涉及的字段,也即,索引包含了查询正在查找的所有数据)。

15、简述多进程开发中join和deamon的区别

1、 join:当子线程调用join时,主线程会被阻塞,当子线程结束后,主线程才能继续执行。

2、 deamon:当子进程被设置为守护进程时,主进程结束,不管子进程是否执行完毕,都会随着主进程的结束而结束。

16、在Python中有多少种运算符?解释一下算数运算符。

在Python中,我们有7种运算符:算术运算符、关系运算符、赋值运算符、逻辑运算符、位运算符、成员运算符、身份运算符。

我们有7个算术运算符,能让我们对数值进行算术运算:

1、 加号(+),将两个值相加

>>> 7+8
15

2、 减号(-),将第一个值减去第二个值

>>> 7-8
-1

3、 乘号(*),将两个值相乘

>>> 7*8
56

4、 除号(/),用第二个值除以第一个值

>>> 7/8
0.875
>>> 1/1
1.0

5、 向下取整除、取模和取幂运算,参见上个问题。

17、python3和python2中int和long的区别

python2中有long类型,python3中没有long类型,只有int类型。python3中的int类型包括了long类型。

18、什么是抽象?

抽象(Abstraction)是将一个对象的本质或必要特征向外界展示,并隐藏所有其他无关信息的过程。

19、将列表alist=[{‘name’:‘a’,‘age’:25},{‘name’:‘b’,‘age’:30},{‘name’:‘c’,‘age’:20}],按照age的值从大到小排列。

alist=[{'name':'a','age':25},{'name':'b','age':30},{'name':'c','age':20}]
blist=sorted(alist,key=lambda x:x['age'],reverse=True)
print(blist)

20、解释一下Python中的继承

当一个类继承自另一个类,它就被称为一个子类/派生类,继承自父类/基类/超类。它会继承/获取所有类成员(属性和方法)。

继承能让我们重新使用代码,也能更容易的创建和维护应用。Python支持如下种类的继承:

  • 单继承:一个类继承自单个基类
  • 多继承:一个类继承自多个基类
  • 多级继承:一个类继承自单个基类,后者则继承自另一个基类
  • 分层继承:多个类继承自单个基类
  • 混合继承:两种或多种类型继承的混合 更多关于继承的内容,参见:

21、break、continue、pass是什么?

break:在满足条件时,它将导致程序退出循环。

continue:将返回到循环的开头,它使程序在当前循环迭代中的跳过所有剩余语句。

pass:使程序传递所有剩余语句而不执行。

22、ascii、Unicode、utf-8、gbk的区别

1、 ascii 是最早美国用的标准信息交换码,把所有的字母的大小写,各种符号用
二进制来表示,共有256中,加入些拉丁文等字符,1bytes代表一个字符

2、Unicode是为了统一世界各国语言的不用,统一用2个bytes代表一个字符,可以表达2^16=65556个,称为万国语言,特点:速度快,但浪费空间

3、 utf-8为了改变Unicode的这种缺点,规定1个英文字符用1个字节表示,1个中文字符用3个字节表示,特点;节省空间,速度慢,用在硬盘数据传输,网络数据传输,相比硬盘和网络速度,体现不出来的

4、 gbk 是中文的字符编码,用2个字节代表一个字符

23、如何在Python中管理内存?

Python内存由Python的私有headspace管理。

所有的Python对象和数据结构都位于一个私有堆中。私用堆的分配由Python内存管理器负责。

Python还内置了一个的垃圾收集器,可以回收未使用的内存并释放内存,使其可用于headspace。

24、Python中的Map Function是什么?

map函数在对可迭代对象的每一项应用特定函数后,会返回map对象。

25、如何保证Redis中的数据都是热点数据

1、 Redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。Redis 提供 6种数据淘汰策略:

2、 volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

3、 volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

4、 volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

5、 allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

6、 allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

7、 no-enviction(驱逐):禁止驱逐数据

26、当退出Python时,是否释放全部内存?

答案是No。循环引用其它对象或引用自全局命名空间的对象的模块,在Python退出时并非完全释放。

另外,也不会释放C库保留的内存部分。

27、select、poll、epoll模型的区别

1、 支持一个进程所能打开的最大连接数

select的最大连接数大概32_32,或者32_64

poll本质和select没区别,但是它没有最大连接数限制

epoll大概10万左右(1G的机器)

2、 FD剧增后带来的IO效率问题

select和poll每次调用都会对连接进行线性遍历,所以会随着FD的增加会造成遍历速度慢的“线性下降性能问题”

epoll没有前两个的线性下降的性能问题,但是当socket都很活跃的情况下,可能会有性能问题。

3、 消息传递方式

select和poll内核需要将消息传递到用户空间,都需要内核拷贝动作。

epoll通过内核和用户空间共享一块内存来实现

28、什么是C/S和B/S架构

1、 C/S 架构是一种典型的两层架构,其全称是Client/Server,即客户端服务器端架构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据库服务器端,客户端通过数据库连接访问服务器端的数据;另一种是Socket服务器端,服务器端的程序通过Socket与客户端的程序通信。

2、 B/S架构的全称为Browser/Server,即浏览器/服务器结构。Browser指的是Web浏览器,极少数事务逻辑在前端实现,但主要事务逻辑在服务器端实现,Browser客户端,WebApp服务器端和DB端构成所谓的三层架构。B/S架构的系统无须特别安装,只有Web浏览器即可。

29、列举Redis支持的过期策略

定时删除

在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除

惰性删除

key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null。

定期删除

每隔一段时间执行一次删除(在Redis.conf配置文件设置hz,1s刷新的频率)过期key操作

30、输入某年某月某日,判断这是这一年的第几天?

date=input('请输入某年某月某日,格式:xxxx.xx.xx')
def get_day(date):
days1=[31,28,31,30,31,30,31,31,30,31,30,31]
days2=[31,29,31,30,31,30,31,31,30,31,30,31]
year,month,day = [int(i) for i in date.split('.')]
if year % 400 ==0 or (year % 4==0 and year % 100!=0):
days=days2
else:
days=days1
return sum(days[:month-1])+day
print(get_day(date))

31、什么是Twemproxy

Twemproxy是一种代理分片机制,由Twitter开源。Twemproxy作为代理,可接受来自多个程序的访问,按照路由规则,转发给后台的各个Redis服务器,再原路返回。该方案很好的解决了单个Redis实例承载能力的问题。

当然,Twemproxy本身也是单点,需要用Keepalived做高可用方案。通过Twemproxy可以使用多台服务器来水平扩张Redis服务,可以有效的避免单点故障问题。

虽然使用Twemproxy需要更多的硬件资源和在Redis性能有一定的损失(twitter测试约20%),但是能够提高整个系统的HA也是相当划算的。不熟悉twemproxy的同学,如果玩过nginx反向代理或者mysql proxy,那么你肯定也懂twemproxy了。其实twemproxy不光实现了Redis协议

32、写出如下代码的输出结果

def decorator_a(func):
print('Get in decorator_a')
def inner_a(*args, **kwargs):
print('Get in inner_a')
return func(*args, **kwargs)
return inner_a

def decorator_b(func):
print('Get in decorator_b')
def inner_b(*args, **kwargs):
print('Get in inner_b')
return func(*args, **kwargs)
return inner_b

@decorator_b #f=decorator_b(f)
@decorator_a #f=decorator_a(f)
def f(x):
print('Get in f')
return x 2
f(1)

答案

Get in decorator_a

Get in decorator_b

Get in inner_b

Get in inner_a

Get in f

解释

当我们对f传入参数1进行调用时,inner_b被调用了,他会先打印Get in inner_b,然后在inner_b内部调用了inner_a,所以会再打印Get in inner_a,然后再inner_a内部调用原来的f,并且将结果作为最终的返回总结:装饰器函数在被装饰函数定义好后立即执行从下往上执行函数调用时从上到下执行

33、如何使用python删除一个文件或者文件夹?

import os
import shutil
os.remove(path) # 删除文件
os.removedirs(path) # 删除空文件夹
shutil.rmtree(path) # 删除文件夹,可以为空也可以不为空

34、为什么学python

答题路线:a、python的优点,b、python的应用领域广

具体:

优点

1、 python语法非常优雅,简单易学

2、 免费开源

3、 跨平台,可以自由移植

4、 可扩展,可嵌入性强

5、 第三方库丰富

应用领域

1、 在系统编程中应用广泛,比如说shell工具。

2、 在网络爬虫方面功能非常强大,常用的库如scrapy,request等

3、 在web开发中使用也很广泛,如很多大型网站都用python开发的,如ins,youtube等,常用的框架如django,flask等

4、 python在系统运维中应用广泛,尤其在linux运维方面,基本上都是自动化运维。

5、 在人工智能,云计算,金融等方面也应用非常广泛。

35、如何修改本地hosts文件

进入c:\\windows\\system32\\drivers\\etc进行修改

36、编写程序,查找文本文件中最长的单词

def longest_word(filename):
    with open(filename, 'r') as infile:
              words = infile.read().split()
    max_len = len(max(words, key=len))
    return [word for word in words if len(word) == max_len]

print(longest_word('test.txt'))
----------------------------------------------------
['comprehensions']

37、用一行代码实现数值交换

1、 a=1

2、 b=2

3、 答案:a,b=b,a

38、数据库的导入与导出命令

1、 导出(MySQLdump)

2、 导出数据和表结构

3、 MySQLdump -uroot -p dbname > dbname .sql

4、 只导出表结构

5、 MySQLdump -uroot -p -d dbname > dbname .sql

6、导入

7、 MySQL -u用户名 -p密码 数据库名 < 数据库名.sql

39、Redis中watch的作用

1、 watch 用于在进行事务操作的最后一步也就是在执行exec 之前对某个key进行监视

2、 如果这个被监视的key被改动,那么事务就被取消,否则事务正常执行.

3、 一般在MULTI 命令前就用watch命令对某个key进行监控.如果想让key取消被监控,可以用unwatch命令

40、MySQL常见数据库引擎及区别

1、 InnoDB:用于事务处理应用程序,具有众多特性,包括ACID事务支持。(提供行级锁)

2、MyISAM:默认的MySQL插件式存储引擎,它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。
注意,通过更改STORAGE_ENGINE配置变量,能够方便地更改MySQL服务器的默认存储引擎。
3、 Memory:将所有数据保存再RAM中

41、使用python将数据库的student表中的数据写入db.txt

import pyMySQL
connect=pyMySQL.Connect(
host='',
port=,
user='',
passwd='',
db='',
charset='',
)

cursor=connect.cursor()
sql='select from student'
cursor.execute(sql)
students=cursor.fetchall()

with open('db.txt','w') as f:
for student in students:
f.write(student)

cursor.close()
connect.close()

42、了解过Hbase,DB2,SQLServer,Access吗

1、 Hbase:HBase是一个分布式的、面向列的开源数据库

2、 DB2:一套关系型数据库管理系统,

3、 SQLServer:SQL Server是由Microsoft开发和推广的关系数据库管理系统

4、 Sccess:Access是由微软发布的关系数据库管理系统。

43、解释一下Python中的继承?

继承(inheritance)允许一个类获取另一个类的所有成员和属性。继承提供代码可重用性,可以更轻松地创建和维护应用程序。

被继承的类称为超类,而继承的类称为派生类/子类。

44、什么是并发和并行

1、 并发:指应用能够交替执行不同的任务,其实并发有点类似于多线程的原理,多线程并非是同时执行多个任务,如果你开两个线程执行,就是在你几乎不可能察觉到的速度不断去切换这两个任务,已达到"同时执行效果",其实并不是的,只是计算机的速度太快,我们无法察觉到而已.

2、 并行:指应用能够同时执行不同的任务,

3、 并发是多个事件在同一时间段执行,并行是多个事件在统一时间点执行。

45、json序列化时可以处理的数据类型有哪些?如何定制支持datetime类型?序列化时,遇到中文转成unicode,如何保持中文形式?

1、 可以处理的数据类型是 string、int、list、tuple、dict、bool、null

2、 通过自定义时间序列化转换器

import json
from json import JSONEncoder
from datetime import datetime
class ComplexEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.strftime(%Y-%m-%d %H:%M:%S‘)
else:
return super(ComplexEncoder,self).default(obj)
d = { ‘name‘:‘alex‘,‘data‘:datetime.now()}
print(json.dumps(d,cls=ComplexEncoder))
# {"name": "alex", "data": "2018-05-18 19:52:05"}

3、 使用ensure_ascii=False参数

46、二叉树是非线性结构,栈和队列以及线性表都是线性结构,对吗?

对的

47、如何以就地操作方式打乱一个列表的元素?

为了达到这个目的,我们从random模块中导入shuffle()函数。

>>> from random import shuffle
>>> shuffle(mylist)
>>> mylist

运行结果:

[3, 4, 8, 0, 5, 7, 6, 2, 1]

48、对列表[3,1,-4,-2]按照绝对值排序

lis=[3,1,-4,-2]
lis=sorted(lis,key=lambda x:abs(x))
print(lis)

49、Python中的字典是什么?

字典是

以上是关于年薪百万的Python工程师总结的一套面试笔试题以及答案的主要内容,如果未能解决你的问题,请参考以下文章

不会这年头还有人不知道OPPO Android 开发技术面吧,年薪百万的大牛都在看了

年薪百万的金融人在露富,年薪百万的互联网人在抠门…

万字完整深入解析JVM面试必备,原来这就是和年薪百万的差距

我身边那些资深程序员,他们是怎么突破年薪百万的?

秋招 “百度六面” 总结210道Java 软件工程师面试笔试题,现已入职阿里

年薪百万的技术人是怎么炼成的?