python面试题汇总

1、and或or


v= 1 and 3 and 2
print(v)
2

v= 1 and 3 and 0
print(v)
0

v = 1  or  2  or  0
print(v)
1

v = 1  and  2  or  0
print(v)
2

Python中的and从左到右计算表达式,若所有的值均为真,则返回最后一个值,若存在假,返回第一个假值

or也是从左到右计算表达式,返回第一个为真的值

2、GIL锁

全局解释器锁,同一时刻只能有一个线程访问CPU,锁的是线程,线程本身可以在同一时间使用多个CPU,Cpython解释器防止在解释代码的过程中产生数据不安全问题。

3、is和==的区别

Python中包含三个基本元素:ID(身份标识),type(数据类型),value(值)

其中ID用来唯一标识一个对象,type标识对象类型,value标识对象的一个值

is判断的是a对象是否就是b对象,是通过ID来判断

==判断的是a对象的值是否和b对象的值相等,是通过value来判断,,所以is 就是判断两个对象的id是否相同, 而 == 判断的则是内容是否相同。

4、 Python中的可变对象和不可变对象

不可变对象:对象所指向的内存中的值不能被改变,当改变这个变量的时候,原来指向的内存中的值不变,变量不再指向原来的值,而是开辟一块新的内存,变量指向新的内存。

通俗来讲变量值改变,id值也改变,例如:

a = 'hello'
print(id(a))

a = a+'hi'
print(id(a))


1579546360552
1579547940488

 数值类型int 、float、 字符串str 、元祖tuple、boole 都是不可变对象

可变对象:对象指向的内存中的值会改变,当更改这个变量的时候,还是指向原来内存中的值,并且在原来的内存值进行原地修改,并没有开辟新的内存。

dic = {
    'name':'alex',
    'age':18
}
print(id(dic))

dic['hobby']='lanqiu '
print(id(dic))

1579542439176
1579542439176

 列表list、集合set、字典dict都是可变对象

5、osi七层协议复习总结

6、TCP与UDP的复习总结

 TCP:传输控制协议,是一种面向连接的、可靠地字节流服务,当客户端与服务端交换数据时,首先要建立起一个TCP链接,之后才传输数据,TCP提供超市重传,丢弃重复数据,检查数据,流量控制等功能。保证数据从一段传到另一端。

UDP:用户数据包协议,是一个简单的面向数据包的传输层协议,尽最大努力交付报文。传输速度比较快,容易丢包。

7、阻塞IO,非阻塞IO

IO的操作分为两步,等待数据准备和将数据从操作系统内核拷贝至内存,阻塞IO是指一直等待数据准备好拿到数据。非阻塞IO是指当用户进程发出read操作时,如果kernel中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个error。从用户进程角度讲 ,它发起一个read操作后,并不需要等待,而是马上就得到了一个结果。用户进程判断结果是一个error时,它就知道数据还没有准备好,于是它可以再次发送read操作。一旦kernel中的数据准备好了,并且又再次收到了用户进程的system call,那么它马上就将数据拷贝到了用户内存,然后返回。

8、同步和异步

 所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。

 所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列

9、一行代码实现九九乘法表

