python部分 网络编程

python 部分                                              前端

1.为何学习pythonpython

python简单易学,从人性角度讲,Python是给人设计的mysql

语法优美,linux

有丰富强大的库,程序员

开发效率高【可以知足互联网快速迭代的需求】,web

应用领域防范正则表达式

可嵌入性和可移植性算法

2.经过什么途径学习的pythonsql

网络视频,数据库

购买书籍,如流畅的python

技术软件,掘金,蓝鲸,Github

3.Python和Java、PHP、C、C#、C++等其余语言的对比

Python VS C#

1. Python跨平台,能够运行在linux、weindows等平台

2. Pythond开源,C#则相反

3. Python是解释型语言,C#须要编译,因此Python运行要慢点

 

Python VS Java

Python更简洁,Java过于庞大复杂,语法不少

 

Python VS C C++

Python更容易学习,语法简单易懂,但他们一般扮演不一样的角色,Python是一种脚本语言,C和C++一般要和底层硬件打交道

 

Python VS Ruby和Perl

ruby不一样,OOP(Object Oriented Programming,面向对象开发)对于Python是可选的,因此Python不会强制用户选择

OOP开发

Python一般是上述语言不错的替代品,使用Python将会减小不少编写,调试和维护的麻烦

 

4.简述解释型和编译型编程语言?

 

编译型:

将代码一次性所有编译成二级制,而后再运行。

优势:执行效率高。

缺点:开发效率慢,不能跨平台。

表明语言:C。

解释型:

代码逐行解释,解释称二进制,而后运行。

优势:开发效率高,能够跨平台。

缺点:执行效率低。

表明语言:python.

 

5.Python解释器种类以及特色?

 

CPython

CPython。这个解释器是用C语言开发的,

CPython是使用最广的Python解释器。

IPython

IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所加强,可是执行Python代码的功能和CPython是彻底同样的

PyPy

pyPy是另外一个Python解释器,它的目标是执行速度。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),因此能够显著提升Python代码的执行速度。

JPython

 

Jython是运行在Java平台上的Python解释器,能够直接把Python代码编译成Java字节码执行。

IronPython

IronPython和Jython相似,只不过IronPython是运行在微软.Net平台上的Python解释器,能够直接把Python代码编译成.Net的字节码。

6.位和字节的关系

1字节Byte=8位(bit),1K=1024字节

7. b、B、KB、MB、GB 的关系?

8bit = 1Byte

1024Bytes = 1KB

1024KB = 1MB

1024MB = 1GB

 

8. 请至少列举5个 PEP8 规范(越多越好)

代码编排

1 缩进。4个空格的缩进(编辑器均可以完成此功能),不使用Tap,更不能混合使用Tap和空格。

2 每行最大长度79,换行可使用反斜杠,最好使用圆括号。换行点要在操做符的后边敲回车。

3 类和top-level函数定义之间空两行;类中的方法定义之间空一行;函数内逻辑无关段落之间空一行;其余地方尽可能不要再空行。

 

文档编排

1 模块内容的顺序:模块说明和docstring—import—globals&constants—其余定义。其中import部分,又按标准、三方和本身编写顺序依次排放,之间空一行。

2 不要在一句import中多个库,好比import os, sys不推荐。

3 若是采用from XX import XX引用库,能够省略‘module.’,都是可能出现命名冲突,这时就要采用import XX。

 

空格的使用

整体原则,避免没必要要的空格。

1 各类右括号前不要加空格。

2 逗号、冒号、分号前不要加空格。

3 函数的左括号前不要加空格。如Func(1)。

4 序列的左括号前不要加空格。如list[2]。

5 操做符左右各加一个空格,不要为了对齐增长空格。

6 函数默认参数使用的赋值符左右省略空格。

7 不要将多句语句写在同一行,尽管使用‘;’容许。

8 if/for/while语句中,即便执行语句只有一句,也必须另起一行。

 

注释

整体原则,错误的注释不如没有注释。因此当一段代码发生变化时,第一件事就是要修改注释!

注释必须使用英文,最好是完整的句子,首字母大写,句后要有结束符,结束符后跟两个空格,开始下一句。

若是是短语,能够省略结束符。

1 块注释,在一段代码前增长的注释。在‘#’后加一空格。段落之间以只有‘#’的行间隔。好比:

# Description : Module config.

#

# Input : None

# Output : None

2 行注释,在一句代码后加注释。好比:x = x + 1 # Increment x

可是这种方式尽可能少使用。

3 避免无谓的注释。

 

文档描述

1 为全部的共有模块、函数、类、方法写docstrings;非共有的没有必要,可是能够写注释(在def的下一行)。

2 若是docstring要换行,参考以下例子,详见PEP 257

"""Return a foobang

 

Optional plotz says to frobnicate the bizbaz first.

 

"""

命名规范

整体原则,新编代码必须按下面命名风格进行,现有库的编码尽可能保持风格。

1 尽可能单独使用小写字母‘l’,大写字母‘O’等容易混淆的字母。

2 模块命名尽可能短小,使用所有小写的方式,可使用下划线。

3 包命名尽可能短小,使用所有小写的方式,不可使用下划线。

4 类的命名使用CapWords的方式,模块内部使用的类采用_CapWords的方式。

5 异常命名使用CapWords+Error后缀的方式。

6 全局变量尽可能只在模块内有效,相似C语言中的static。实现方法有两种,一是__all__机制;二是前缀一个下划线。

7 函数命名使用所有小写的方式,可使用下划线。

8 常量命名使用所有大写的方式,可使用下划线。

9 类的属性(方法和变量)命名使用所有小写的方式,可使用下划线。

9 类的属性有3种做用域public、non-public和subclass API,能够理解成C++中的public、private、protected,non-public属性前,前缀一条下划线。

11 类的属性若与关键字名字冲突,后缀一下划线,尽可能不要使用缩略等其余方式。

12 为避免与子类属性命名冲突,在类的一些属性前,前缀两条下划线。好比:类Foo中声明__a,访问时,只能经过Foo._Foo__a,避免歧义。若是子类也叫Foo,那就无能为力了。

13 类的方法第一个参数必须是self,而静态方法第一个参数必须是cls。

 

编码建议

1 编码中考虑到其余python实现的效率等问题,好比运算符‘+’在CPython(Python)中效率很高,都是Jython中却很是低,因此应该采用.join()的方式。

2 尽量使用‘is’‘is not’取代‘==’,好比if x is not None 要优于if x。

3 使用基于类的异常,每一个模块或包都有本身的异常类,此异常类继承自Exception。

4 异常中不要使用裸露的except,except后跟具体的exceptions。

5 异常中try的代码尽量少。好比:

try:

value = collection[key]

except KeyError:

return key_not_found(key)

else:

return handle_value(value)

要优于

try:

# Too broad!

return handle_value(collection[key])

except KeyError:

# Will also catch KeyError raised by handle_value()

return key_not_found(key)

