本人也是抱着不成功则成仁的想法去的

先说一下肯定有干货

反正不管过不过 总的榨点他身上的东西 对吧! 抓到了总要一顿乱问

晚上7点半接到面试邀请电话

请先简单的自我介绍一下自己

吧啦吧啦说了有两三分钟 主要干什么的 毕业哪里的 为什么选python 以及除了python还会不会别的语言等等

然后直接进入正题

说说你知道的python变量作用域

LEGB 总体来说就是先当前外部函数 然后全局变量 然后内建

python2 用过没 xrange和range的区别是什么?

就拿最简单的例子来说 for i in range(5)

xrange的类型是列表 range的类型是int

那你说说python的 装饰器迭代器和生成器吧

装饰器的本质又是什么?

装饰器的本质就是函数 外层函数的返回值是内部函数的引用

再详细一些。

我曾看过flask 路由的源码 就是运用装饰器原理实现的

第一层是带参数就是url

第二层和第三层是装饰器

简单来说就是定义一个字典 以url为键以视图函数为值

但是用了falsk装饰器路由的同时再加上另一个装饰器会发生循环导入问题

这就要刨地层了 因为装饰器并不是简单的装饰 是把被装饰的函数的内存也更改了。

用大白话来说 就是被装饰器的函数的内存 放到了装饰器的内存里简单来说

就是成为了装饰器的一小部分

那解决方案呢?

一在外层函数上加上@functoolwraps(被装饰函数)

或者 在外层函数返回时把人家的内存地址给返回

为什么django没事呢?

因为django的路由是循环。 如果需要优化路由的话

最简单的方式就是把常访问的路由放在第一位

那你知道装饰器的args和kwars的解包解出来是什么吗

我……十脸懵逼

然后虚心请教 他说比如元祖是1字典是q:1

解包出来是 元祖是1,q:1字典是空的

还是十脸懵逼(我内心在想谁没事解包玩啊!!!能用就完事了)

说说迭代器吧?

迭代器 就要说可迭代对象了。

他说了很多包括int

我说Int是 他说int不是。

然后我说用range 然后他说你说的有道理。

我感觉他不太满意就赶紧说

其实for循环的本质就是iter取值next遍历

还有呢?

for循环自带捕获异常 while不带

说说生成器吧

其实最简单的方式就是列表推导式的中括号改成小括号

但同时又多了一个yield 那你能说说执行原理吗?

就是当你第一次next的时候到yield停止然后返回信息但是当你下次next的时候他是从yield继续执行的

还有拓展吗?

yield又跟协成有关。

但是封装了很多层比如greenlet 和gevent 他们两个都是对yield的封装

当然gevent不支持time如果你想用打个补丁 monkey

那你知道不知道 greenlet和gevent是扩展包不是内置包

我…..十脸懵逼

进程线程和协请你简单描述一下

我说举个简单的例子吧

一个公司是就好比一个进程 每个部门又是一个线程 然后比如技术部你我都可以成为一个协成

那你说说区别吧

进程比线程安全 但是同时进程所需的资源也是庞大的。因为如果你是单进程一个进程蹦了还有很多进程

线程相对来说所耗资源比较少但是不够安全 上面也说道了如果进程崩了所有的线程都不可执行

所以现在开发都是多进程和协程 因为协程比线程所需要的资源更少

但你在选择时候也有说法 进程不共享全局变量 所以你需要注意数据的安全

线程共享全局变量但是在处理大量数据时候会出现资源竞争所以你需要加锁 互斥锁有时候会出现死锁

说说死锁吧

最简单的例子就是下标越界 在return的同时一定把锁释放不然就会发生死锁

gil全局性解释性锁有听说过吗

有!  这个是python设计之初遗留下的问题 为了保证数据安全

线程也只是并发并不是并行

并发就是当你切换线程时候gil临时解锁加到目前所执行的线程上

所以并不存在真正的并行 只是计算机切换的速度比较快而已

关系型数据库和菲关系型数据库你熟悉吗

(心里暗暗自喜终于问到强项了)

mysql的访问量每秒并发1100次

redis的访问量每秒并发可到11W次

我个人感觉redis的提出就是为了减少访问关系型数据库

索引知道吗

所以其实就是约束 举个生活中的例子

你去看电影时候 你肯定选择一些 分类也就是目录 动作 喜剧爱情 等等