for  i  in  range(1,10):
    for j  in  range(1,i+1):
        print('{}*{}={}'.format(j,i,i*j) ,end='  ')
    print('
',end='')
ret ='
'.join([ ' '.join(['{}*{}={}'.format(y,x,x*y)  for y  in range(1,x+1) ]) for x  in range(1,10)  ])
print(ret)

 10、类的继承

11、*args和**kwargs

*args可以传递任意数量的的位置参数,以元组的形式存储

**kwargs可以传递任意数量的关键字参数,以字典的形式存储

*args和**kwargs可以同时定义在函数中,但必须*args放在**kwargs前面

def  foo(*args,**kwargs):
    print('*args',*args,)
    print('args',args)
    print('kwargs',kwargs)

foo(1,x=1,**{'name':'dog'})

结果
*args 1
args (1,)
kwargs {'x': 1, 'name': 'dog'}

12 、lambda函数

lambda函数比较方便,匿名函数,一般用来给filter,map这样的函数式编程服务,作为回调函数传递给某些应用,比如消息处理

13、装饰器

def outer(func,*args):
    def  inner(*args):
        print('先洗苹果')
        ret = func()
        print('吃完了')
        return ret
    return inner

@outer
def eat():
    print('吃苹果')

eat()

装饰器的本质:装饰器 = 高阶函数 + 函数嵌套 + 闭包

高阶函数:把函数当做参数传给另外一个函数,返回值中包含函数。

装饰器的功能:就是在不改变原函数的调用方式的情况下,在这个函数的前后加上扩展功能

14、作用域

1、作用域即范围:全局范围(内置名称空间和全局名称空间属于该范围):全局存活,全局有效      局部范围(局部名称空间属于该范围):临时存活,局部有效

2、作用域关系是在函数定义阶段就已经固定的,与函数调用的位置无关

3、查看作用域 :globals()全局变量,locals()局部变量

当 Python 遇到一个变量的话他会按照这样的顺序进行搜索:
本地作用域(Local)→当前作用域被嵌入的本地作用域(Enclosing locals)→全局/模块作用域(Global)→内置作用域(Built-in)

 15、闭包函数

定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包
创建一个闭包必须满足以下几点:
  1. 必须有一个内嵌函数
  2. 内嵌函数必须引用外部函数中的变量
  3. 外部函数的返回值必须是内嵌函数
def foo():
    name = 'foo'
    def  inner():
        print(name)
    return inner

ret = foo()
ret()

 16、cookies和session的区别

cookie的由来 :由于http请求是没有状态的,每次请求都是独立的。

什么是cookie:就是服务端设置然后保存在浏览器上的字符串、键值对

服务端控制着响应,在想盈利可以让浏览器在本地保存cookie键值对,下一次请求时携带这个cookie值。

cookie的应用:1、登录,七天免登录。2、记录用户浏览器习惯。3.简单的投票限制。

session是保存在字典里的键值对,必须依赖于cookie。

优势,相对于cookie安全,存数据多,但是占用资源。

17、Django中的MTV分别代表什么:

M代表什么model(模型):负责业务对象和数据对象

T代表Template(模板):负责如何把页面展示给用户

V代表Views(视图):负责业务逻辑,并在适当的时候调用model和template

18、什么是同源策略

同源策略是一种约定,它是浏览器最核心也是最基本的安全功能,如果缺少同源策略,则浏览器的正常功能都会受到影响,可以说web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

所谓同源是指,域名,协议,端口相同。

19、jsonp

jsonp是json用来跨域的一个东西,原理是通过script标签的跨域特性来绕过同源策略

jsonp一定是GET请求

20、ajax常用的参数

URL:发送请求的地址

data:发送到服务器的数据,当前ajax请求要携带的数据,是一个json的object对象,ajax方法就会默认地把它编码成某种格式

processdata:生命当前data数据是否进行转码或者预处理,默认为True

contentType:默认值“application/x-www-form-urlencoded”,发送请求至服务器时内容编码类型,用来指明当前请求的数据编码格式,如果想以其他方式提交数据,即向服务器发送一个json字符串traditional:一般默认为True,一般是我们的data数据有数组时会用到 :data:{a:22,b:33,c:["x","y"]},traditional为false会对数据进行深层次迭代;

21、csrf

{%  csrf_token   %}

 Django中内置了一个专门处理csrf问题的中间件

1、在render返回页面的时候,在页面塞了一个隐藏的input标签,

2、在提交post数据的时候,进行校验,如果校验不通过就拒绝这次请求。

22、数据库mysql知识点

mysql是基于一个socket编写的C/S架构的软件

视图:用户创建的一张虚拟表,用户只需要使用其名称即可获取结果,只可以做查询用。

触发器:对某张表进行增删改查时,对操作前后自定义操作。

存储过程:为了完成特定功能的sql语句集,进过编译后存储在数据库中,用户通过制定存储过程的名字并制定参数来调用存储过程。

存储过程的优点:

              a、用于替代程序写sql语句,实现程序与sql的解耦

              b、基于网络传输,传别名的数据量小,而直接传sql的数据量大

事务:事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据的完整性

mysql的数据基本类型:

       a、数值类型:整数类型,浮点型,位类型,

       b、日期类型

    c、字符串类型:char类型(固定长度),varchar类型(可变长度)

       d、枚举类型(enum)和集合类型(set)

              枚举类型(enum):单选,只能在给定的范围选一个值

              集合类型(set)    :多选,在给定的范围内选一个或者一个以上的值

 22、生成器、迭代器和可迭代对象区别和应用?

生成器:1. 列表生成式的[ ]改为( )  2. 函数中包含yield 3.生成器可以节省内存 4.生成器就是迭代器的一种

迭代器:可迭代对象执行obj.__iter__()得到的结果就是迭代器对象

为何要有迭代器?
对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器
 可迭代对象:可迭代对象指的是内置有__iter__方法的对象

23、with 上下文机制原理?
上下文管理器是可以在with语句中使用,拥有__enter__和__exit__方法的对象。
# coding:utf-8
class   Foo():
    def __enter__(self):
        print('开始了')
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('结束了')

obj = Foo()


with  obj:
    print('我在中间')

 24、staticmethod、classmethod,property

@property属性方法,仅有一个self参数,调用时不用加()。

@classmethod把一个方法变成类方法,不需要依托任何对象,当一个方法只使用了累的静态方法是,就给这个方法加上,默认传cls参数

@staticmethod在完全面向对象的过程中,如果一个函数既和对象没有关系,也和类没有关系,那么就用@staticmethod,将这个函数变成一个静态方法。类方法和静态方法都是类调用,类方法有一个默认参数cls,代表这个类,静态方法没有默认参数,就像函数一样。

class   Foo():
    @classmethod
    def eat(cls):
        print('吃屎')
    @property
    def play(self):
        print('打篮球')
    @staticmethod
    def get():
        print('name  is  dog')

Foo.eat()
Foo.get()

obj = Foo()
obj.play

I can feel you forgetting me。。 有一种默契叫做我不理你,你就不理我

原文地址:https://www.cnblogs.com/weidaijie/p/10526972.html