6 使用startswith() and endswith()代替切片进行序列前缀或后缀的检查。好比:

Yes:  if foo.startswith('bar'):优于

No:  if foo[:3] == 'bar':

7 使用isinstance()比较对象的类型。好比

Yes:  if isinstance(obj, int): 优于

No:  if type(obj) is type(1):

8 判断序列空或不空,有以下规则

Yes:  if not seq:

if seq:

优于

No:  if len(seq)

if not len(seq)

9 字符串不要以空格收尾。

10 二进制数据判断使用 if boolvalue的方式。

 

9. 经过代码实现以下转换:

二进制转换成十进制:v = “0b1111011”


int(v,2)

十进制转换成二进制:v = 18


bin(v)

八进制转换成十进制:v = “011”


int(v,8)

十进制转换成八进制:v = 30


oct(v)

十六进制转换成十进制:v = “0x12”


int(v,16)

十进制转换成十六进制:v = 87

hex(v)

 

10. 请编写一个函数实现将IP地址转换成一个整数。

 

10.3.9.12 转换规则为:

10            00001010


         3            00000011


 9            00001001


        12            00001100


再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?

 

int("".join([bin(int(i)).lstrip("0b").zfill(8) for i in "10.3.9.12".split(".") ]),2)

 

11.python递归的最大层数?

默认最大递归层数998

12. 求结果:

    v1 = 1 or 3
  --1

    v2 = 1 and 3
  --3

    v3 = 0 and 2 and 1  -0


  v4 = 0 and 2 or 1  - 1


  v5 = 0 and 2 or 1 or 4  -1


  v6 = 0 or Flase and 1  -False

13.ascii、unicode、utf-八、gbk 区别?

 

ASCII:一个Bytes表明一个字符(英文字符/键盘上的全部其余字符),1Bytes=8bit,8bit能够表示0-2**8-1种变化,便可以表示256个字符

为了知足中文和英文,中国人定制了GBK

GBK:2Bytes表明一个中文字符,1Bytes表示一个英文字符

为了知足其余国家,各个国家纷纷定制了本身的编码

日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里

可以兼容万国字符

与全世界全部的字符编码都有映射关系,这样就能够转换成任意国家的字符编码

这就是unicode(定长), 统一用2Bytes表明一个字符, 虽然2**16-1=65535,但unicode却能够存放100w+个字符,

由于unicode存放了与其余编码的映射关系,准确地说unicode并非一种严格意义上的字符编码表

 

很明显对于通篇都是英文的文原本说,unicode的式无疑是多了一倍的存储空间(二进制最终都是以电或者磁的方式存储到存储介质中的)

因而产生了UTF-8(可变长,全称Unicode Transformation Format),对英文字符只用1Bytes表示,对中文字符用3Bytes,

对其余生僻字用更多的Bytes去存

 

总结:内存中统一采用unicode,浪费空间来换取能够转换成任意编码(不乱码),

硬盘能够采用各类编码,如utf-8,保证存放于硬盘或者基于网络传输的数据量很小,提升传输效率与稳定性

 

14.字节码和机器码的区别?

机器码是电脑CPU直接读取运行的机器指令,运行速度最快,可是很是晦涩难懂,也比较难编写,通常从业人员接触不到。

字节码是一种中间状态(中间码)的二进制代码(文件)。须要直译器转译后才能成为机器码。

 

15.三元运算规则以及应用场景?

三元运算符就是在赋值变量的时候,能够直接加判断,而后赋值

格式:[on_true] if [expression] else [on_false]

resc = 值1 if 条件 else 值2

应用于if--else结构的逻辑,推导式中if也是基于三元运算规则

 

16.列举 Python2和Python3的区别?

1.print语句

python2中print是一个语句,输入内容放在print关键字后面便可,

python3里print是一个函数,须要括号执行,输出内容做为参数传给它

2.默认编码

python2默认编码是ASCII码,不支持中文

python3默认编码是UTF-8

3.UNICODE字符串

python2中有两种字符串类型,Unicode字符串和非Unicode字符串

python3中只有一种类型,Unicode字符串

4.全局unicode()方法

python2有两个全局函数能够把对象强制转换成字符串:unicode()把对象转换成unicode字符串

还有str()把对象转换为非Unicode字符串。

Python3只有一种字符串类型,unicode字符串,因此str()函数便可完成全部的功能。

5.long长整型

python2的整数有int整形和long长整型两种类型

python3里只有一种整形int

6.比较运算符--不等于

python2支持<>和!=,

python3只支持!=

7.字典类has_key()

python2中有has_key()方法,测试字典是否包含指定的键,3不支持

8.HTTP

python3中几个相关的http模块被组合成一个单独的包,即http

9.filter函数

python2中,filter,map方法返回一个列表

python3中,filter,map返回一个迭代器

10.输入

python2中input等待用户输入一个python表达式,而后返回结果

2中raw_input(),用户输入什么就返回什么

python3中只有input,用户输入什么就返回什么字符串,不计算

 

17.用一行代码实现数值交换:

     a = 1

     b = 2

a,b = b,a

 

18. Python3和Python2中 int 和 long的区别?

python2中int有必定范围,超过范围的整数要用long型

python3只有int

 

19. xrange和range的区别?

range产生的是一个列表序列,一次把全部数据返回,

xrange产生的是一个生成器,每次调用返回其中一个值

相对来讲xrange比range性能优化不少,数据集合较大时,不须要开辟一块很大的内存

 

 

20. 文件操做时:xreadlines和readlines的区别?

readlines返回值为列表,元素为每行的内容

xreadlines返回生成器,每次调用返回每行,已经不推荐这种用法,

推荐使用for line in f的方式

 

21. 列举布尔值为False的常见值?

0,空字符串,空字典,空列表,None【一个特殊的常量】

 

22. 字符串、列表、元组、字典每一个经常使用的5个方法?

 

字符串

name.capitalize())      # 把字符串的第一个字符大写

name.isspace())         # 是否为空格

name.replace('Li', '')  # 替换操做

name.split('m')         # 分割操做,打印: ["I'a", ' LiChengGuan']

name.strip()            # 去掉字符串的左右空格或自定字符串

name.find('Li')         # 查找,打印 5,即返回开始的索引值,不然返回-1

name.index('Li')

name.split()           #按照指定元素分割

[::step]               #切片,

列表

s= [1,2,3]

 

s.extend(s1)             # 在列表末尾扩展另外一个列表

s.append('测试拼接')     # 列表末尾添加新的元素

s.insert(0, '测试拼接')  # 指定位置插入元素

s.pop(0)                 # 指定位置删除,默认删除最后一个

s.remove(3)              # 移除列表中某个值的第一个匹配项,没有会抛异常

s.clear()                # 清空

s.reverse()              #反转

元组

元组不可变

字典

dic.keys()     # 输出全部键

dic.values()    # 输出全部值

dic.items()

dic.pop('code')        # 删除 code 键

dic.popitem() #随机删除

