python常见问题二

版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/kan2016 https://blog.csdn.net/kan2016/article/details/82788096

1、与、或、亦或的优先级(and、or、xor)
答:xor的优先级高,因为是单运算符,and和or的优先级比较低,and比or有限级高。
              
2、什么是死锁
答:在多线程程序中,因为共享多个资源,如果两个线程分别占有一部分资源并同时等待对方的资源的时候发生阻塞。就会形成死锁
解决方法:加载超时时间,设计代码的时候要注意

3、字典能存储的数据类型:
答: 字符串,整数
              
4、http的了解:超文本传输协议,是应用层的传输协议,无状态的,应答较快。传输层使用的是TCP协议。包含请求和响应,一次请求一次响应表示一个完整的HTTP通讯。

http请求方式:

GET 客户端向服务器获取资源数据

POST客户端让服务器保存数据

PUT客户端让服务器修改数据。

DELETE客户端让服务器删除数据,HEAD客服端让服务器获取头信息。OPTION客户端询问服务器支持哪些http功能特性
    
5、说说进程、线程、协程    
答:进程是系统进行资源分配的最小单位,每个进程都有自己的独立内存空间,不用进程通过进程间通信来通信。但是进程占据独立空间,比较重量级,所以上下文进程间的切换开销比较大,但是比较稳定安全。
      线程是进程的一个实体,是CPU进行调度的最小单位,他是比进程更小能独立运行的基本单位。线程基本不拥有系统资源,值占用一点运行中的资源(如程序计数器,一组寄存器和栈),但是它可以与同属于一个进程的其他线程共享全部的资源。提高程序的运行速率,上下文切换快,开销比较少,但是不够稳定,容易丢失数据,形成死锁。
     协程:是更小的执行单位,是一种轻量级的线程,协程的切换只是单纯的操作CPU的上下文,所以切换速度特别快,且耗能小。线程切换从系统层面远不止保存和恢复CPU上下文这么简单,操作系统为了程序运行的高效性,每个线程会有缓存的数据,操作系统还会做回复数据的操作,实际上是消耗性能的。
     对于IO密集型的程序,由于IO操作远远慢于CPU的操作,所以往往需要CPU去等IO操作,这样在同步IO下就需要切换线程,让操作系统去执行其他的代码,但是这样带来大量的性能浪费。如果把一个IO操作写成一个协程。当触发IO操作时候自动让出CPU给其他协程,协程的切换轻的,协程通过这种异步IO的封装,即保留了性能也保证了代码的可读性,在高IO密集型的程序下很好,但是高CPU密集型的程序就不好了。

6、迭代器和生成器的区别:
答:生成器能做迭代的所有事情,是一种特殊的迭代器,而且生成器自动创建了__iter__()和__next__()方法,显得更加简洁。迭代器是具有__iter__和__next__方法的对象。生成器是写起来更像是正规的函数,只要在返回时使用yield语句,就是生成器,。

7、装饰器:是一个很著名的设计模式,是解决插入日志,性能测试,事务处理等问题的绝加设计,有了装饰器,可以抽离大量函数中与函数功能本身无关的代码继续重用。就是为已经存在的对象添加额外的功能,而不改变器结构。

装饰器本质上是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器返回值也是一个函数对象,经常用于插入日志,性能测试,事务处理,缓存,权限校验等场景。
def outer(func):
   def wrapper(*args, **kwargs):
      return func(*args, **kwargs)
   return wrapper
@outer
def bar()
  print("hello world")

8.同步异步,阻塞非阻塞的理解:

同步就是多任务之间执行的时候要求有先后顺序,必须一个先执行完成后,另一个才能继续执行,只有一个主线。

异步是多个任务之间执行没有先后顺序,可以同时执行,互不影响,执行的先后顺序没有什么影响,存在多条主线。
阻塞是在调用的时候,未返回结果时被卡住,不能继续向下运行,需要等待,就是阻塞
非阻塞就是被调用的时候没有被卡住,能够继续向下执行,无需等待。
9、GIL对多线程的影响:GIL全称是全局解释器锁。在python多线程中,每个线程的执行方式是获取GIL,执行代码指导阻塞,就会释放GIL。所以说线程想要执行,必须先拿到GIL锁,可以看到这个GIL只有一个,拿不到的线程就不能执行。一般在线程执行达到ticks100或者阻塞的时候就会释放GIL,而其他线程就会进行竞争争夺锁。
10、什么是线程安全:是在多线程环境下,能够保证多个线程同时执行时程序依旧能运行正常,而且保证共享的数据可以由多个线程存取,但是同一时刻只能有一个线程进行存取,多线程环境下解决资源竞争问题的办法是加锁保证存取的唯一性。

