python 部分面试题整理(1)

Python中sort和sorted的区别

区别:
sort:
是容器的函数,对列表(list)的成员进行排序
并且改变的是原列表
sorted:
是Python的内建函数,用built-in函数sorted进行排序
并且返回的是新的列表,对所有可迭代的对象均有效

python下多线程的限制以及多进程中传递参数的方式

python多线程有个全局解释器锁(global interpreter lock),这个锁的意思是任一时间只能有一个线程使用解释器,
跟单cpu跑多个程序一个意思,大家都是轮着用的,这叫“并发”,不是“并行”。
多进程间共享数据,可以使用 multiprocessing.Value 和 multiprocessing.Array

redis分页设计

  1. 使用一个key,也不分页将全部的数据缓存到redis中,然后按照分页条件使用range(key,start,limit)获取分页的结果,
    这个会导致一个问题,当缓存失效时,并发的写缓存会导致出现重复数据,通过使用set来处理并发时的重复数据
  2. 按照不同的分页条件来缓存多个key,比如分页查询产品列表,page=1&limit=10和page=1&limit=5这两次请求可以这样缓存查询结果

redis的高并发处理方式

1.在客户端将连接进行池化,同时对客户端读写Redis操作采用内部锁synchronized。
解决方式:将Redis连接池化
首先,Redis也归属于数据库范凑,即便它是NoSQL类型,依然为C/S结构模式。客户端每次请求都需要建立数据库连接,
在多客户端请求模式下服务端与客户端连接频繁将导致系列阻塞、超时等等系列问题。
学过关系型数据库的朋友也知道,关系型数据库解决方式是采用连接池方式解决多请求连接问题。
同样,Redis数据库也同理,建立友好的连接数量让客户端与服务端保持一定数额的连接量,当客户端需要连接时,
能直接从连接池中获取连接,然后直接访问Redis服务端。

2.服务器角度,利用setnx变向实现锁机制。
setnx 有两个参数。第一个参数表示键。第二个参数表示值。如果当前键不存在,那么会插入当前键,将第二个参数做为值。
返回 1。如果当前键存在,那么会返回0。

在python中,list,tuple,dict,set有什么区别,主要应用于什么样的场景

解答
list:列表(链表的数据结构)有序的项目, 通过索引进行查找,使用方括号”[]”;
tuple:元组 元组将多样的对象集合到一起,不能修改,通过索引进行查找, 使用括号”()”;
dict:字典 字典是一组键(key)和值(value)的组合,通过键(key)进行查找,没有顺序, 使用大括号”{}”;
set:集合 无序,元素只出现一次, 自动去重,使用”set([])”
应用场景
list, 简单的数据集合,可以使用索引;
tuple, 把一些数据当做一个整体去使用,不能修改;
dict,使用键值和值进行关联的数据;
set,数据只出现一次,只关心数据是否出现, 不关心其位置;

items()和iteritems()区别:

字典的items方法作用:是可以将字典中的所有项,以列表方式返回。因为字典是无序的,所以用items方法返回字典的所有项,也是没有顺序的。
字典的iteritems方法作用:与items方法相比作用大致相同,只是它的返回值不是列表,而是一个迭代器。

Python如何进行字符类型强转

数据类型(待转换的字符)如字符串转整型int(‘1’)
注意,字符串转整型字符串只能为数字,整型可以随意转换为字符串
布尔值转换数字 Flase对应0,True 对应1

静态函数,类函数,成员函数的区别

类函数(@classmethod):定义类方法,可以通过类或者实例调用。方法的第一个参数是class对象。
成员函数: 实例的方法, 只能通过实例进行调用;第一个参数是该实例self。
静态函数(@staticmethod): 定义静态方法,可以通过类或者实例调用。第一个参数不需要是class对象或者实例self

什么是lambda函数,它有什么好处

lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的匿名函数。
好处:lambda函数比较轻便,即用即扔,很适合需要完成某一项简单功能,但是这个简单的功能只在此一处使用,连名字都很随意的情况下;
作为回调函数,可以传递给某些应用,比如消息处理等。

如何进行的django单元测试

Django的单元测试使用python的unittest模块,这个模块使用基于类的方法来定义测试。
类名为django.test.TestCase,继承于python的unittest.TestCase。
执行目录下所有的测试(所有的test*.py文件):运行测试的时候,
测试程序会在所有以test开头的文件中查找所有的test cases(inittest.TestCase的子类),自动建立测试集然后运行测试

http协议

accept : 期望接收到的数据类型
Accept-Charset : 期望接收到的字符集
Accept-Encoding : 期望接收到的压缩编码格式
Connection : 是否需要持久连接
Content-type : 发送的数据类型
cookies : HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。
200 : 成功
400  : 错误的请求
401 : 没有认证
403 : 禁止访问
404 : 页面没找到
500 : 服务器错误
503  : 服务器不可用

WSGI和FastCGI的区别

FCGI = Fast CGI
它其实是CGI在具体实现中的的一个变种。其设计思路是,通过减少CGI代理程序和Web宿主服务程序的通信开销,
从而达到提高Web服务性能的最终目的。由此可见,FCGI在规范上跟CGI并没有不同,只是具体实现方式上有所改进:
CGI的做法是,对于每个HTTP请求,Web宿主服务程序都建立新的进程以调用服务器脚本,相应该请求;
FCGI的做法是,建立一个独立的FCGI服务程序进程,和Web宿主服务程序进程通信,FCGI服务进程被一旦启动后,
自己分配资源、创建线程响应HTTP请求、并决定自身生命周期,从而大大降低了系统为了创建进程而做出的资源开销。
现代流行的Web服务器程序,如PHP、ASP.Net,基本都是FCGI的实现。