dic.clear()            # 清空

del dic   

 

 

23. lambda表达式格式以及应用场景?

lambda格式 lambda args:return expression

用于定义不须要命名,逻辑简单的函数

24. pass的做用?

pass是空语句,是为了保持程序结构的完整性,通常用作占位语句

25. *arg和**kwarg做用

函数定义中使用*args,**kwargs传递变长参数

*args用于传递位置参数,**kwargs用于传递关键字参数

 

26. is和==的区别

is 比较的是两个实例对象是否是彻底相同,它们是否是同一个对象,占用的内存地址是否相同

== 比较的是两个对象的内容/值是否相等,即内存地址能够不同,内容同样就能够了

 

27.简述Python的深浅拷贝以及应用场景?

浅拷贝只拷贝一层,深拷贝拷贝全部层,用于复制数据

 

28.Python垃圾回收机制?

引用计数机制

python中一切皆对象,他们的核心就是一个结构体pyobject,

其中ob_refcnt就是作为引用计数,当一个对象有新的引用时,它的ob_refcent就会增长,当引用它的对象被删除,它的ob_refcnt

就会减小,当引用计数为0时,改对象生命就结束了

 

29. Python的可变类型和不可变类型?

不可变类型 : 基础类型字符串,数字,布尔值,字节.另外还有一个元组

可变类型 : 数据结构列表,字典,集合

 

30. 求结果:

   v = dict.fromkeys(['k1','k2'],[])

   v[‘k1’].append(666)

   print(v)

   v[‘k1’] = 777

   print(v)

   

   fromkey生成的字典,指向同一个内存地址

   {'k1':777,'k2':[666]}

 

31. 求结果:

理解:函数查找变量的时刻,函数调用时才会查找变量

num() --> [lambda x:i*x,lambda x:i*x,lambda x:i*x,lambda x:i*x]

m(2)调用时查找i,for循环结束后i是3

结果[6,6,6,6]

 

32. 列举常见的内置函数?

enumertae:枚举,返回索引与值的元组

zip:拉链函数,接收多个可迭代对象,将对象相同索引位置放在一个元组中,返回一个迭代器,返回迭代器中元素个数由最短的可迭代对象决定

filter:过滤函数,接收一个函数和一个可迭代对象,生成一个迭代器.将可迭代对象的每个元素带入函数中,若是返回结果为True,则把元素添加入迭代器中

map:处理函数,接收一个函数和一个可迭代对象,生成一个迭代器,将可迭代对象的每个元素带入函数中,把返回值添加入迭代器中

callble:判断参数是否是可调用的

dir:查看内置属性和方法的字符串

super:根据__mro__属性去查找方法

isinstance:判断一个对象是否是这个类实例化出来的

iscubclass:判断一个类是否是另外一个类的子类,也能够判断两个类是否是相同的类

 

 

33. filter、map、reduce的做用?

filter:过滤函数,接收一个函数和一个可迭代对象,生成一个迭代器.将可迭代对象的每个元素带入函数中,若是返回结果为True,则把元素添加入迭代器中

map:处理函数,接收一个函数和一个可迭代对象,生成一个迭代器,将可迭代对象的每个元素带入函数中,把返回值添加入迭代器中

reduce函数将一个数据集合(链表,元组等)中的全部数据进行下列操做:

用传给reduce中的函数(有两个参数)先对集合中的元素进行操做,获得的结果再与第三个参数用函数运算,最后获得一个结果。

 

34. 一行代码实现9*9乘法表

print ("\n".join("\t".join(["%s*%s=%s" %(x,y,x*y) for y in range(1, x+1)]) for x in range(1, 10)))

 

35.如何安装第三方模块?以及用过哪些第三方模块?

pip install

PIL 图像处理标准库

requests处理URL

Tkinter图形界面

 

36,至少列举8个经常使用模块都有那些?

random模块

os模块

sys模块

time模块

re模块

序列化模块

hashlib模块

logging模块

collections模块

 

37.re的match和search区别?

re.match从开头开始匹配string

re.search从任意位置匹配

 

38.什么是正则的贪婪匹配?

贪婪匹配:正则表达式通常趋向于最大长度匹配,也就是所谓的贪婪匹配。

非贪婪匹配:就是匹配到结果就好,就少的匹配字符。

 

39.求结果: a. [ i % 2 for i in range(10) ] b. ( i % 2 for i in range(10) )

a [0,1,0,1,0,1,0,1,0,1] 列表

b (0,1,0,1,0,1,0,1,0,1) 生成器

 

40. 求结果: a. 1 or 2 b. 1 and 2 c. 1 < (2==2) d. 1 < 2 == 2

a. 1 b,2,c False,d,True

 

41. def func(a,b=[]) 这种写法有什么坑?

函数调用时b使用默认参数时,指向同一个内存地址

 

42.如何实现 “1,2,3” 变成 [‘1’,’2’,’3’] ?

a = "1,2,3"

b = a.split(',')

 

43. 如何实现[‘1’,’2’,’3’]变成[1,2,3] ?

[int(i) for i in ['1','2','3']]

 

44. 比较: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的区别?

a,b列表元素都是数字,c元素是元组

45. 如何用一行代码生成[1,4,9,16,25,36,49,64,81,100] ?

[i**2 for i in range(1,11)]

 

46. 一行代码实现删除列表中重复的值 ?

list1 = [...]

list2 = list(set(list1))

 

47. 如何在函数中设置一个全局变量 ?

global变量

 

48. logging模块的做用?以及应用场景?

loggin用来记录日志,能够定制日志的格式,级别和输出形式

程序调试

了解软件程序运行状况,是否正常

软件程序运行故障分析与问题定位

 

49.请用代码简答实现stack【堆栈】。

Stack():建立一个新的空栈

push(item):添加一个新的元素

item到栈顶

pop():弹出栈顶元素

peek():返回栈顶元素,且不从栈中删除

is_empty():判断栈是否为空

size():返回栈的元素个数

class Stack:   

  def __init__(self):       

    self.items=[]   

  def is_empty(self):

         return self.items==[]   

  def push(self,item):   

       self.items.append(item)   

  def pop(self):       

    return self.items.pop()   

  def peek(self):       

    return self.items[-1]   

  def size(self):       

    return len(self.items)

 

50.经常使用字符串格式化哪几种?

f"{}abc{}",%,format()

 

51. 简述 生成器、迭代器、可迭代对象 以及应用场景?

生成器 : 本身实现的迭代器

迭代器 : 调用next()方法,从中取值,或抛出一个异常.也有__iter__方法

可迭代对象 : 拥有__iter__方法,返回一个迭代器

应用场景 : 处理大量数据时逐个取值,减小内存占用

 

52. 用Python实现一个二分查找的函数。

list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def search(value,list1,start=0,end=None):

end = len(list1) if end is None else end

zj = (end - start) // 2+start

if start<=end:

if value>list1[zj]:

return search(3,list1,start=zj+1,end=end)

elif value<list1[zj]:

return search(3,list1,start=start,end=zj-1)

else:

return zj

return '找不到这个值'

 

53. 谈谈你对闭包的理解?

内部函数包含了对外部函数变量的引用,内部函数被执行

 

54. os和sys模块的做用?

os封装了系统相关功能,sys模块封装了解释器相关功能

 

55. 如何生成一个随机数?

random模块

56. 如何使用python删除一个文件?

os.remove('path')

 

57. 谈谈你对面向对象的理解?

面向对象是基于万物皆对象这个哲学观点. 所谓的面向对象就是将咱们的程序模块化, 对象化,

把具体事物的特性属性和经过这些属性来实现一些动做的具体方法放到一个类里面

面向对象的三大特征 继承,封装,多态

 

58. Python面向对象中的继承有什么特色?

1.在继承中基类的构造(__init__()方法)不会被自动调用,它须要在其派生类的构造中亲自专门调用。

2.在调用基类的方法时,须要加上基类的类名前缀,且须要带上self参数变量。

区别于在类中调用普通函数时并不须要带上self参数

3.Python老是首先查找对应类型的方法,若是它不能在派生类中找到对应的方法,它才开始到基类中逐个查找,

即先在本类中查找调用的方法,找不到才去基类中找。

 

59. 面向对象深度优先和广度优先是什么?

在经典类中,是深度优先,先把一条线查完

在新式类中,广度优先(顺着一条线查,若是还有别的路能够查到一个类,这条路就终止了,换一条线查)

python3中都是新式类,在python中若是你建立了一个类,而且该类没有继承任意类,那么他就是一个经典类

 

60. 面向对象中super的做用?

调用父类的方法

 

61. 是否使用过functools中的函数?其做用是什么?

装饰器修复的函数functool.wraps

functools.reduce(function, iterable[, initializer]),对可迭代对象进行函数处理

partial对象

 

62. 列举面向对象中带爽下划线的特殊方法,

__init__(self,...) 、__del__(self) 、__call__(self, *args) 、

__str__(self方法)、__add__、__dic__、__getitem__、__setitem__、__delitem__、__iter__

 

63.如何判断是函数仍是方法?

isinstance(obj, FunctionType)  

isinstance(obj, MethodType)

 

64. 静态方法和类方法区别?

静态方法 : 至关于在类做用域下的普通函数,不进行与类或实例相关的操做,不使用类或实例的资源

类方法 : 由类调用,进行与类有关的操做

65. 列举面向对象中的特殊成员以及应用场景

1. __doc__表示类的描述信息

2. __module__ 和  __class__

  __module__ 表示当前操做的对象在哪一个模块

__class__     表示当前操做的对象的类是什么

3. __init__

构造方法,经过类建立对象时,自动触发执行。

4. __del__

析构方法,当对象在内存中被释放时,自动触发执行。

5. __call__

   对象后面加括号,触发执行。

6. __dict__

   类或对象中的全部成员

7. __str__

若是一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。

八、__getitem__、__setitem__、__delitem__

用于索引操做,如字典。以上分别表示获取、设置、删除数据

九、__getslice__、__setslice__、__delslice__

该三个方法用于分片操做,如:列表      slice  : 切片 切割

10. __iter__

用于迭代器,之因此列表、字典、元组能够进行for循环,是由于类型内部定义了 __iter__

11. __new__ 和 __metaclass__

 

66. 一、二、三、四、5 能组成多少个互不相同且无重复的三位数

list1 = [i*100+j*10+k for i in range(1,10) for j in range(1,10) for k in range(1,10)]

print(len(list1))

 

67.什么是反射?以及应用场景?

利用字符串获取对象的属性或方法,WEB框架的CBV,DRF接口框架中使用了大量反射

 

68. metaclass做用?以及应用场景?

metaclass是类的产生类,而并不是继承类

经过它来控制类的产生,以及类实例化的操做

form组件中经过meta类控制字段

 

69.用尽可能多的方法实现单例模式。

使用模块

使用装饰器

使用类

使用__new__方法

基于metaclass方式

 

70. 装饰器的写法以及应用场景。

def wrapper(f):

def inner(*args,**kwargs):

#函数执行前操做

ret = f(*args,**kwargs)

#函数执行后操做

return ret

return inner

 

@wrapper

def func(*args,**kwargs):

pass

 

应用场景:

1.能够在外层函数加上时间计算函数,计算函数运行时间;

 

2.计算函数运行次数;

3.能够用在框架的路由传参上;

4.插入日志,做为函数的运行日志;

5.事务处理,可让函数实现事务的一致性,让函数要么一块儿运行成功,要么一块儿运行失败;

6.缓存,实现缓存处理;

7.权限的校验,在函数外层套上权限校验的代码,实现权限校验;

 

71.异常处理写法以及如何主动抛出异常(应用场景)

raise 异常名称(‘异常描述’)  语句主动抛出异常

应用场景时mysql操做数据库时,保证事务一致性

 

72. 什么是面向对象的mro

mro即method resolution order,主要用于在多继承时判断调的属性的路径(来自于哪一个类)

mro基于c3算法

 

73. isinstance做用以及应用场景?

判断对象是否是一个类的子类或者后代类的对象,判断对象是方法仍是函数

 

74. 写代码并实现:

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would

have exactly one solution, and you may not use the same element twice.

Example:


  Given nums = [2, 7, 11, 15], target = 9,

   
Because nums[0] + nums[1] = 2 + 7 = 9,


   return [0, 1]

   

def func(iter,target):

for i in iter:

if target-i in iter:

findex = iter.index(i)

sindex = iter.index(target-i)

return [findex,sindex]

else:

pass

else:

return '没有符合条件的'

 

75. json序列化时,能够处理的数据类型有哪些?如何定制支持datetime类型?

字符串、列表、字典、数字、布尔值、None

自定义类

class MyTime(json.JSONEncoder):

def default(self, o): # o是数据类型

if isinstance(o,datetime.datetime):

return o.strftime('%Y-%m-%d')

else:

return super(MyTime,self).default(o)

 

76.json序列化时,默认遇到中文会转换成unicode,若是想要保留中文怎么办?

dumps时指定ensure_ascii=False

 

77. 什么是断言?应用场景?

断言条件为真时代码继续执行,不然抛出异常,这个异常一般不会去捕获他.

咱们设置一个断言目的就是要求必须实现某个条件

 

78.  有用过with statement吗?它的好处是什么?

with语句的做用是经过某种方式简化异常处理,它是所谓的上下文管理器的一种

一、解决异常退出时资源释放的问题;

二、解决用户忘记调用close方法而产生的资源泄漏问题;

79.使用代码实现查看列举目录下的全部文件。

def print_directory_contents(sPath):

    import os

  

    for sChild in os.listdir(sPath):

        sChildPath = os.path.join(sPath, sChild)

        if os.path.isdir(sChildPath):

            print_directory_contents(sChildPath)

        else:

            print(sChildPath)

 