11、面向对象有哪些方法:类, 实例方法,继承,实例对象
12、静态方法需要@staticmethod进行修饰,不需要定义参数,类方法是类对象所拥有的方法,需要用装饰器@classmethod来标示,以cls为第一个参数,能够通过实例对象和类对象去访问。
13、生产者消费者模型:解耦,通过队列降低耦合,支持并发,生产者和消费者是两个独立的并发体,他们之间使用缓冲区作为桥梁连接,生产者只往里丢数据,就可以生产下一个数据了,消费者从中拿数据,这样就不会阻塞,影响速度。可以很好的支持任务的忙闲不均匀的问题。

14.缺省参数:函数中使用了一个L的缺省参数,缺省值是一个空的列表。缺省参数的python中是与函数绑定在一起的,也就是说,一个函数中定义了一个缺省参数,那么这个参数会随着被调用而改变。在一次调用中改变了缺省参数的值,可能会影响到这个函数的另外一次调用。
def f(a,L=[]):
     L.append(a)
     print(L)

15.线程安全:在多线程环境下,能够保证多个线程同时执行时程序能正常执行。而且保证共享的数据可以被多个线程获取,但是同一时间只能有一个线程进行存取,在遇到多线程资源竞争的问题时加锁来保证存取的唯一性,避免出现死锁。
    互斥锁:多线程出现竞争资源时,引入互斥锁,某个线程要更改共享数据时,现将其锁定,此时资源的状态为锁定,其他线程就不能更改资源,直到该线程释放资源,将资源的状态变为非锁定,其他线程才能锁定该资源,更改改资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。

16.对wsgi的理解:WSGI是python框架和服务器之间的一种接口,其定义了两者进行通信的接口规范,服务器端和应用端都必须遵循这套规范,当一个应用程序是按照WSGI规范开发的,那么他可以在任意遵循该规范的服务器上运行,Web Server Gateway Interface,WSGI把web组件分为三个部分,服务器端,中间件,应用端。WSGI允许开发者将选择web框架和web服务器分开,可以选择适合的配对,因为WSGI同时支持服务器和框架。他能让你不对代码做修改就能使服务器和web框架协同工作。。
    
17.python是强语言:强类型语言就是一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么他永远是这个数据类型了。强类型是安全的语言。
弱类型语言是:数据类型可以被忽略的语言,和强类型语言正好相反。python是动态语言,可以在运行中动态添加属性,方法。

18.python内存管理的问题,垃圾回收机制是应用计数为主,分代收集为辅。引用计数会消耗内存。
阈值:(700,10,10)。

19.基本的算法有哪些:冒泡,插入,哈希,快速,归并,选择。(时间复杂度)
20.写一个邮箱地址的正则表达式:^[A-Za-z0-9]@(163|126|qq).com

21.找出二叉树中最远结点的距离?遍历整个二叉树,记录每个节点的深度,最远的两个节点一定是两个子节点,我们在遍历的时候找到两个深度最深的叶子节点,那么这两个节点的距离就是最远的。

22.写一个列表生成式 ,例如产生一个公差为1的等差数列:[i for i in i[n]-i[n-1]=1]

23.从继承上说,新式类默认从object继承,经典类需要指定(python3中没有).
经典类继承深度优先(先深入继承左侧,再返回,在开始找右侧)
新式类继承广度优先(先水平搜索,然后再向上移动):super(子类,self).__init__(name,age)

24.过滤器种类:

all()  返回所有数据。

filter()返回满足条件的数据,过滤。

exclude()返回满足条件之外的数据  

order_by()对结果排序。

get()返回单个满足条件的对象。  

count()返回当前查询结果的总条数  

aggregrate()聚合,返回一个字典  

exist()判断查询机是否有数据。
过滤器的特性之一是:惰性--创建查询机不会访问数据库,直到调用数据时,才会访问数据库。
过滤器的另一个特性是:缓存:使用同一个查询集,第一次使用时会发生数据库的查询,再次使用这个查询集时会使用缓存的数据。
如果是两个相同的查询机,无法重用缓存,每次查询都会和数据库进行一次交互,增加了数据库的负载。缓存可以加快获取数据的速率,减轻数据库的压力。