索引虽然可以优化你查询速度但是同时也会增加你增删改的速度

但是利大于弊总而来说 合适的

mysql集群听说过吗

您说的是主从搭建吧 

简单来说就是 主服务器只做增删改 因为没有人会天天改密码和重复注册

从服务器做查 这样分工就很明确因为sql的访问最多就是查

优化sql语句懂吗?

举个简单例子 查询userid 

select * from user where = userid

select id * from user where =userid

选下面哪种

为什么?

如果你在小公司随便 如果数据量过大的时候 整个sql服务器 经不起你几次 select * from user

所以一定避免整表查询

is null  <> != 免了吧 这是整表查询的

多表查询你懂吗?

懂。 分组一定配合聚合函数使用不然没意义

内连接左连接右连接

都会出现笛卡尔积 虽然得到的数据是没有笛卡尔积 但是这些数据都是从笛卡尔积过滤出来的

一般取相同用的是内连接  左右用的少

即使用也是limit 避免整表查询

用的最多是子查询 

子查询是能简单概况一下吗

可以分为独立子查询和不独立子查询

一般用独立子查询

为什么

因为非独立查询会出现一个返回值

独立子查询不会

给你一个需求很简单 要你查出来一条数据 如果你用三条查询语句很轻松 一条很难

但同时又没有要求你用三条或者一条 你会选择哪种

(送分题啊)一条

为什么?

sql的并发太低

说说建表吧 三大范式知道吗

举个例子 我们每天都在上班下班坐公交车

公交车为一张表  记录 座位数 几路公交车 是否有空调

人为一张表 老年人中年人和小孩

账单为一张表 现金 支付宝 老年卡 学生卡 公交卡

然后看是否满足三大范式

1 是否够原子性

2 只描述一件事

3 表中是否存在冗余字段

谈谈表格分割吧 

千万级数据表如何分割

(又是送分题前几天我刚问了我叔 我叔在京东做后端)

就拿淘宝来说 订单表

比如淘宝是2000年成立

以18分割 2018年前查询18前这张表

2018后查询18年之后这张表 很多电商和银行的信息表都是这么存的

这只是分表

还有分库分表一说

说说看

把经常查询的放到一个库里 不经常查询的放到另一个库中

你说你写过小型服务器说说看

网络是用socket实现 处理简单并发是用的协成

截取http 请求体用的 切片os 和正则

appliction的路由是抄袭flask的装饰器实现

连接数据库是用的pymysql

有没有考虑到数据安全 

您说的是ssl认证吧。 我自己写着玩的 公司的肯定有买

sql事物用过吗 事物等级知道吗

简单来说就是一起成功一起失败 等级是四个

经典类和新试类的区别知道吗

十脸懵逼 虚心请教

经典类和新试类的继承是有区别的

一个是深度遍历一个是广度遍历

深度遍历是先深入左侧然后返回然后深入右侧返回

广度遍历是 从底层开始一个超节点一个超节点遍历

听同事说继承都不太完美 这方面我也不是很懂 

单利模式知道吗

知道 没用过

shell有接触吗 

没有如果公司有用到我相信我在入职之前就能掌握

(十脸懵逼 之后有自己学了shell)

运维呢?

(十脸懵逼)

木有 

java有接触吗

最近正在看c++和java 入职前肯定能掌握java基础

如果公司需要入职前能掌握

我这边的项目主要是开发跟运维有关的

我这边差不多问完了

你是否愿意来杭州工作?

(那个程序员不愿意去阿里云即使外派我也乐意)

愿意

你还有想问我的嘛

我问了业务和工作流程

然后说了自己有把握胜任

嗯确实工作难度不大 而且你有一门语言的基础学另一门不难

他说我这边要协商一下

好的麻烦了。 

最后十分感谢您来面试我

不得不得说阿里的面试官说话真的超级有含量而且巨温柔绝不会怼你

而且非常有礼貌

最后我过了五天还没得到通知应该是被别人刷下来的 凉了

也看了shell 和一些运维

所以说java 不管你是前端后端软件开发 都要看

c++也一定要看

还有这次我面试很经常 希望大家面试还是保证乐观的心态前去

最后祝愿大家从BAT面试出来那一瞬间有着战士收刀入鞘的骄傲

 

版权声明:本文为famousday原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/famousday/p/9593928.html