80.简述 yield和yield from关键字。

yield : 生成器函数关键字

yield from : 至关于for i in obj : yield i

 

网络编程                                                            

 1.简述 OSI 七层协议。

为了实现计算机系统的互连,OSI参考模型把整个网络的通讯功能划分为7个层次,

同时也定义了层次之间的相互关系以及各层所包括的服务及每层的功能。

OSI的七层由低到高依次为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层,

下三层(物理层、数据链路层、网络层)面向数据通讯,

而上三层(会话层、表示层、应用层)则面向资源子网,

而传输层则是七层中最为重要的一层。它位于上层和下层中间,起承上启下的做用。

 

应用层

与其它计算机进行通信的一个应用,它是对应应用程序的通讯服务的。

例如,一个没有通讯功能的字处理程序就不能执行通讯的代码,从事字处理工做的程序员也不关心OSI的第7层。

可是,若是添加了一个传输文件的选项,那么字处理器的程序员就须要实现OSI的第7层。

示例:TELNET,HTTP,FTP,NFS,SMTP等。

表示层

这一层的主要功能是定义数据格式及加密。

例如,FTP容许你选择以二进制或ASCII格式传输。若是选择二进制,那么发送方和接收方不改变 文件的内容。

若是选择ASCII格式,发送方将把文本从发送方的字符集转换成标准的ASCII后发送数据。

在接收方将标准的ASCII转换成接收方计算机的字符集。示例:加密,ASCII等。

会话层

它定义了如何开始、控制和结束一个会话,包括对多个双向消息的控制和管理,

以便在只完成连续消息的一部分时能够通知应用,

从而使表示层看到的数据是连续的,在某些状况下,若是表示层收到了全部的数据,

则用数据表明表示层。示例:RPC,SQL等。

传输层

这层的功能包括是否选择差错恢复协议仍是无差错恢复协议,

及在同一主机上对不一样应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的从新排序功能。

示例:TCP,UDP,SPX。

网络层

这层对端到端的包传输进行定义,它定义了可以标识全部结点的逻辑地址,

还定义了路由实现的方式和学习的方式。为了适应最大传输单元长度小于包长度的传输介质,

网络层还定义了如何将一个包分解成更小的包的分段方法。示例:IP,IPX等。

数据链路层

它定义了在单个链路上如何传输数据。这些协议与被讨论的各类介质有关。示例:ATM,FDDI等。

物理层

OSI的物理层规范是有关传输介质的特这些规范一般也参考了其余组织制定的标准。

链接头、帧、帧的使用、电流、编码及光调制等都属于各类物理层规范中的内容。

物理层经常使用多个规范完成对全部细节的定义。示例:Rj45,802.3等。

 

2.什么是C/S和B/S架构?

C/S 架构的概念

C/S是Client/Server,即客户端/服务器端架构,一种典型的两层架构。

客户端包含一个或多个在用户的电脑上运行的程序

服务器端有两种,一种是数据库服务器端,客户端经过数据库链接访问服务器端的数据;

另外一种是Socket服务器端,服务器端的程序经过Socket与客户端的程序通讯。

C/S 能够看作是胖客户端架构

由于客户端须要实现绝大多数的业务逻辑和界面展现。做为客户端的部分须要承受很大的压力,

由于显示逻辑和事务处理都包含在其中,

经过与数据库的交互(一般是SQL或存储过程的实现)来达到持久化数据,以此知足实际项目的须要。

 

C/S 优势和缺点

 

优势: 1)界面和操做能够很丰富

2) 安全性能能够很容易保证,实现多层认证也不难

3)因为只有一层交互,所以响应速度较快。

 

缺点: 1)适用面窄,一般用于局域网中

2)用户群固定。因为程序须要安装才可以使用,所以不适合面向一些不可知的用户

      3)维护成本高。发生一次升级,则全部客户端的程序都须要改变。

 

B/S 架构的概念

B/S是Browser/Server,即浏览器/服务器架构。

Browser指的是Web浏览器,极少数事务逻辑在前端实现,但主要事务逻辑在服务器端实现,Browser客户端,WebApp服务器端和DB端构成所谓的三层架构。

B/S架构的系统无须特别安装,只有Web浏览器便可。

B/S 能够看作是瘦客户端架构

B/S架构中,显示逻辑交给了Web浏览器,事务处理逻辑在放在了WebApp上,这样就避免了庞大的胖客户端,减小了客户端的压力。由于客户端包含的逻辑不多,所以也被成为瘦客户端。

 

C/S 优势和缺点

优势:(1)客户端无需安装,有Web浏览器便可 (2)BS架构能够直接放在广域网上,经过必定的权限控制实现多客户访问的目的,交互性较强。(3)BS架构无需升级多个客户端,升级服务器便可。

 

缺点:(1)在跨浏览器上,BS架构不尽如人意。(2)表现要达到CS程序的程度须要花费很多精力。(3)在速度和安全性上须要花费巨大的设计成本,这是BS架构的最大问题。(4)C和S交互是请求-响应模式,一般须要刷新页面,这并非客户乐意看到的。(在Ajax风行后此问题获得了必定程度的缓解)

 

3.简述 三次握手、四次挥手的流程。

三次握手

TCP/IP协议中,TCP协议提供可靠的链接服务,采用三次握手创建一个链接

1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,

Client进入SYN_SENT状态,等待Server确认。        (

2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求创建链接,

Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,

并将该数据包发送给Client以确认链接请求,Server进入SYN_RCVD状态。        (

3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,

若是正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,

Server检查ack是否为K+1,ACK是否为1,若是正确则链接创建成功,Client和Server进入ESTABLISHED状态,

完成三次握手,随后Client与Server之间能够开始传输数据了

四次握手

所谓四次挥手(Four-Way Wavehand)即终止TCP链接,就是指断开一个TCP链接时,

须要客户端和服务端总共发送4个包以确认链接的断开

1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

    (2)第二次挥手:Server收到FIN后,发送一个ACK给Client,

确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。       

3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

 

4.什么是arp协议?

地址解析协议ARP(Address Resolution Protocol),负责完成逻辑地址向物理地址的动态映射,

32位逻辑地址(IP地址)转换为48位的物理地址(MAC地址)

 

ARP是经过一个查找表(ARP缓存)来执行这种转换的。

当在ARP缓存中没有找到地址时,则向网络发送一个广播请求,

网络上全部的主机和路由器都接收和处理这个ARP请求,

可是只有相同IP地址的接收到广播请求的主机或路由器,发回一个ARP应答分组,

应答中包含它的IP地址和物理地址,并保存在请求主机的ARP缓存中

1) 本地主机在局域网中广播ARP请求,ARP请求数据帧中包含目的主机的IP地址。

意思是“若是你是这个IP地址的拥有者,请回答你的硬件地址”。

2) 目的主机的ARP层解析这份广播报文,识别出是询问其硬件地址。因而发送ARP应答包,

