第二次考试题

时间:2022-09-13 22:30:04
=========全栈10期考试题=========
1,Python自带的数据类型。
#   -- Python3中有六个标准的数据类型
#      -- 数字,字符串,列表,元组,集合,字典
2,简述深浅拷贝。
#-- 首先我们知道Python的引用跟对象是分离的,
#     那我们的直接赋值其实就是对象的引用,也可以理解为对象取一个别名
#  -- 浅拷贝  
#         --对于可变对象而言是创建一个具有相同的类型,相同的值但id不同的对象
#            如果有子对象,这些对象和原始对象的子对象是同一个引用。
#         --对于不可变对象而言,浅拷贝只拷贝引用。
#   -- 深拷贝是拷贝对象,开辟新的内存空间,包括子对象,互不影响。
3,== 和 is 的区别。
#  -- == 比较的是value 也就是值是否相同。 is 比较的是id (内存地址)也就是是否是同一个对象。
4,*args 和 **kwargs 的区别。
# -- *args 接收n个位置参数,转化成元组。
#   -- **kwargs 接收n个关键字参数,转化成字典。
5,@staticmethod 和 @classmethod 的区别。
#   -- 两者非常的相似,具体使用上还是有细微的区别。
#      classmethod 必须使用类对象作为第一个参数,而 staticmethod 则可以不传递任何参数。
#   -- classmethod 关注对象和对象内部的属性。
6,什么是lambda表达式?它的好处?
#   -- lambda是Python的一个匿名函数,表达式为 lambda argument_list: expression
#   -- 好处是简单逻辑的时候可以省去函数定义过程,而且不用思考函数命名问题,让代码更加精简。
7,用过什么标准库和三方库。
#1、python的标准库是随着pyhon安装的时候默认自带的库;
#2、python的第三方库,需要下载后安装到python的安装目录下。不同的第三方库安装及使用方法不同。
#3、它们调用方式是一样的,都需要用import语句调用。简单的说,一个是默认自带不需要下载安装的库,一个是需要下载安装的库。它们的调用方式是一样的。
8, range 和 xrange 的区别。
# -- 用法完全相同,返回对象不同。range 返回列表, xrange返回生成器。
9,进程,线程,协程区别。
#   -- 进程 是操作系统进行资源分配和调度的基本单位,是操作系统的结构基础。每个进程都独享系统的一部分资源。
#   -- 线程是进程的一个执行单元,是CPU调度的最小单位,每个进程至少有一个线程。一个进程下多个线程共享进程所有资源。
#   -- 协程 一个线程可以开多个协程,一个进程也可以单独拥有多个协程。
#   -- 进程和线程都是同步机制,协程是异步机制。协程可以保留上一次的执行状态,
#      每次过程重入时,相当于进入上一次调用状态,协程只有在I/O密集型操作才会提高效率.
10, 查看下列的输出结果
def f(x,l=[]):
      for i in range(x):
         l.append(i*i)
      print(l)
   f(2) # [0,1]
   f(3,[3,2,1]) # [3,2,1,0,1,4]
   f(3) # [0,1,0,1,4]
11, 查看输出结果
class Parent(object):
      x = 1
   class Child1(Parent):
      pass
   class Child2(Parent):
      pass
   print(Parent.x, Child1.x, Child2.x) # 1 1 1
   Child1.x = 2
   print(Parent.x, Child1.x, Child2.x) # 1 2 1
   Child2.x = 3
   print(Parent.x, Child1.x, Child2.x) # 1 2 3
12,以下代码的输出是什么?(3分)

def multipliers():
    return [lambda x:i*x for i in range(4)]
print( [m(2) for m in multipliers() ])

   def mul():
      return [lambda x:i*x for i in range(4)]
   print [m(2) for m in mul()]  # 6 6 6 6
13, 用尽量多的方式写出单例模式。
#-- https://www.cnblogs.com/huchong/p/8244279.html
14,列表去重(不能使用集合)。
 list1 = [9,4,2,5,8,4,5,3]
   new_list = []
   for i in list1:
      if i not in new_list:
         new_list.append(i)

   new_list = {}.fromkeys(list1).keys()
15,

参考下面代码片段:(2分)

第二次考试题

请在Context类下添加完成该类的实现。

 class Context(object):
      def __enter__(self):
         print("do something before")
         return self
      def __exit__(self,exc_type,exc_val,exc_tb):
         return print("do something after")
      def do_something():
         return print("do something")
   with Context() as ctx:
      ctx.do_something()
