1.怎样解决引入redis产生的缓存穿透问题?
A. 采用布隆过滤器,将所有可能存在的数据哈希到 一个足够大的bitmap中,一个一定不存在的数据 会被 这个bitmap拦截掉,从而避免了对底层存储 系统的查询压力。
B. 使用mutex,在缓存失效的时候使用缓存工具的某些 带成功操作返回值的操作,去set一个mutex key, 当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。
C. 用加锁或者队列的方式保证来保证不会有大量的线 程对数据库一次性进行读写,从而避免失效时大量 的并发请求落到底层存储系统上。
D. 将缓存失效时间分散开,比如我们可以在原有的失效时间基础 上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期 时间的重复率就会降低,就很难引发集体失效的事件。
答案:A
[B选项是用来解决缓存击穿,C、D选项是用来解决缓存雪崩]
2.判断值在0-10之间的代码,正确的是
A. if num >= 0 and num <= 10:
B. if num >= 0 or num <= 10:
C. if num >= 0 && num <= 10:
D. if num >= 0 || num <= 10:
答案:A
3.下列与标准化方法有关的说法中错误的是()
A. 离差标准化简单易懂,对最大值和最小值敏感度不高
B. 标准差标准化是最常用的标准化方法,又名零一均值标准化
C. 小数定标标准化实质上就是将数据按照-定的比例缩小
D. 多个特征的数据的K-Means聚类不需要对数据进行标准化
[离差标准化,是对原始数据的线性变换,使结果落到[0,1]区间,这种方法有一个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义,因此对最大值和最小值比较敏感。]
4.将字符串s中的字母a替换为字母b,以下代码正确的是
A. s.swap('b', 'a')
B. s.replace('a','b')
C. s.match('b','a')
D. s.replace('b','a')
答案:B
[replace()方法替换,第一个参数为被替换的,第二个参数为替换的值]
5.web开发中,以下做法正确的是( )
A. 后端手机验证码验证通过后,跳转到设置新密码页面,https+post提交用户名、新密码,设置新密码完成密码重置功能
B. 点击重置密码按钮,系统发送一条重置密码的链接到邮箱,格式为:http://www.xxx.com/password/reset?key=1563785498&username=045g6hgd4771h909uiwq5k001923r2p6(其中key是unix时间戳,username是用户名的md5值)
C. 某网站的cookie生成方法为:固定字符串+用户名+时间戳的base64编码
D. 以上都不对
答案:D
[A选项,验证码校验和重置密码是不能分开两步提交的,容易绕过;B的问题主要是无法避免数据篡改,需要增加签名sign=f(param + secret)防止数据被篡改;其次md5加密的用户名并不知道是哪个用户,另外敏感数据应该用https;C项base64可逆,解密之后破解规则,可以伪造登录状,无法避免数据篡改]
6.小明在用python实现文件上传功能时,做了如下操作,其中做法不恰当的是( )
A. 通过黑名单验证上传的文件后缀名称
B. 设置上传目录不可解析
C. 重命名上传的文件名称
D. 使用单独的服务器存放上传的文件
答案:A
[黑名单是危险易绕过的,可以使用文件后缀名白名单验证和随机文件名称的方式]
7.阅读下面Flask代码,以商品(good.py)的模块代码为例, 可能会抛出异常的地方是 ( )
1. # from flask import Blueprint
2.
3. good_blueprint = Blueprint( 'good', __name__, url_prefix='/api/good' )
4.
5. @good_blueprint.route('/')
6. def getGoods():
7. pass
8.
9. @good_blueprint.route('/<catagory_id>')
10. def getGoodsInCatagory(<catagory_id>):
11. pass
A. 第3行
B. 第5行
C. 第9行
D. 第10行
答案:D
[本题考查代码的规范和参数使用在实际项目的易错处, D第10行中的方法中的参数不应该用“<>”, 默认不写或者以元组的形式传入。]
8.以下应对反爬虫的策略中错误的是( )
A. 对于基本网页的抓取可以自定义headers,添加 headers的数据,代理来解决
B. 对部分数据进行加密的可以使用查找接口的方式进行抓取。
C. 针对动态网页的可以使用selenium+phantomjs进行抓取
D. 对于限制ip抓取的可以使用多个代理ip进行抓取,轮询使用代理
答案:C
[查找接口的方式不能解决数据加密,只适用于动态网页的抓取]
9.list1 = list(range(10))
print(list1[0:10:2])
以上代码输出的结果是
A. [0,2,4,6,8]
B. [0,1]
C. [0,2]
D. [0.1.2.3.4.5.6.7.8,9]
答案:A
[下标从0到10,步长为2]
10.L = [1, 23, "hello", 1] ,L的数据类型是
A. List
B. Array
C. Dictionary
D. Tuple
答案:A
[整体是列表,列表中存储不同的数据]
11.Flask响应流的实现原理就是通过Python的生成器,也就是大家所熟知的yield的表达式,将yield的内容直接发送到客户端。下面有个简单实现:
from flask import Flask, Response
app = Flask(__name__)
@app.route('/large.csv')def generate_large_csv():
def generate():
for row in range(50000):
line = []
for col in range(500):
line.append(str(col))
if row % 1000 == 0:
print 'row: %d' % row
yield ','.join(line) + '\n'
return Response(generate(), mimetype='text/csv')
这样写的主要好处是( )
A. 代码简洁易懂
B. 代码节省内存
C. 代码安全可靠
D. 代码行数较少
答案:B
[本题考查生成器的优点和实际使用的用途, 文件上传或导出时最明显的是节省内存,无论多大的文件进行处理时一次只处理一行, 性能得到提升。]
12.a = [1,2,3,None,(),[],]
print(len(a))
以上代码输出结果为
A. 4
B. 5
C. 6
D. syntax error
答案:C
[列表中元素可以存储任意数据类型]
13.Numpy中能够在[a,b)范围内取一个随机数的表达式是( )
A. b * numpy.random.random() + a
B. b * numpy.random.random() + a + 1
C. (b - a) * numpy.random.random() + a
D. (b - a - 1) * numpy.random.random() + a + 1
答案:C
[随机生成函数np.random.uniform(low, high, size):可以从一个均匀分布[low,high)中随机采样,定义域是左闭右开。]
14.下列关于Django的select_related和prefetch_related的描述中说法正确的是( )
A. select_related和只有prefetch_related都是针多对一和多对多关系进行优化
B. select_related通过JOIN语句,在SQL查询内解决问题
C. 因为select_related()的效率通常比prefetch_related高,所以应该尽可能的用select_related()解决问题
D. 只有select_related()之前的prefetch_related()是有效的
答案:C
[选项A,select_related是针对一对一和多对一关系的优化; 选项B,select_related使用SQL的JOIN语句进行优化,通过减少SQL查询的次数来进行优化、提高性能;prefetch_related是通过JOIN语句,在SQL查询内解决问题; 选项D,只有prefetch_related()之前的select_related()是有效的。]
15.有Django model如下:
class Student(models.Model):
name = models.CharField(max_length=20)
age = models.IntegerField()
hobbies = models.ManyToManyField(Hobby)
class Hobby(models.Model):
name = models.CharField(max_length=20)
其中Student与Hobby(爱好)是多对多的关系,则语句Hobby.objects.annotate(student_num=Count('student‘)).order_by('-student_num')[:5]的含义是( )
A. 统计爱好最多的5个学生
B. 统计爱好最少的5个学生
C. 统计最受学生欢迎的5个爱好
D. 统计最不受学生欢迎的5个爱好
[先按爱好分组,再统计每组学生数量, 然后按每组学生数量大小对爱好降序排序后取前五个数据。]
16.关于a = b = c = 1 下列说法不正确的是
A. 三个变量被分配到不同的内存空间上
B. 三个变量被分配到相同的内存空间上
C. 三个变量中只有a的值为1
D. 三个变量中只有c的值为1
答案:ACD
[三个变量的值都为1,指向同一个内存地址]
17.Python中,关于字典以下哪个代码是不正确的
A. {'item1'=>1, 'item2'=>2}
B. {'item1': 1, 'item2': 2}
C. ('item1'=>1, 'item2'=>2)
D. ('item1': 1, 'item2': 2)
答案:ACD
[字典使用{}创建,使用逗号分隔key:value]
18.WEB开发中,以下选项中能够在一定程度上防御CSRF攻击的策略是( )
A. 将cookie设置为HttpOnly
B. 过滤用户输入的 检查用户输入的内容中是否有非法内容
C. 验证 HTTP Referer 字段
D. 在请求地址中添加 token 并验证
E. 在 HTTP 头中自定义属性并验证
[CSRF通常从第三方网站发起,被攻击的网站无法防止攻击发生,只能通过增强自己网站针对CSRF的防护能力来提升安全性。答案中的四个选项均可减轻CSRF攻击的风险。]
19.以下创建字典的语句正确的是
A. {}
B. dict([1,2],[3,4])
C. dict(([1,2],[3,4]))
D. {1:2}
答案:ACD
[字典结构为key:value]
20.Django在Ajax请求中提交csrfToken的方法正确的是( )
A. 将{% csrf_token %}生成的input框的value通过ajax传参来提交
B. 从获取当前页面的get请求的响应中cookie里获取csrfToken,再写入当前post请求的请求头中;
C. 手写从cookie中获取/写入csrfToken的js文件,再引入,就不需要做其他参数传递,同get请求一般;
D. 在ajax请求前加上
答案:ABCD
[方式一: django模板标签提供{% csrf_token %}在前端生成input框,如果在settings.py文件中开启了该中间件,每次post请求就需要提交django自动生成的csrfToken; 将{% csrf_token %}生成的input框的value通过ajax传参来提交; 方式二: 从获取当前页面的get请求的响应中cookie里获取csrfToken,再写入当前post请求的请求头中; 需要引入:jquery.cookie.js插件 方式三: 与方式二原理相同,手写从cooki]
网友评论