里面包含IP地址及其对应的硬件地址。

3) 本地主机收到ARP应答后,知道了目的地址的硬件地址,以后的数据报就能够传送了。

 

5. TCP和UDP的区别?

一、TCP面向链接(如打电话要先拨号创建链接);UDP是无链接的,即发送数据以前不须要创建链接

二、TCP提供可靠的服务。也就是说,经过TCP链接传送的数据,无差错,不丢失,不重复,且按序到达;

UDP尽最大努力交付,即不保证可靠交付

三、TCP面向字节流,其实是TCP把数据当作一连串无结构的字节流;UDP是面向报文的

UDP没有拥塞控制,所以网络出现拥塞不会使源主机的发送速率下降

(对实时应用颇有用,如IP电话,实时视频会议等)

四、每一条TCP链接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通讯

五、TCP首部开销20字节;UDP的首部开销小,只有8个字节

六、TCP的逻辑通讯信道是全双工的可靠信道,UDP则是不可靠信道

 

6.什么是局域网和广域网?

局域网(Local Area Network),简称LAN,是指在某一区域内由多台计算机互联成的计算机组。

“某一区域”指的是同一办公室、同一建筑物、同一公司和同一学校等,通常是方圆几公里之内。

局域网能够实现文件管理、应用软件共享、打印机共享、扫描仪共享、工做组内的日程安排、

电子邮件和传真通讯服务等功能。局域网是封闭型的,能够由办公室内的两台计算机组成,

也能够由一个公司内的上千台计算机组成。

 

广域网

广域网(Wide Area Network),简称WAN,是一种跨越大的、地域性的计算机网络的集合。

一般跨越省、市,甚至一个国家。广域网包括大大小小不一样的子网,子网能够是局域网,

也能够是小型的广域网。

 

7. 为什么基于tcp协议的通讯比基于udp协议的通讯更可靠?

TCP的可靠保证,是它的三次握手双向机制,这一机制保证校验了数据,保证了他的可靠性。

UDP就没有了,udp信息发出后,不验证是否到达对方,因此不可靠

 

8. 什么是socket?简述基于tcp协议的套接字通讯流程。

什么是socket?

简单来说,Socket是网络应用程序接口,是应用层到传送层的接口。

也就是用户进程,与系统内核的接口,即API。

网络上的两个程序经过一个双向的通讯链接实现数据的交换,这个链接的一端称为一个socket。

TCP Socket通讯的基本流程

①服务端建立一个ServerSocket对象,指定端口号,ServerSocket对象等待客户端的链接请求。

②客户端建立一个Socket对象,指定主机地址和端口号,向服务端发出链接请求。

③服务端接收到客户端的链接请求,创建一条TCP链接,再建立一个Socket对象与客户端的Socket对象进行通讯。

④服务端和客户端分别建立字节输入流和字节输出流,经过字节输入流得到对方发来的数据,经过字节输出流向对方发送数据。

⑤当一方决定结束通讯时,向对方发送结束信息;另外一方接收到结束信息后,双方分别关闭各自的TCP链接。

⑥ServerSocket对象中止等待客户端的链接请求。

 

9.什么是粘包? socket 中形成粘包的缘由是什么? 哪些状况会发生粘包现象?

  TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,

从接收缓冲区看,后一包数据的头紧接着前一包数据的尾

所以TCP协议是面向流的协议,这也是容易出现粘包问题的缘由

所谓粘包问题主要仍是由于接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所形成的。

 

粘包状况

1)发送方缘由

  咱们知道,TCP默认会使用Nagle算法。而Nagle算法主要作两件事:

1)只有上一个分组获得确认,才会发送下一个分组;

2)收集多个小分组,在一个确认到来时一块儿发送。

  因此,正是Nagle算法形成了发送方有可能形成粘包现象。

 (2)接收方缘由

  TCP接收到分组时,并不会马上送至应用层处理,

或者说,应用层并不必定会当即处理;

实际上,TCP将收到的分组保存至接收缓存里,而后应用程序主动从缓存里读收到的分组。

这样一来,若是TCP接收分组的速度大于应用程序读分组的速度,多个包就会被存至缓存,

应用程序读时,就会读到多个首尾相接粘到一块儿的包。

 

10. IO多路复用的做用?

I/O多路复用是用于提高效率,单个进程能够同时监听多个网络链接IO

I/O是指Input/Output

I/O多路复用,经过一种机制,能够监视多个文件描述符,

一旦描述符就绪(读就绪和写就绪),能通知程序进行相应的读写操做。

I/O多路复用避免阻塞在io上,

本来为多进程或多线程来接收多个链接的消息变为单进程或单线程保存多个socket的状态后轮询处理.

 

11. 什么是防火墙以及做用?

防火墙指的是一个由软件和硬件设备组合而成、在内部网和外部网之间、

专用网与公共网之间的界面上构造的保护屏障,是一种获取安全性方法的形象说法,

它是一种计算机硬件和软件的结合,使Internet与Intranet之间创建起一个安全网关(Security Gateway),

从而保护内部网免受非法用户的侵入。

 

防火墙的功能

加强的保密性

使用Firewall能够阻止攻击者获取攻击网络系统的有用信息,如Figer和DNS。

记录和统计网络利用数据以及非法使用数据,Firewall能够记录和统计经过Firewall的网络通信,

提供关于网络使用的统计数据,而且,Firewall能够提供统计数据, 来判断可能的攻击和探测。

保护脆弱的服务

经过过滤不安全的服务,Firewall能够极大地提升网络安全和减小子网中主机的风险。

例如, Firewall能够禁止NIS、NFS服务经过,Firewall同时能够拒绝源路由和ICMP重定向封包。

控制对系统的访问

Firewall能够提供对系统的访问控制。如容许从外部访问某些主机,

同时禁止访问另外的主机。例如, Firewall容许外部访问特定的Mail Server和Web Server。

集中的安全管理

Firewall对企业内部网实现集中的安全管理,在Firewall定义的安全规则能够运行于整个内部网络系统,

而无须在内部网每台机器上分别设立安全策略。Firewall能够定义不一样的认证方法,

而不须要在每台机器上分别安装特定的认证软件。外部用户也只须要通过一次认证便可访问内部网。

 

12. select、poll、epoll 模型的区别?

elect,poll,epoll本质上都是同步I/O,由于他们都须要在读写事件就绪后本身负责进行读写,

也就是说这个读写过程是阻塞的

 

select

每次调用select,都须要把fd集合从用户态拷贝到内核态,这个开销在fd不少时会很大

同时每次调用select都须要在内核遍历传递进来的全部fd,这个开销在fd不少时也很大

select支持的文件描述符数量过小了,默认是1024

 

1)select,poll实现须要本身不断轮询全部fd集合,直到设备就绪,期间可能要睡眠和唤醒屡次交替。

epoll其实也须要调用epoll_wait不断轮询就绪链表,期间也可能屡次睡眠和唤醒交替,