25.什么是闭包:一个闭包就是你调用了一个函数A,这个函数A返回了一个函数B,返回的函数B就是闭包。这个函数用到了外边的函数的变量。

26.什么是僵尸进程和孤儿进程以及怎么避免僵尸进程
僵尸进程是子进程完成任务,但是父进程一直没有回收,导致子进程一直占用系统的资源。避免:调用wait()。优化代码
孤儿进程是父进程已经结束,进程还没有结束,一般孤儿进程都是有人接收,一般是pid=1的进程回收。

27.谈一下什么是解释性语言什么是编译性语言:

编译语言在程序执行之前,有一个单独的编译过程,将程序编译成机器语言,以后再执行这个程序的时候,不用在进行翻译了。
解释性语言是在运行的时候将程序翻译成机器语言,所以运行速度相对于要慢。

28.谈一下http协议以及协议头部中表示数据类型的字段:客户通过域名向浏览器发送请求,浏览器向服务器发送HTTP请求,服务器接收到请求,返回给浏览器HTTP响应,如果浏览器还需要继续想服务器请求其他资源,就再次发送HTTP请求,服务器返回响应,然后形成一个完整的页面返回给客户。

29.mysql数据库存储的原理:

mysql数据库存储过程是一个可编程的函数,他在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不用的应用程序或者平台上执行相同的函数,或者封装特性的功能时,存储过程是非常有用的,数据库中的存储过程可以看做是对面向对象方法的模拟。通过表的形式实现数据的存储和关系的维护。用二维表的方式来组织数据,多个表之间有关联关系,可以通过引用其他表标示,重复的数据可以拿出来组成另一个表,其他表可以引用这张表的内容。

30.事务的特性:

(1)原子性:事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行。

(2)一致性:几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果一致。就是多线程的概念,一个执行完了才能执行另外一个。

(3)隔离性:事务的执行不受其他事务的干扰,事务执行的中间结果必须对其他事务透明的。

(4)持久性:对于已经提交事务,系统必须保证该事务对数据库的改变不被丢失,及时数据库出现故障。

31.mysql和redis的区别:

mysql是关系型数据库,持久化存储,数据存放在磁盘里面,功能强大,检索的话,会涉及到IO,数据访问比较慢。

redis是非关系型数据库,数据保存在内存中,访问速度快。

32.redis受攻击了怎么办:配置主从,从服务器备份数据    持久化存储  设置复杂的密码
     redis不以root账户启动

33.MongDB是一个基于分布式文件存储的noSql数据库,使用C++编写,不支持SQL,但有自己功能强大的查询语法。
热点:

(1)可以把不用的结构的文档存储在用一个数据库中。

(2)适合存储JSON风格文件的形式。

(3)支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。

(4)丰富的查询:支持丰富的查询表达方式,查询指令使用JSON名师的标记,可轻易查询文档中的内嵌的对象和数组。

