面试题:简答题

2018-11-17  本文已影响0人  孙子衡

基础题

1.list1 = ['a','b','c','d','e']
print(list1[10:])
请问上边的输出结果会是什么?

答案: []  
解析:列表切片索引超出打印 空列表

以下代码输出的结果是

def outer(num):
    def inner(num1):
        return num + num1
    return inner
res = outer(10)
result = res(20)
print(result)

答案: 30 
解析:考点 闭包

数据库

1. MySQL的常用类型有哪些?

字符串类型
char    
varchar
text
数值类型 
TINYINT      
INT 
BIGINT
DECIMAL
日期和时间类型
DATE         YYYY-MM-DD 1000-01-01  ->  9999-12-31
TIME         HH:MM:AA
DATETIME  YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:00 ->9999-12-31 23:59:59

2. MySQL的char varchar text的区别?

•   char  定长字符串 长度范围是 0-255字节
•   varchar 变长字符串 长度范围 0-65535 字节 mysql5.0之前 最大长度为255
•   text  长文本数据 长度范围 0-65535字节 与varchar的区别是不能设置默认值

3.如何对查询语句进行优化

•   开启慢查询日志
•   通过慢查询日志找到执行较慢的sql语句
•   使用 explain 或 desc 具体分析sql语句

优化的方案:
•   通过使用或建立索引提高sql的执行效率
•   1,给经常作为查询条件的字段添加索引
•   2,添加索引的字段,尽量保持一定的唯一性,
•   3,在使用索引时,注意类型,防止出现有索引,用不上
•   4,注意在使用like模糊查询时,如果%或_出现在前面,则用不上索引

4.为什么以下SQL语句在执行时不能命中phone的索引?

解读:
多数情况下的手机号字段都是使用字符串类型进行存储,因为普通的int类型最大的数值为4 294 967 295(就是说存不了11位数字),而且推荐使用varchar(20)
1,有可能出现国家代号如+86
2,手机号通常不会用来做运算
因此上题sql语句不能命中phone的索引主要原因是因为 phone是字符串类型,而sql语句中的phone给的是数字类型
所以是类型错误,导致sql语句不能命中phone的索引

5.NoSQL了解么,和关系数据库的区别?

关系型数据库:
•   高度组织化结构化数据
•   结构化查询语言(SQL)
•   数据和关系都存储在单独的表中。
•   事务,join关联查询,
Nosql数据库:
•   非结构化的存储。
•   没有声明性查询语言
•   支持高并发
•   基本支持分布式,易于扩展,可伸缩

6. redis有几种常用存储类型?

字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型


爬虫题