可是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,

并唤醒在epoll_wait中进入睡眠的进程。虽然都要睡眠和交替,

可是select和poll在“醒着”的时候要遍历整个fd集合,

epoll在“醒着”的时候只要判断一下就绪链表是否为空就好了,这节省了大量的CPU时间。

这就是回调机制带来的性能提高。

2)select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,

而且要把current往设备等待队列中挂一次,而epoll只要一次拷贝,

并且把current往等待队列上挂也只挂一次(在epoll_wait的开始,注意这里的等待队列并非设备等待队列,

只是一个epoll内部定义的等待队列)。这也能节省很多的开销。

 

 

13. 简述 进程、线程、协程的区别 以及应用场景?

一、进程

进程是具备必定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。

每一个进程都有本身的独立内存空间,不一样进程经过进程间通讯来通讯。

因为进程比较重量,占据独立的内存,因此上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,

但相对比较稳定安全。

 

  二、线程

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.

线程本身基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),

可是它可与同属一个进程的其余的线程共享进程所拥有的所有资源。线程间通讯主要经过共享内存,

上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。

 

  三、协程

协程是一种用户态的轻量级线程,协程的调度彻底由用户控制。协程拥有本身的寄存器上下文和栈。

协程调度切换时,将寄存器上下文和栈保存到其余地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,

直接操做栈则基本没有内核切换的开销,能够不加锁的访问全局变量,因此上下文的切换很是快

区别:

  一、进程多与线程比较

线程是指进程内的一个执行单元,也是进程内的可调度实体。线程与进程的区别:

1) 地址空间:线程是进程内的一个执行单元,进程内至少有一个线程,它们共享进程的地址空间,

而进程有本身独立的地址空间

2) 资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源

3) 线程是处理器调度的基本单位,但进程不是

4) 两者都可并发执行

5) 每一个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,可是线程不可以独立执行,

必须依存在应用程序中,由应用程序提供多个线程执行控制

  二、协程多与线程进行比较

1) 一个线程能够多个协程,一个进程也能够单独拥有多个协程,这样python中则能使用多核CPU。

2) 线程进程都是同步机制,而协程则是异步

3) 协程能保留上一次调用时的状态,每次过程重入时,就至关于进入上一次调用的状态

 

应用场景:

一、多进程通常使用multiprocessing库,来利用多核CPU,主要是用在CPU密集型的程序上,

固然生产者消费者这种也可使用。多进程的优点就是一个子进程崩溃并不会影响其余子进程和主进程的运行,

但缺点就是不能一次性启动太多进程,会严重影响系统的资源调度,特别是CPU使用率和负载。

  二、多线程通常是使用threading库,完成一些IO密集型并发操做。

多线程的优点是切换快,资源消耗低,但一个线程挂掉则会影响到全部线程,因此不够稳定。

  三、协程通常是使用gevent库,固然这个库用起来比较麻烦,因此使用的并非不少。

相反,协程在tornado的运用就多得多了,使用协程让tornado作到单线程异步,听说还能解决C10K的问题。

因此协程使用的地方最多的是在web应用上。

 

总结一下就是IO密集型通常使用多线程或者多进程,CPU密集型通常使用多进程,

强调非阻塞异步并发的通常都是使用协程,固然有时候也是须要多进程线程池结合的,或者是其余组合方式。

 

14. GIL锁是什么鬼?

Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,

任何Python线程执行前,必须先得到GIL锁,而后,每执行100条字节码,解释器就自动释放GIL锁,

让别的线程有机会执行。这个GIL全局锁实际上把全部线程的执行代码都给上了锁,

因此,多线程在Python中只能交替执行,即便100个线程跑在100核CPU上,也只能用到1个核。

 

GIL是Python解释器设计的历史遗留问题,一般咱们用的解释器是官方实现的CPython,

要真正利用多核,除非重写一个不带GIL的解释器。

因此,在Python中,可使用多线程,但不要期望能有效利用多核。若是必定要经过多线程利用多核,

那只能经过C扩展来实现,不过这样就失去了Python简单易用的特色。

不过,也不用过于担忧,Python虽然不能利用多线程实现多核任务,但能够经过多进程实现多核任务。

多个Python进程有各自独立的GIL锁,互不影响。

 

15. Python中如何使用线程池和进程池?

Python标准库为咱们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,

可是当项目达到必定的规模,频繁建立/销毁进程或者线程是很是消耗资源的,

这个时候咱们就要编写本身的线程池/进程池,以空间换时间。

但从Python3.2开始,标准库为咱们提供了concurrent.futures模块,

它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,实现了对threading和multiprocessing的进一步抽象,

对编写线程池/进程池提供了直接的支持。

 

16. threading.local的做用?

为每一个线程建立一个独立的空间,使得线程对本身的空间中的数据进行操做(数据隔离)。

17. 进程之间如何进行通讯?

一、无名管道通讯

  无名管道( pipe ):管道是一种半双工的通讯方式,数据只能单向流动,并且只能在具备亲缘关系的进程间使用。

进程的亲缘关系一般是指父子进程关系。

  二、高级管道通讯

  高级管道(popen):将另外一个程序当作一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,

这种方式咱们成为高级管道方式。

  三、有名管道通讯

  有名管道 named pipe) : 有名管道也是半双工的通讯方式,可是它容许无亲缘关系进程间的通讯。

  四、消息队列通讯

  消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。

消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

  五、信号量通讯

  信号量( semophore ) : 信号量是一个计数器,能够用来控制多个进程对共享资源的访问。

它常做为一种锁机制,防止某进程正在访问共享资源时,其余进程也访问该资源。

所以,主要做为进程间以及同一进程内不一样线程之间的同步手段。

  六、信号

  信号 sinal ) : 信号是一种比较复杂的通讯方式,用于通知接收进程某个事件已经发生。

  七、共享内存通讯

  共享内存( shared memory ) :共享内存就是映射一段能被其余进程所访问的内存,

这段共享内存由一个进程建立,但多个进程均可以访问。共享内存是最快的 IPC 方式,

它是针对其余进程间通讯方式运行效率低而专门设计的。它每每与其余通讯机制,如信号两,配合使用,

来实现进程间的同步和通讯。

  八、套接字通讯

  套接字( socket ) : 套接口也是一种进程间通讯机制,与其余通讯机制不一样的是,

它可用于不一样机器间的进程通讯。

 

18. 什么是并发和并行?

并发:指应用可以交替执行不一样的任务,例:吃完饭->喝水 喝完水->睡觉 一觉醒来->吃饭......

并行:指应用可以同时执行不一样的任务,例:吃饭的时候能够边吃饭边打电话,这两件事情能够同时执行

二者区别:一个是交替执行,一个是同时执行.

 

19. 进程锁和线程锁的做用?

线程锁:

你们都不陌生,主要用来给方法、代码块加锁。当某个方法或者代码块使用锁时,