WSGI = Web Server Gateway Interface
此协议是Python语言的专利,它定义了一组在Web服务宿主程序和HTTP响应代理程序之间通信的普遍适用的接口。
它的产生是因为Python程序员注意到,对于Web框架和Web宿主服务器程序间,有严重的耦合性,比如说,
某些框架是针对Apache的mod_python设计的。于是,WSGI就定义了一套非常低级别的接口。
常见的Python Web框架都实现了这个协议:如 CherryPy, Django, web.py, web2py, TurboGears, Tornado,
Pylons, BlueBream, Google App Engine[dubious – discuss], Trac, Flask, Pyramid,等等.

阐述flask的mvc的架构是怎么运行的?

模型-视图-控制器(MVC)
1、模型(Model)
模型是应用程序的主体部分。模型表示业务数据,或者业务逻辑.
2、视图(View)
视图是应用程序中用户界面相关的部分,是用户看到并与之交互的界面。
3、控制器(controller)
控制器工作就是根据用户的输入,控制用户界面数据显示和更新model对象状态。
MVC 式的出现不仅实现了功能模块和显示模块的分离,同时它还提高了应用系统的可维护性、可扩展性、可移植性和组件的可复用性

model设置了数据库的存储字段。
view获取到数据库的数据渲染到模板中
根据浏览器请求,可以找到相应的视图,视图调用相应的模板,控制器会根据对应的数据,渲染出最终展示的结果

Linux常见命令

  • 系统操作类

    • 用户管理类
      • adduser / addgroup 添加用户和用户组
      • passwd 设置/修改用户密码
        用户信息在 /etc/passwd 文件中维护
    • 文件管理类
      • ls -lF : 把目录显示为有/结尾的符号,方便区分普通文件和目录文件
        ls -la : 把所有文件都显示出来,包括隐藏.
        ls -li : 把文件的inode节点显示出来
      • chmod
      • 过滤:
        grep ^#
      • 7种文件类型:
        • 普通文件 b 块设备节点文件 l 软连接 s socket本地描述符
          d 目录文件 c 字符设备节点文件 p 有名管道
    • 网络管理类
      • ifconfig
      • netstat -tuanp
      • ping ICMP
    • 进程管理类
      • ps aux
      • top
      • kill
  • 服务管理类

    • 服务的启停

      • centos6:
        • service 服务名 start/stop/restart
      • centos7:
        • systemctl start/stop/restart 服务名
    • 怎么判断一个服务是否开启:
      netstat -tanp

    • 安装服务
      rpm -ivh

      yum install apt install

      wget : http协议下载工具 迅雷

    • tar -zxvf tar.gz tgz
      tar -jxvf tar.bz2

  • 硬链接和软连接的区别

    • 软连接,快捷方式,占用磁盘空间
      a = 10
      b = ‘a addr’
    • 硬链接,文件的别名,不占用磁盘
      a = 10
      b = a

多进程和多线程

  • 这2个都是操作系统提供的任务调度机制

  • 进程是独占用户空间资源,线程是共享进程的用户资源空间,必须依附在一个进程上

  • 进程之间的一般不用考虑资源的互斥占用,如果要通信,必须借助内核提供的机制来实现

    • 无名管道 有名管道 共享内存
  • 线程之间必须考虑资源的互斥占用,通信只需要通过全局变量就可以,引入锁的机制保障互斥访问。

  • 进程池和线程池
    提前分配好足够的进程和线程,进程和线程的创建和释放时间不用考虑

  • 多线程爬虫,队列,同步机制

  • 空间资源的分类:

    • 内核空间
    • 用户空间
      • 代码区
      • 全局变量区
      • 堆区
      • 栈区 : 局部变量

redis缓存

  • 内存操作的数据库
  • 第一次用户访问时,是没有缓冲,缓存未命中,此时读取数据库,把数据采用k:v保存在redis
  • 第二次用户(包含其用户),首先查询k有没有对应的值,如果有,直接返回给用户,命中缓存,减少了数据库的IO操作
  • 若数据库被后台软件更新了,后台视图函数,把对应的K进行删除,此时缓存消失,
    再有用户访问,就重构缓存

持久化:
redis是一个内存结构,它掉电就消失,定期把内存的数据持久化到硬盘上。

RDB:把内存中的数据做镜像备份到硬盘
AOF :把操作日志以追加的方式记录在文件中,恢复时,需要把命令重新执行一下

Jieba 分词

Jieba 分词支持三种分词模式:

  • 精确模式:试图将句子最精确地切开,适合文本分析;
  • 全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
  • 搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词功能:
    分词,添加自定义词典,关键词提取,词性标注,并行分词,Tokenize:返回词语在原文的起始位置,ChineseAnalyzer for Whoosh 搜索引擎。

ngnix 的正向代理与反向代理?

web 开发中,部署方式大致类似。简单来说,使用 Nginx 主要是为了实现分流、转发、负载均衡,
以及分担服务器的压力。Nginx 部署简单,内存消耗少,成本低。Nginx 既可以做正向代理,也可以做反向代理。
正向代理:请求经过代理服务器从局域网发出,然后到达互联网上的服务器。
特点:服务端并不知道真正的客户端是谁。
反向代理:请求从互联网发出,先进入代理服务器,再转发给局域网内的服务器。
特点:客户端并不知道真正的服务端是谁。
区别:正向代理的对象是客户端。反向代理的对象是服务端。

猜你喜欢

转载自blog.csdn.net/weixin_43958804/article/details/87922739