#   python执行with-as 的时候 会调用__enter__方法,然后该函数的返回值传给as后指定的变量,
#   之后会执行with-as 下面的代码块,无论该代码块中出现了什么异常,都会在离开时候执行__exit__
 #  __exit__也可以做一些异常的监控和捕获。
16, 简述cookie 和 session。
#    -- cookie机制采用的是在客户端保持状态的方案,作用就是为了解决HTTP无状态的缺陷。
#    -- session机制采用的是一种在客户端与服务端之间保持状态的解决方案,由于采用服务器端
#      保持状态的方案在客户端也要保存标识,session机制也要借助于cookie机制达到目的。
17, 列举Linux常用命令。
#   -- ls ls-la cd touch mkdir tar rm mv .....
18, 连表查询时,inner join和left join的区别。
#   -- left/right join 有主表和从表 left join 主表就是左侧表
#      主表的数据会全部显示,从表数据只显示关联部分匹配的数据,无匹配的数据用null补全
#   -- inner join 只显示两个表关联条件匹配的数据
19,简述SQl注入的攻击原理以及如何在代码层面防止?
#   -- SQL注入就是把sql命令插入到web表单后提交到所在页面的请求,从而达到欺骗服务器执行恶意sql目的。
#      SQL注入只对sql语句的准备也就是编译过程有破坏
#   -- 代码层面 引起的主要原因在于后台写SQL语句的时候用了字符串拼接
#   -- 解决办法 1 采用预编译语句集  2,对传过来的参数进行过滤 比如正则检查是否包含非法字符等
20,分别编写一个或者多个:filter/map/reduce 的使用示例。
#   -- filter 函数是一个筛选函数参数(函数,可迭代对象) 
#      filter将传入的函数依次作用到序列的每个元素,True则返回 False则不返回。
#      list1 = [1,2,3,4,5,6,7,8,9]
#      def a(x):
#         return x%2==1
#      print(filter(a, list1)) # 返回值类型是filter对象 生成器对象
#   -- map 函数是一个计算函数 参数(函数,可迭代对象)
#      会将可迭代对象的值经过函数计算后返回
#      my_map = map(lambda x:x+1, range(10))
#      print(list(my_map)) # 返回值类型是map对象 生成器对象
#   -- reduce 函数也是一个计算函数 参数(函数,可迭代对象)
#      会将可迭代对象的值依次在函数中累计运算 Python3中需要导入
#      from functools import reduce
#      my_reduce = reduce(lambda x,y:x+y, range(10))
#      print(my_reduce) # 返回 计算后结果 45
21,django里queryset的 get,filter,方法的区别。
#   -- get返回一个对象,获取不到会报错。
#   -- filter返回一个queryset,获取不到返回None
22,django内置的缓存机制。
#   -- 缓存机制 每次有请求进来 先去看缓存是否有 是否过期 
#      如果缓存没有或者已过期 就要走视图 走数据库
#   -- django的缓存有六种
#      -- memchched缓存
#      -- 数据库缓存
#      -- 文件系统缓存
#      -- 本地内存缓存
#      -- 虚拟缓存
#      -- 自定义缓存
#   -- 应用
#      -- 全栈缓存 粒度大 中间件配置
#      -- 单独视图缓存 粒度适中 视图上方加装饰器或者在路由器配置
#   https://blog.csdn.net/Ayhan_huang/article/details/78042511

23,谈谈你对Http协议的认识。
#   -- Http 超文本传输协议,基于TCP/IP协议来传输数据
#   -- 无状态 无连接的 单向的 分为请求协议和响应协议
24,简述MVC和MTV。
#MTV,Model  Template   View
#MVC,Model  View       Controller
            
#本质上就是对目录结构的划分;
#    - django,MTV
#    - flask,MTV
25,简述django的请求的生命周期。
#wsgi------>process_request------>process_view------>process_excption------>process_template------>process_responce------>wsgi
26,django中filter和exclude的区别。
#filter是的到符合过滤的信息
#exclude和它正好相反,得到除了符合的所有信息
27,django中values 和 value_list区别。
#values  返回的是字典
#values  返回的是列表
28,简述django中间件的流程以及应用场景。
#应用场景认证组件,频率组件,权限组件

 


