python面试题汇总

一、and或orpython

 
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从左到右计算表达式,若全部的值均为真,则返回最后一个值,若存在假,返回第一个假值mysql

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

二、GIL锁ajax

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

三、is和==的区别数据库

 

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

 

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

 

is判断的是a对象是否就是b对象,是经过ID来判断跨域

 

==判断的是a对象的值是否和b对象的值相等,是经过value来判断,,因此is 就是判断两个对象的id是否相同, 而 == 判断的则是内容是否相同。数组

四、 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都是可变对象

五、osi七层协议复习总结

六、TCP与UDP的复习总结

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

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

七、阻塞IO,非阻塞IO

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

八、同步和异步

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

 所谓异步是不须要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工做,依赖的任务也当即执行,只要本身完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务没法肯定,因此它是不可靠的任务序列

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

for  i  in  range(1,10):
    for j  in  range(1,i+1):
        print('{}*{}={}'.format(j,i,i*j) ,end='  ')
    print('\n',end='')

 

ret ='\n'.join([ ' '.join(['{}*{}={}'.format(y,x,x*y)  for y  in range(1,x+1) ]) for x  in range(1,10)  ])
print(ret)

 十、类的继承

十一、*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这样的函数式编程服务,做为回调函数传递给某些应用,好比消息处理

1三、装饰器

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

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

eat()

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

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

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

1四、做用域

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

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

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

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

 1五、闭包函数

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

ret = foo()
ret()

 1六、cookies和session的区别

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

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

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

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

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

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

1七、Django中的MTV分别表明什么:

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

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

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

1八、什么是同源策略

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

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

1九、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会对数据进行深层次迭代;

2一、csrf

{%  csrf_token   %}

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

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

二、在提交post数据的时候,进行校验,若是校验不经过就拒绝此次请求。

2二、数据库mysql知识点

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

视图:用户建立的一张虚拟表,用户只须要使用其名称便可获取结果,只能够作查询用。

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

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

存储过程的优势:

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

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

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

mysql的数据基本类型:

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

       b、日期类型

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

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

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

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

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

生成器: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
相关文章
相关标签/搜索