遇到过哪些反爬的案例,分别是如何解决的(不限一种

答案:
BAN USERAGENT很多的爬虫请求头就是默认的一些很明显的爬虫头python-requests/2.18.4,诸如此类,当运维人员发现携带有这类headers的数据包,直接拒绝访问,返回403错误
解决方法:直接r=requests.get(url,headers={‘User-Agent':'Baiduspider'})把爬虫请求headers伪装成百度爬虫或者其他浏览器头就行了。
拓展: BAN REFERER
西刺代理,今日头条

BAN IP:网页的运维人员通过分析日志发现最近某一个IP访问量特别特别大,某一段时间内访问了无数次的网页,则运维人员判断此种访问行为并非正常人的行为,于是直接在服务器上封杀了此人IP。
解决方法:此种方法极其容易误伤其他正常用户,因为某一片区域的其他用户可能有着相同的IP,导致服务器少了许多正常用户的访问,所以一般运维人员不会通过此种方法来限制爬虫。不过面对许多大量的访问,服务器还是会偶尔把该IP放入黑名单,过一段时间再将其放出来,但我们可以通过分布式爬虫以及购买代理IP也能很好的解决,只不过爬虫的成本提高了。
boss 直聘,伯乐在线

BAN COOKIES:服务器对每一个访问网页的人都set-cookie,给其一个cookies,当该cookies访问超过某一个阀值时就BAN掉该COOKIE,过一段时间再放出来,当然一般爬虫都是不带COOKIE进行访问的,可是网页上有一部分内容如新浪微博是需要用户登录才能查看更多内容。
解决办法:控制访问速度,或者某些需要登录的如新浪微博,在某宝上买多个账号,生成多个cookies,在每一次访问时带上cookies
需要登录才能访问的网站,拉勾网等

验证码验证:当某一用户访问次数过多后,就自动让请求跳转到一个验证码页面,只有在输入正确的验证码之后才能继续访问网站
解决办法:python可以通过一些第三方库如(pytesser,PIL)来对验证码进行处理,识别出正确的验证码,复杂的验证码可以通过机器学习让爬虫自动识别复杂验证码,让程序自动识别验证码并自动输入验证码继续抓取
微信公众号文章爬取,豆瓣登录等

javascript渲染:网页开发者将重要信息放在网页中但不写入html标签中,而浏览器会自动渲染<script>标签中的js代码将信息展现在浏览器当中,而爬虫是不具备执行js代码的能力,所以无法将js事件产生的信息读取出来
解决办法:通过分析提取script中的js代码来通过正则匹配提取信息内容或通过webdriver+phantomjs直接进行无头浏览器渲染网页。
今日头条,淘宝列表页面等
 ajax异步传输:访问网页的时候服务器将网页框架返回给客户端,在与客户端交互的过程中通过异步ajax技术传输数据包到客户端,呈现在网页上,爬虫直接抓取的话信息为空
解决办法:通过fiddler或是wireshark抓包分析ajax请求的界面,然后自己通过规律仿造服务器构造一个请求访问服务器得到返回的真实数据包。
猎聘网,雪球网,手机版微博等

进程,线程和协程的定义以及区别?

答案:
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的单位。
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属于一个进程的其他的线程共享进程所拥有的全部资源。
协程是一种程序组件,是由子例程(过程、函数、例程、方法、子程序)的概念泛化而来的,子例程只有一个入口点且只返回一次,而协程允许多个入口点,可以在指定位置挂起和恢复执行。

进程之间不共享任何状态,进程的调度由操作系统完成,每个进程都有自己的独立的内存空间,进程间的通讯主要是通过信号传递的方式来实现的,实现的方式有多种,信号量,管道,事件等,任何一种方式的通讯效率都需要通过内核,导致通讯效率比较低。由于是独立的内存空间,上下文切换的时候需要保存先调用栈的信息,CPU各寄存器的信息,虚拟内存,以及打开的相关句柄等信息,所以导致上下文进程间切换开销很大,通讯麻烦.

线程之间共享变量,解决了通讯麻烦的问题,但对变量的访问需要锁,线程的调度主要也是有操作系统完成,一个进程可以拥有多个线程,但是其中每个线程会共享父进程向操作系统申请资源,这个包括虚拟内存,文件等,由于是共享资源,所以创建线程所需要的系统资源占用比进程小很多,相应的可创建的线程数量也变得相对多很多。线程时间的通讯除了可以使用进程之间通讯的方式之外还可以通过共享内存的方式进行通信,所以这个速度比通过内核要快很多。另外在调度方面也是由于内存是共享的,所以上下文切换的时候需要保存的东西就相对少一些,这样一来上下文切换也变得高效

协程的调度完全由用户控制,一个线程可以有多个协程,用户创建了几个线程,然后每个线程都是循环按照指定的任务清单顺序完成不同的任务,当任务被堵塞的时候执行下一个任务,当恢复的时候再回来执行这个任务,任务之间的切换只需要保存每个任务的上下文内容,就像直接操作栈一样的,这样就完全没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快;另外协程还需要保证是非堵塞的且没有相互依赖,协程基本上不能同步通讯,多采用异步的消息通讯,效率比较高。

一个线程可以创建和销毁另一个线程,同一个进程中的多个线程之间可以并发执行。相对进程而言,线程是一个更加接近执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列

进程与线程的主要差别在于它们是不同的操作系统的资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其他进程产生影响,而线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
1)一个程序至少有一个进程,一个进程至少有一个线程。
2)线程的划分尺度小于进程,使得多线程程序的并发性高。
3)另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
4)线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口,顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
5)从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时线程适合于在SMP机器上运行,而进程则可以跨机器迁移