(5)支持二进制数据及大型对象如图片或照片。
mongDB三元素:数据库,集合,文档 。集合就是关系数据库中的行。文档就是一个对象,由键值对构成,是Json的扩展Bson形式。{“name":"guojing", 'gender':'男'}。数据库就是一个集合的物理容器,一个数据库可以包含多个文档。
mongdb不支持事务,占用空间大,维护工具不够成熟。
不适合的场景:高度事务性的系统,例如银行或会计系统,需要SQL的问题,重要数据,关系数据不适合用mongdb。
适合的场景:1.网站数据,适合实时的插入,更新和查询。2.缓存。3.大尺寸,低价值的数据。4.高伸缩性的场景:mongdb非常适合数十或者数百台服务器组成的数据库。
重要数据:mysql  一般数据:mongodb   临时数据:memcache
mongdb中每个文档都有一个属性为_id,保证了文档的唯一性。如果自己没有设置会自动生成。生成obj_id,是一个12字节的十六进制数,前四个为时间戳,接下三个位机器id,接下来2个字节是服务进程id,最后三个是简单的增量值。

34.数据库索引:数据库索引是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据,索引的实现通常使用B_TREE。建立索引可以加速数据的访问,因为存储引擎不会再去扫描整张表来得到所需要的数据,相反,可以通过索引快速定位,需找数据。
35.数据库怎么优化查询效率:
    (1)存储引擎的选择,如果数据表需要事务的处理,应该考虑使用InnoDB,如果不需要事务处理,使用默认存储引擎MyISAM是比较好的。
    (2)分表分库,设置主从。多余的数据可以分表建立,直接引用地址或者管理信息就可以。
    (3)查询优化,建立索引,尽量避免全表扫描。
    (4)应该精良避免在where字句中对字段进行Null值判断,或者使用!=或者<>会造成全表扫描。
    (5)update语句,如果只更改1,2个字段,不要update全部字段,否则频繁调用会引起明显的性能消耗。
    (6)大数据量的表,要先分页在join,性能更高。
36. 数据库优化方案:
     (1)优化索引,SQL语句。
      (2)设计表的时候严格根据数据库的设计范式来设计数据表
      (3)使用缓存,把经常访问到的数据而且不需要经常变化的数据放到缓存中。能节约磁盘的io操作。
      (4)优化硬件:采用ssd.
      (5)主从分离读写,采用主从复制把数据库的读操作和写入操作分离开来。
      (6)分库分表分机器,数据量特别大的时候。
      (7)进行架构级别的缓存,静态化和分布式。
      (8)不采用全文检索。

37.redis和mongodb优缺点:
redis优点:读写性能优异,速度快。支持持久化。主从复制,主机会自动将数据同步到从机,可以进行读写分离。数据结构丰富,可以支持string,hash,set,sorteset,list等数据结构。
redis缺点:redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,主机宕机,可能有部分数据未能同步到从机,可以会有数据不一致的问题。redis较难支持在线扩容,在集群容量达到上限时扩容比较复杂。
mongdb优点:文档结构的存储方式,能够更便捷的获取数据。可以存储而今和大对象,照片,图片等。可以动态查询数据。
mongodb缺点:不支持事务,mongodb占用空间大, 维护工具不够成熟。

38.数据库负载均衡:负载均衡集群是有一组相互独立的计算机系统构成,通过常规网络或者专用网络互相连接,由路由器衔接在一起,各节点互相协作,共同负载,均衡压力,对客户端来说,整个集群可以视为一台具有超高性能的服务器。
实现原理:实现数据库的负载均衡技术,首先要有一个可以控制连接数据库的控制端,在这里,它截断了数据库和程序的直接连接,有所有的程序来访问这个中间层,然后再由中间层来访问数据库,这样,我们就可以具体控制访问某个数据库了,然后还可以根据数据库的当前负载采取有效的均衡策略,来调整每次连接到哪个数据库。
实现多数据库数据同步:对于负载均衡,最重要的就是所有服务器的数据都是实时同步的。这是一个集群所必需的,因为,如果数据不同步,那么用户从一台服务器读出的数据,就有别于从另一台服务器独处的数据。所以必须实现数据库的数据同步。这样,在查询的时候就可以有多个资源,实现均衡。

优点:

(1)扩展性强,当系统要更高数据库处理速度时,只要加单地增加数据库服务器就可以得到扩展。

(2)可维护性,当节点发生故障时,系统会自动检测故障并转移故障节点的应用。

(3)安全性:因为数据会同步到多台服务器上,可以保证数据的安全性。
缺点:

不能够按照web服务器的处理能力分配资源。负载均衡器故障,会导致整个数据库系统瘫痪。

39.怎么解决海量数据的存数和访问造成系统设计瓶颈的问题:
答:水平切分数据库:可以降低单台机器的负载,同时最大限度的降低了宕机造成的损失,分库降低了单点机器的负载,分表,提高了数据操作的效率。
负载均衡策略:可以降低单台机器的访问负载,降低宕机的可能性。
集群方案:解决了数据库宕机带来的单点数据库不能访问的问题。
读写分离策略:最大限度的提高了应用中读取数据的速度和并发量。

40.MySQL集群的优缺点:
优点:高可用性,灵活的分布式体系结构,没有单点故障。高吞吐量和低延迟,可扩展强,支持在线扩容。
缺点:存在很多限制,不支持外键。部署,管理,配置很复杂。占用磁盘空间大,内存大,备份和恢复不方便。重启的时候,数据节点将数据load到内存需要很长时间。

41.你用的Mysql是哪个引擎,各引擎间有什么区别:

主要是MyISAM与InnoDB两个引擎。

主要区别:

(1)是InnoDB支持事务,MyISAM不支持,这一点非常重要。事务是一种高级的处理方式,在一些数据库操作中出错还可以回滚还原。MyISAM不可以了。

(2)InnoDB支持外键,MyISAM不支持。

(3)MyISAM是默认引擎,InnoDB需要指定。

(4)清空整个表时,InnoDB是一行一行的删除,效率非常慢,MyISAM则会重建表。

(5)对于自增长的字段,InnoDB中包含只有该字段的索引,但是在MyISAM表中可以在其他字段一起建立联合索引。

42.redis基本类型

redis支持五中数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)
string:set get 
hash:hget, hset, hgetall等
list:lpush, rpush, lrange, lpop, rpop
set:一组无序的字符集合,set中相同的元素只保留一个。sadd, smembers, spop
zset:zadd, zrange, zrem, zcard等

