面试题汇总(五)
用+号拼接
2 字符串a='not 404 found 张三 99 深圳',每个次中间是空格,用正则过滤掉英文和数字,最终输出'张三,深圳'
import re a = "not 404 found 张三 99 深圳" L = a.split(" ") # ['not', '404', 'found', '张三', '99', '深圳'] res = re.findall("\d+|[a-zA-Z]+", a) # ['not', '404', 'found', '99'] tmp = [item for item in L if not item in res] # ['张三', '深圳'] print(" ".join(tmp))
3 给定一个整数数组 nums, 其中恰好有两个元素之出现一次,其余所有元素均出现两次,找出只出现一次的那两个元素
def singleNumber(nums): d={} l=[] for i in nums: if i in d: d[i]+=1 else: d[i]=1 for k,v in d.items(): if v==1: l.append(k) return l
4 请写出一段python代码实现删除一个list里面的重复元素
s=set(list),然后再list(s)
5 python中深浅拷贝的区别
浅拷贝:拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。也就是,把对象复制一遍,但是该对象中引用的其他对象我不复制
深拷贝:外围和内部元素都进行了拷贝对象本身,而不是引用。也就是,把对象复制一遍,并且该对象中引用的其他对象我也复制。
6 python中is 和==的区别
is检查两个对象是否是同一个对象,而==检查他们是否相等.
7 简述一下观察者模式
观察者模式是说你有一个观察者列表,这个列表中的函数或者某种功能都在观察某个事件的发生,一旦发生,这些函数或者功能就会自动执行,
8 简述python多进程,多线程的区别以及适用场景
多进程 数据共享复杂,需要用IPC;数据是分开的,同步简单 占用内存多,切换复杂,CPU利用率低 创建销毁、切换复杂,速度慢 编程简单,调试简单 进程间不会互相影响 适应于多核、多机分布式;如果一台机器不够,扩展到多台机器比较简单 多线程 因为共享进程数据,数据共享简单,但也是因为这个原因导致同步复杂 占用内存少,切换简单,CPU利用率高创建销毁、切换简单,速度很快 编程复杂,调试复杂 一个线程挂掉将导致整个进程挂掉 适应于多核分布式
1)需要频繁创建销毁的优先用线程 2)需要进行大量计算的优先使用线程 3)强相关的处理用线程,弱相关的处理用进程 4)可能要扩展到多机分布的用进程,多核分布的用线程 5)都满足需求的情况下,用你最熟悉、最拿手的方式
9 简述同步异步模型
函数或方法被调用的时候,调用者是否得到最终的结果。
直接得到最终结果的结果,就是同步调用。(打饭模型,打饭不打好不走开,直到打饭给我后才离开)
不直接得到的最终的结果,就是异步调用。(打饭,不会一直等着,会时不时的过来看看,打完了把饭拿走,异步不保证多长时间打完了饭)
10 举例熟悉的python web框架并说明
-
Django
Django是一个开源的Web应用框架,由Python写成,支持许多数据库引擎,可以让Web开发变得迅速和可扩展,并会不断的版本更新以匹配Python最新版本,如果是新手程序员,可以从这个框架入手。 2、Flask
?Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。
?Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。
?Flask 很轻,花很少的成本就能够开发一个简单的网站。非常适合初学者学习。Flask 框架学会以后,可以考虑学习插件的使用。例如使用 WTForm + Flask-WTForm 来验证表单数据,用 SQLAlchemy + Flask-SQLAlchemy 来对你的数据库进行控制。
3、Tornado
?Tornado是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。
?得利于其 非阻塞的方式和对epoll的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个 理想框架。
11如果custname字符串的编码格式为utf-8,如何将custname的内容转化为gbk18030的字符串
12 r,r+,rb,rb+文件打开模式的区别
r 只读模式 r+ 读写,可以写,内容在文件最开头 rb 读取一些非文本形式,二进制形式文件用到 rb+ 二进制读写
13 Jquery的美元符号$有什么作用
在 jQuery 中,美元符号($)仅仅是 jQuery 的别名,就代表了jQuery对象,例如,$("div") 和 jQuery("div")是等价的。 注意两点: 1、即使不使用 $ 也能保证jQuery的所有功能性。 2、为了避免与其他javascript库的冲突,可以释放 jQuery 对 $ 变量的控制,同时为 jQuery 变量规定新的自定义名称。例如: 执行 var jq=$.noConflict(); 后,$ 将不再控制当前的jQuery, 而是让渡给了jq变量,此时jq("div") 和 jQuery("div")是等价的
数据库相关
1、列举几种表连接方式,有什么区别,笛卡尔积是什么?
''' 内连接、自连接、外连接(左、右、全)、交叉连接 内连接:只有两个元素表相匹配的才能在结果集中显示。 外连接: 左外连接:左边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。 右外连接:右边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。 全外连接:连接的表中不匹配的数据全部会显示出来。 交叉连接: 笛卡尔效应,显示的结果是链接表数的乘积。
'''
2、数据库表结构需要变动的时候的数据库设计原则是什么?
''' 1:表必须要有主键。 2:一个字段只表示一个含义。 3:总是包含两个日期字段:gmt_create(创建日期),gmt_modified(修改日期),且这两个字段不应该包含有额外的业务逻辑。 4:MySQL中,gmt_create、gmt_modified使用DATETIME类型。 5:禁止使用复杂数据类型(数组,自定义类型等)。 6: MySQL中,附属表拆分后,附属表id与主表id保持一致。不允许在附属表新增主键字段。 7: MySQL中,存在过期概念的表,在其设计之初就必须有过期机制,且有明确的过期时间。过期数据必须迁移至历史表中。 8: MySQL中,不再使用的表,必须通知DBA予以更名归档。 9: MySQL中,线上表中若有不再使用的字段,为保证数据完整,禁止删除。 10: MySQL中,禁止使用OCI驱动,全部使用THI驱动。 '''
3、简述mysql、redis、mongodb、memcache等数据源的特点,以及其适用场景
'''
MongoDB: ---非关系型数据库,属于文档型数据库。由数据库、集合、文档对象三个层次组成。数据具备自述性,呈现分层的树状数据结构,数据结构由键值(key=>value)对组成! ---适合场景:事件的记录,内容管理或者博客平台等等。
MySQL: ---关系型数据库。在不同的引擎上有不同 的存储方式。查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高。 ---适用场景:1、Web网站系统2:日志记录系统3:数据仓库系统4:嵌入式系统
Redis: ---非关系型数据库。Redis数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的LRU算法删除数据。 ---应用场景:偏重于进程顺序写入,虽然支持集群,也仅限于主-从模式 1.配合关系型数据库做高速缓存 2.缓存高频次数据,降低数据库io 3.分布式架构,做session共享
Memcache: ---不能持久化存储
,存储数据有限制:1M 【大于1M,认为就行分割】(内存碎片),mm存储数据只能key-value,集群数据没有复制和同步机制 【崩溃不会影响程序,会从数据库中取数据】,内存回收不能及时 ---应用场景:1.分布式应该,2.数据库前段缓存,3.服务器间数据共享。
'''
4、当MySQL查询遇到性能瓶颈的时候,如何优化(各种维度)
''' 硬件、系统配置、数据库表结构、SQL及索引 优化成本:硬件>系统配置>数据库表结构>SQL及索引
优化效果:硬件<系统配置<数据库表结构<SQL及索引 https://www.jianshu.com/p/4af41b682e06
'''
5、当MongoDB查询遇到性能瓶颈的时候,如何排查优化
''' 1.在查询条件、排序条件、统计条件的字段上选择创建索引,可以显著提高查询效率。
2.用$or时把匹配最 多 结果的条件放在最前面,用$and时把匹配最 少 结果的条件放在最前面。
3.使用limit()限定返回结果集的大小,减少数据库服务器的资源消耗,以及网络传输的数据量。
4.尽量少用$in,而是分解成一个一个的单一查询。尤其是在分片上,$in会让你的查询去每一个分片上查一次,如果实在要用的话,先在每个分片上建索引。
5.尽量不用模糊匹配查询,用其它精确匹配查询代替,比如$in、$nin。
6.查询量大、并发大的情况,通过前端加缓存解决。
7.能不用安全模式的操作就不用安全模式,这样客户端没必要等待数据库返回查询结果以及处理异常,快了一个数量级。
8.MongoDB的智能查询优化,判断粒度为query条件,而skip和limit都不在其判断之中,当分页查询最后几页时,先用order反向排序。
9.尽量减少跨分片查询,balance均衡次数少。
10.只查询要使用的字段,而不查询所有字段。
11.更新字段的值时,使用$inc比update效率高。
12.apped collections比普通collections的读写效率高。
13.server-side processing类似于SQL查询的存储过程,可以减少网络通讯的开销。
14.必要时使用hint()强制使用某个索引查询。
15.如果有自己的主键列,则使用自己的主键列作为id,这样可以节约空间,也不需要创建额外的所以。
16.使用explain,根据exlpain plan进行优化。
17.范围查询的时候尽量用$in、$nin代替。
18.查看数据库查询日志,具体分析的效率低的操作。
19.mongodb有一个数据库优化工具database profiler,能够检测数据库操作的性能。可以发现query或者write操作中执行效率低的,从而针对这些操作进行优化。
20.尽量把更多的操作放在客户端,当然这就是mongodb设计的理念之一。
'''
部署类
1、简述一下docker,以及适用场景
''' docker: https://www.cnblogs.com/wangjuns8/p/6407929.html ---Docker是一个基于容器技术的系统,一个为开发人员和系统管理员提供的分布式应用程序的开放平台 特点:开箱即用,快速部署,可移植性强,环境隔离 ---适用场景:1. 简化配置2. 代码流水线管理3. 提高开发效率4. 隔离应用5. 整合服务器6. 调试能力7. 多租户环境8. 快速部署 '''
2、简述一下K8S,以及里面常用的组件功能
''' Kubernetes: https://www.cnblogs.com/linuxk/p/10291178.html ---是一个开源的,用于管理云平台中多个主机上的容器化的应用,它的目标是让部署容器化的应用简单并且高效,Kubernetes提供了应用部署,规划,更新,维护的一种机制 组件: ---Master组件: Node组件:主要负责提供容器的各种依赖环境,并接受Master管理 核心附件:由第三方提供的特定应用程序 '''
3、当NGINX代理websocket的时候,经常会遇到定时断开的问题,请问如何解决?
''' 1、只要配置nginx.conf的对应localhost里面的这几个参数就好 proxy_connect_timeout; proxy_read_timeout; proxy_send_timeout; 2、发心跳包,原理就是在有效地再读时间内进行通讯,重新刷新再读时间(配置的位置为localhost,给出简略地址) http { server { location / { root html; index index.html index.htm; proxy_pass http://webscoket; proxy_http_version 1.1; proxy_connect_timeout 4s; #配置点1 proxy_read_timeout 60s; #配置点2,如果没效,可以考虑这个时间配置长一点 proxy_send_timeout 12s; #配置点3 proxy_set_header Upgrade $http_upgrade; #这是webSocket的配置 proxy_set_header Connection "Upgrade"; #这是webSocket的配置 } } }
'''
4、nginx是否能实现热重启,并简述原因
'''
'''
5、当不使用docker集群时,如何保证程序进程不会被杀掉并持续提供服务?或者简述supervisor
'''
'''
调试类
1、当借口开发完成是,与前端沟通联调需要注意哪些方面?
2、对于产品制作的用来描述功能的ue文档,如何拆解成可以开发的功能?在这方面需要注意那些?
3、当有一个新功能血药开发的时候,如何规划,并且如何协调?
4、如果你作为小队管理者,如何分派工作
自我认知与职业发展
1、您是否有您自己的职业规划,是否可以简单描述一下 2、您认为您擅长做那些工作、不上场那些工作? 3、您希望在我司获得那些成长?当从我司离职的时候您希望成为什么样的人?
求打印test和list_new的值。 test = [{'day':1,'no':101},{'day':2,'no':301}, {'day':3,'no':3}, {'day':1,'no':401},{'day':3,'no':201}] list_new = list(test)
for i in test: if i['no']<=300: i['type'] = 'FB' else: i['type'] = 'BK'
list_new1 = 7
list_new.pop()
print(test) print('--------------------------') print(list_new)
[{'day': 1, 'no': 101, 'type': 'FB'}, {'day': 7, 'no': 301, 'type': 'BK'}, {'day': 3, 'no': 3, 'type': 'FB'}, {'day': 1, 'no': 401, 'type': 'BK'}, {'day': 3, 'no': 201, 'type': 'FB'}]
[{'day': 1, 'no': 101, 'type': 'FB'}, {'day': 7, 'no': 301, 'type': 'BK'}, {'day': 3, 'no': 3, 'type': 'FB'}, {'day': 1, 'no': 401, 'type': 'BK'}]
问题1】编写shell脚本将/SB1DATA目录下大雨10k的文件转移到/SB1BAEOD1目录下
vim first.sh
#! /bin/bash cd /SB1DATA for i in ls -l |awk '{if($5>10240){print $9}}'
do mv $i/SB1BAEOD1 echo "done!" done guoch=date +%Y%m%d
mkdir ${guoch}
================================================