一般将进程定义为一个正在运行的程序的实例。我们在任务管理器重所看到的每一项,就可以理解为一个进程,每个进程都有一个地址空间,这个地址空间里有可执行文件的代码和数据,以及线程堆栈等。一个程序至少有一个进程。进程可以创建子进程,创建的子进程可以和父进程一起工作,也可以独立运行。
而线程是隶属于进程的,也就是说,线程是不能单独存在的,线程存在于进程中。每个进程至少有一个主线程,进程里的线程就负责执行进程里的代码,这也叫做进程的“惰性”。线程所使用的资源是它所属的进程的资源。线程也有自己的资源,主要组成部分就是一些必要的计数器和线程栈,占用的资源很少。我们可以理解为进程就是个容器,而线程才是真正干活的。线程可以在内核空间实现,也可以在用户空间实现。

Http与Https的区别是什么?

•       HTTP 的URL 以http:// 开头,而HTTPS 的URL 以https:// 开头
•       HTTP 是不安全的,而 HTTPS 是安全的
•       HTTP 标准端口是80 ,而 HTTPS 的标准端口是443
•       在OSI 网络模型中,HTTP工作于应用层,而HTTPS 的安全传输机制工作在传输层
•       HTTP 无法加密,而HTTPS 对传输的数据进行加密
•       HTTP无需证书,而HTTPS 需要CA机构颁发的SSL证书
•   HTTP全称是Hyper  Text  Transfer Protocol,中文全称为超文本;
•   HTTPS全称是Hyper Text  Transfer Protocol over Secure Socket Layer,也就是说比HTTP多了安全层,通俗的讲来说就是HTTP的安全版;

常用的HTTP方法有哪些

答案:
★GET: 请求页面,并返回内容
★POST:大多用于提交表单或上传文件,数据包含在请求体中
PUT: 传输文件,报文主体中包含文件内容,保存到对应URI位置。
HEAD: 获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效。
DELETE:请求服务器删除指定的页面,与PUT方法相反
CONNECT:把服务器当做跳板,让服务器代替客户端访问其他网页
OPTIONS:循序客户端查看服务器的性能
TRACE:回显服务器收到的请求,主要用于测试或诊断

说一说redis-scrapy中的redis的作用

答案:redis最主要的作用是起到了全局队列的作用。

web题

jquery中$.get()提交 和$.post()提交有区别吗

相同点:
    都是异步请求的方式来获取    服务端的数据;
异同点:
1、请求方式不同:$.get() 方法使用GET方法来进行异步请求的。$.post() 方法使用POST方法来进行异步请求的。
2、参数传递方式不同:get请求会将参数跟在URL后进行传递,而POST请求则是作为HTTP消息的实体内容发送给Web服务器的,这种传递是对用户不可见的。
3、数据传输大小不同:get方式传输的数据大小不能超过2KB 而POST要大的多
4、安全问题: GET 方式请求的数据会被浏览器缓存起来,因此有安全问题。

CSRF是什么,django是如何避免的


一,CSRF是什么:
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用
二,CSRF可以做什么:
CSRF跨站请求伪造攻击,跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:
攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作.
比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。  

三,CSRF攻击攻击原理及过程如下:
其中Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合法用户。
       1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
       2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
       3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
       4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
       5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

四,CSRF漏洞防御
现在业界对CSRF的防御,一致的做法是使用一个Token(Anti CSRF Token)。
例:
用户访问某个表单页面。
服务端生成一个Token,放在用户的Session中,或者浏览器的Cookie中。
在页面表单附带上Token参数。
用户提交请求后, 服务端验证表单中的Token是否与用户Session(或Cookies)中的Token一致,一致为合法请求,不是则非法请求。
这个Token的值必须是随机的,不可预测的。由于Token的存在,攻击者无法再构造一个带有合法Token的请求实施CSRF攻击。另外使用Token时应注意Token的保密性,尽量把敏感操作由GET改为POST,以form或AJAX形式提交,避免Token泄露。
Django中也提供了CSRF的防御保护方法
可以在HTML的吧form表单中加入token
<form method="post">
     {% csrf_token %}
</form>

XSS是什么?

XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。
如何防范XSS攻击?
1,过滤用户输入的html标签内容
2,对用户输入的html标签进行编码(转义)
Django中默认对所有输出的html标签内容进行转义

session和cookie的联系与区别;session为什么说是安全的