那么在同一时刻至多仅有有一个线程在执行该段代码。当有多个线程访问同一对象的加锁方法/代码块时,

同一时间只有一个线程在执行,其他线程必需要等待当前线程执行完以后才能执行该代码段。

可是,其他线程是能够访问该对象中的非加锁代码块的。

 

  进程锁:

也是为了控制同一操做系统中多个进程访问一个共享资源,只是由于程序的独立性,

各个进程是没法控制其余进程对资源的访问的,可是可使用本地系统的信号量控制(操做系统基本知识)。

 

  分布式锁:

当多个进程不在同一个系统之中时,使用分布式锁控制多个进程对资源的访问。

 

20. 解释什么是异步非阻塞?

同步和异步

同步就是烧开水,须要本身去轮询(每隔一段时间去看看水开了没),异步就是水开了,

而后水壶会通知你水已经开了,你能够回来处理这些开水了。

同步和异步是相对于操做结果来讲,会不会等待结果返回。

 

阻塞和非阻塞

阻塞就是说在煮水的过程当中,你不能够去干其余的事情,非阻塞就是在一样的状况下,

能够同时去干其余的事情。阻塞和非阻塞是相对于线程是否被阻塞。

 

这二者存在本质的区别,它们的修饰对象是不一样的。

阻塞和非阻塞是指进程访问的数据若是还没有就绪,

进程是否须要等待,简单说这至关于函数内部的实现区别,也就是未就绪时是直接返回仍是等待就绪。

而同步和异步是指访问数据的机制,同步通常指主动请求并等待I/O操做完毕的方式,

当数据就绪后在读写的时候必须阻塞,异步则指主动请求数据后即可以继续处理其它任务,

随后等待I/O,操做完毕的通知,这可使进程在数据读写时也不阻塞。

 

21. 路由器和交换机的区别?

1.

路由器能够给你的局域网自动分配IP,虚拟拨号,就像一个交通警察,指挥着你的电脑该往哪走,你本身不用操心那么多了。

交换机只是用来分配网络数据的。

2.

路由器在网络层,路由器根据IP地址寻址,路由器能够处理TCP/IP协议,交换机不能够。

交换机在中继层,交换机根据MAC地址寻址。

 

3. 路由器能够把一个IP分配给不少个主机使用,这些主机对外只表现出一个IP。

交换机能够把不少主机连起来,这些主机对外各有各的IP。

 

4.

路由器提供防火墙的服务,交换机不能提供该功能。集线器、交换机都是作端口扩展的,

就是扩大局域网(一般都是以太网)的接入点,也就是能让局域网能够连进来更多的电脑。

路由器是用来作网间链接,也就是用来链接不一样的网络。

5.

全部邮局构成的系统,就是“广域网”,而你的宿舍楼,就是“局域网”,构建局域网是不须要路由器的。

 

22. 什么是域名解析?

域名解析是把域名指向网站空间IP,让人们经过注册的域名能够方便地访问到网站的一种服务.

域名解析就是域名到IP地址的转换过程。域名的解析工做由DNS服务器完成。

 

23. 如何修改本地hosts文件?

hosts文件里面存放的是ip地址、主机名和主机缩略名的内容,通常能够用于测试本机上的网站

hosts文件位于C:\Windows\System32\drivers\etc文件夹中

记得使用管理员权限不然没法修改。

osts记录规则很是简单,只须要将你的记录以 “IP + 空格 + 域名” 的格式填写便可。

如:192.168.0.1 cpaneleasy.com

保存后经过cmd命令行进行ping测试,就会发现域名的解析地址已经变动为你所但愿的了。

 

24. 生产者消费者模型应用场景及优点?

这样一种状况:某个模块负责产生数据,这些数据由另外一个模块来负责处理(此处的模块是广义的,

能够是类、函数、线程、进程等)。产 生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。

在生产者与消费者之间在加个缓冲区,咱们形象的称之为仓库,生产者负责往仓库了进商品,

而消费者负责从仓库里拿商品,这就构成了生产者消费者模型。

 

模式的应用场景:处理数据比较消耗时间,线程独占,生产数据不须要即时的反馈等。

25. 什么是cdn?

CDN的全称是Content Delivery Network,即内容分发网络。

其基本思路是尽量避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,

使内容传输的更快、更稳定。经过在网络各处放置节点服务器所构成的在现有的互联网基础之上

的一层智能虚拟网络,CDN系统可以实时地根据网络流量和各节点的链接、

负载情况以及到用户的距离和响应时间等综合信息将用户的请求从新导向离用户最近的服务节点上。

其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的情况,提升用户访问网站的响应速度。

 

26. LVS是什么及做用?

LVS即Linux虚拟服务器,是一个虚拟的四层交换器集群系统,

根据目标地址和目标端口实现用户请求转发,自己不产生流量,只作用户请求转发。

2七、Nginx是什么及做用?

Nginx是一个轻量级、高性能、稳定性高、并发性好的HTTP和反向代理服务器。

2八、keepalived是什么及做用?

Keepalived是Linux下一个轻量级别的高可用解决方案。

高可用,其实两种不一样的含义:广义来说,是指整个系统的高可用行,狭义的来说就是之主机的冗余和接管,

2九、haproxy是什么以及做用?

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代 理,支持虚拟主机,它是免费、快速而且可靠的一种解决方案。

HAProxy特别适用于那些负载特大的web站点,这些站点一般又须要会话保持或七层处理。HAProxy运行在当前的硬件上,

彻底能够支持数以万计的并发链接。而且它的运行模式使得它能够很简单安全的整合进您当前的架中,

同时能够保护你的web服务器不被暴露到网络上。

30、什么是负载均衡?

负载均衡有两方面的含义:

首先,大量的并发访问或数据流量分担到多台节点设备上分别处理,减小用户等待响应的时间;

其次,单个重负载的运算分担到多台节点设备上作并行处理,每一个节点设备处理结束后,

将结果汇总,返回给用户,系统处理能力获得大幅度提升。

3一、什么是rpc及应用场景?

RPC 的全称是 Remote Procedure Call 是一种进程间通讯方式。

它容许程序调用另外一个地址空间(一般是共享网络的另外一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。

即程序员不管是调用本地的仍是远程的,本质上编写的调用代码基本相同(例如QQ远程操做)

3二、简述 asynio模块的做用和应用场景。

asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。

asyncio的异步操做,须要在coroutine中经过yield from完成。

3三、简述 gevent模块的做用和应用场景。

Gevent 是一个第三方库,能够轻松经过gevent实现并发同步或异步编程,

gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程。

Greenlet所有运行在主程序操做系统进程的内部,但它们被协做式地调度。

3四、twisted框架的使用和应用?

Twisted是一个事件驱动型的网络模型。

时间驱动模型编程是一种范式,这里程序的执行流由外部决定。

特色是:包含一个事件循环,当外部事件发生时,使用回调机制来触发相应的处理。

相关文章
相关标签/搜索