43.redis的事务:

redis事务允许一组命令在单一步骤中执行。事务是一个单独的隔离操作,事务中的所有命令都会序列化,按顺序地执行,事务在执行的过程中,不会被其他客户端发动来的命令请求所打断。

Redis事务是原子性的,要么所有的命令都执行,要么都不执行。一个事务从开始到执行会经历一下三个阶段:开始事务,命令入队,执行事务。

44.redis的使用场景有哪些:缓存   构建队列系统   取N个数据的操作

45.怎么解决数据库高并发的问题:分表分库,数据库索引,redis缓存数据库 读写分离  负载均衡集群:将大量的并发请求分担到多个处理节点,由于单个处理节点的故障不影响整个服务,负载均衡集群同时也是实现高可用性。

46.redis默认端口:6379 默认过期时间:可以说是永不过期,一般情况下,当配置中开启了超出最大内存限制就写磁盘的话,那么没有设置过期时间的key可能会被写在磁盘上。
Value最多可以容纳的数据长度是512M.

47.MySQL:3306   Oracle:1521   http: 80    https: 443    redis:6379   mongDB:27017

48.索引:查看索引:show index from 表名;
创建索引:create index 索引名称 on 表名(字段名称(长度))如果指定字段是字符串,需要指定长度,如果不是字符串,可以不填写长度部分。
create index title_index on text_index(title(10))
删除索引:drop index 索引名称 on 表名
缺点:索引可以大大提高查询速度,但同时会降低更新表的速度,如果对表进行insert,update和delete,因为更新表时,mysql不仅要保存数据,还要保存一下索引文件。

49.django框架:
(1)URI:是统一资源标识符,是一个紧凑的字符串用来标示抽象或物理资源唯一的标示,
URL:是统一资源定位器,他重点是指明了如何定位改资源的主要访问机制。
RUN:是统一资源命名,重点是指明了如何命名该资源的主要访问机制。
url侧重于资源的定位,urn侧重于资源的命名。
(2)MVC框架:核心思想是:解耦,让不同的代码块之间降低耦合,增强代码的可扩展性和可移植性,实现向后兼容。M是Model,主要封装对数据库层的访问,增删改查。V是View,用于封装结果,生成页面展示的html内容。C全拼为Controller,用于接收请求,处理业务逻辑,与Model和View交互,返回结果。
django是MVT设计:M是Model,负责和数据库交互,进行数据处理。V是View,接收请求进行业务处理,返回应答。T是Template,负责封装构造要返回的html。

(3)django访问流程:

<1>用户发起网页的web请求。
<2>请求到达django的路由系统,匹配web请求中的资源关键字,将匹配到的请求交给指定的视图模块函数去处理。
<3>请求到达视图模块,有两部分功能,获取数据,获取模板,展示数据。
<4>如果views接收到的请求需要获取数据,那么调用Models模块,通过内置的ORM功能去后端数据库获取数据,返回给views视图。
<5>views需要将获取到的数据进行展示,从模板中获取指定的模板文件,将数据进行渲染,形成完整的web页面,返回给客户端。

(4)面向对象和面向过程:
面向对象:关于与对象和结果。活物主动交互。对象。方法。who 谁来做?
面向过程:关注与过程步骤和结果。死物受规则被动操控。函数。参数和全局变量。how 如何做?


 

猜你喜欢

转载自blog.csdn.net/kan2016/article/details/82788096
今日推荐