key就是sessionid,需要存储在客户端的cookie中
而value值会被记录在服务器端(如数据库,内存,文件登陆)
每一次用户请求时,会在cookie中携带sessionid与服务器中存储的session进行对应
因此.session和cookie的区别在于,session存在服务器端,cookie存在客户端,而session的存储与操作需要依赖客户端的cookie,而由于session数据存储在服务端,不会轻易被获取,因此说session是安全的

HTTP协议是无状态的:
•   每次请求都是一次新的请求,不会记得之前通信的状态
•   客户端与服务器端的一次通信,就是一次会话
•   实现状态保持的方式:在客户端或服务器端存储与会话有关的数据
•   状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据
•   注意:不同的请求者之间不会共享这个数据,与请求者一一对应
Cookie
•    存储在用户的浏览器中,
•    不要存储敏感信息,不安全
•    内容有限,格式有限,
Session
•   存储在服务器(文件,数据库,缓存|内存)
•   每一个数据产生一个key session_id 就存储在浏览器的cookie
•   数据存在服务器,不容易被暴露信息

Django中如何读取和保存session

#session设置
 request.session[key] = value
#session获取
 request.session.get(key,default=Node)
#session删除
# 删除单个key 不存在时报错
 del request.session['a'] 
#清除所有会话,但不会删除数据
 request.session.clear() 
#删除当前的会话数据
 request.session.flush()

Django中查询queryset时什么情况下用Q?

关键字参数查询 - 输入filter()等 - 是“AND”编辑在一起。如果需要执行更复杂的查询(例如,带OR语句的查询),则可以使用。Q objects
例如需要进行复合条件的查询的SQL语句如下:
select * from goods where name like '%好看%' or title like '%好看%'; 
    
使用Q就可以写成:
from django.db.models import Q
obs = Goods.objects.filter(Q(name__contains='好看')|Q(title__contains='好看'))


Django中的Q对象还有哪些用法?

Q对象不止用于 or,还能把and和or的语句联合在一起使用
例如以下sql语句:
SELECT * from polls WHERE question LIKE 'Who%'
    AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')
使用Q对象同样可以
Poll.objects.get(
    Q(question__startswith='Who'),
    Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)

Django框架的优缺点

•   被官方定义为完美主义者框架,提供一站式的解决方案
•   从模板、视图,模型ORM、Session等等都分配好了
•   提供了admin自动后台管理,测试,表单等功能
•   作为web框架太重了,很多不用的组件和应用也都之间在框架中安装了
•   能开发小应用,但总会有“杀鸡焉用牛刀”的感觉
•   框架中的组件之间耦合度过高,不易拆分使用(例如数据验证需要表单配合...)

Flask框架的优缺点

•   Flask只提供了一些核心功能,非常简洁优雅.被称为python中的'微'框架
•   自由、灵活,可扩展性强.入门简单,
•   非常适用于开发web服务的API
•   使用BluePrint架构开发大型网站无压力
•   第三方库的选择面广,开发时可以结合自己最喜欢用的轮子,也能结合最流行最强大的Python库

请描述 MVC和MVT

MVC:
•   M全拼为Model,主要封装对数据库层的访问,对数据库中的数据进行增、删、改、查操作。
•   V全拼为View,用于封装结果,生成页面展示的html内容。
•   C全拼为Controller,用于接收请求,处理业务逻辑,与Model和View交互,返回结果。
MVT:
•   M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。
•   V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答。
•   T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html。

MVC的核心思想

程序解耦,让不同的代码块之间降低耦合,增强代码的可扩展和可移植性,实现向后兼容。


数据分析

Python数据分析通常使用的环境、工具和库都有哪些?库功能是什么?

基础环境一般为Anaconda,
编辑器多用Ipython或JupyterNotebook,
常用库有:
    Numpy:数值计算
    Matplotlib:数据可视化
    Pandas:数据预处理和数据分析
    scikit-learn:机器学习算法建模预测

数据分析的一般流程是什么

基本流程
提出问题
准备数据
分析数据
洞察结论

详细流程
需求层
    目标确定
数据层
    数据获取
    数据规整(清洗)
分析层
    描述性分析
        指标计算
        数据可视化
    探索性分析
        建模分析
        模型验证
        迭代优化
输出层
    洞察结论,成果可视化,报告撰写,应用成果
上一篇下一篇

猜你喜欢

热点阅读