29,编写原生SQL语句:
30,什么是xss攻击。 csrf
# -- XSS攻击是向网页中注入恶意脚本,用在用户浏览网页时,在用户浏览器中执行恶意脚本的攻击。
#   -- XSS分类,反射型xss ,存储型xss
#   -- 反射型xss又称为非持久型xss,攻击者通过电子邮件等方式将包含注入脚本的链接发送给受害者,
#      受害者通过点击链接,执行注入脚本,达到攻击目的。
#   -- 持久型xss跟反射型的最大不同是攻击脚本将被永久的存放在目标服务器的数据库和文件中,多见于论坛
 #     攻击脚本连同正常信息一同注入到帖子内容当中,当浏览这个被注入恶意脚本的帖子的时候,恶意脚本会被执行
#   -- 防范措施 1 输入过滤  2 输出编码  3 cookie防盗
#      1,输入过滤 用户输入进行检测 不允许带有js代码
#      2,输出编码 就是把我们的脚本代码变成字符串形式输出出来
#      3,cookie加密

# 31,flask和django区别。
#django 是大而全,内置很多模块,可以拿来就用,比较适合复杂的项目
#flask 是小而精悍,比较简洁,适合简单环境的项目,但是第三方模块比较丰富,通过模块可以完成像django一样复杂的环境

# 32,手写Falsk的hello world。
第二次考试题
# 33,简述Flask中的before_request 和 after_request的特点以及应用。
#   before_request在视图函数执行之前执行,after_request是在视图函数执行之后执行,相当于django中间件的process_request和process_response.
# 34,flask中蓝图是什么以及作用。
#  1. 目录结构的划分(解耦)。
#  2. 单蓝图中应用before_request
#  3. URL划分
#       app.register_blueprint(account,url_prefix='/user')
#  4. 反向生成URL
#    url_for('蓝图.函数名')
#    url_for('蓝图.endpoint')
#    url_for('蓝图.endpoint',nid=1)
                
#    print(url_for('account.login'))
#    print(url_for('account.logout'))
#    print(url_for('code.index'))
# 35,列举使用过的Flask组件。
#flask-session,wtforms,DBUtils
# 36,如何查看指定目录下的所有文件。
# 37,Python如何进行解压缩文件。
#.gz .tar  .tgz .zip .rar

#简介
#gz: 即gzip,通常只能压缩一个文件。与tar结合起来就可以实现先打包,再压缩。
#tar: linux系统下的打包工具,只打包,不压缩
#tgz:即tar.gz。先用tar打包,然后再用gz压缩得到的文件
#zip: 不同于gzip,虽然使用相似的算法,可以打包压缩多个文件,不过分别压缩文件,压缩率低于tar。
#rar:打包压缩文件,最初用于DOS,基于window操作系统。压缩率比zip高,但速度慢,随机访问的速度也慢。
# 38,Python如何读取excel的内容。
   # xlrd xlwt
# 39,Flask如何控制长传文件大小。
# 40,websocket,长轮询,轮询的区别。
#  1. 轮询
#    设置一个定时器,自动按照规定时间刷新;
#    缺点:
#    - 延迟 
#    - 浪费资源
                    
#  2. 长轮训
#    后台将用户请求hang住,最多hang 30s;
            
            
#  3. websocket协议 
#    Http协议 
#    websocket协议:连接不断开
# 41,为什么要使用长轮询或websocket。
#- 长轮训,后台将用户请求hang住,最多hang 30s;相比较轮训,对服务器的压力较小;优点是兼容性好 
#- websocket,连接不断开,对服务器压力较小服务器可以向客户端主动推送消息;缺点是早起浏览器不支持;
# 42,flask中如何实现websocket。
#下载第三方模块 gevent-websocket
# 43,简述websocket握手流程
#- 获取用户请求发来的值, Sec-WebSocket-Key=mnwFxiOlctXFN/DeMt1Amg==
#- 将 "mnwFxiOlctXFN/DeMt1Amg==" + magic_string 
#- 将 "mnwFxiOlctXFN/DeMt1Amg==" + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
#- 将 hashlib.sha1("mnwFxiOlctXFN/DeMt1Amg==" + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')
#- 将 ret = b64encode(hashlib.sha1("mnwFxiOlctXFN/DeMt1Amg==" + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'))
#- 将加密后的结果 ret 返回给客户端
#注意: 握手成功之后才能收发数据
# 44,简述websocket数据解密流程。
#- 解密 
#  - 取第二个字节的后7位
#  - 127
#  - 126 
#  - <=125
# 45,你用websocket做过什么。
#排行榜