复习总结
1、and或or复习总结:
Python中的and从左到右计算表达式,若所有的值均为真,则返回最后一个值,若存在假,返回第一个假值
or也是从左到右计算表达式,返回第一个为真的值
2、描述Python中GIL的概念复习总结:
GIL:全局解释器锁,每一个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行字节码。
3、Python中单引号,双引号,三引号的区别总结复习:
单引号:单引号中可以使用使用双引号,中间会当字符串输出,
双引号:双引号中可以使用单引号,中间会当字符串输出,
三单引号,和三双引号中间的字符串,在输出是保持原来的格式
4、is和==的区别复习总结:
Python中包含三个基本元素:ID(身份标识),type(数据类型),value(值)
其中ID用来唯一标识一个对象,type标识对象类型,value标识对象的一个值
is判断的是a对象是否就是b对象,是通过ID来判断
==判断的是a对象的值是否和b对象的值相等,是通过value来判断
5、可变对象和不可变对象的复习总结:
元组(tupe),数值型(number),字符串(string)均为不可变对象
字典(dict),列表(list)是可变对象
6、PEP8编码规范复习总结:
1、代码编排:缩进,4个空格的缩进。最大长度79,换行可以使用反斜杠
2、文档编排。。。。
3、空格的使用:各种括号前不要加空格,逗号,分号,冒号前不要加空格,
4、注释:块注释,在一段代码前增加的注释。在‘#’后加一空格。段落之间以只有‘#’的行间隔,如:
# Description : Module config.
#
# Input : None
#
# Output : None
5、文档描述
6、字符串不要以空格收尾
7、osi七层协议复习总结:
互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层
8、TCP与UDP的复习总结:
TCP:TCP是基于链接的,必须先启动服务端,然后在启动客户端去链接服务端(TCP有粘包现象)
UDP:UDP是无连接的,先启动那一端都不会报错(UDP没有粘包现象)
9、阻塞IO与非阻塞IO 总结复习:
IO阻塞:资源不可用是IO 请求一直阻塞,直到反馈结果
非阻塞IO:资源不可用时IO 请求离开返回,返回数据标识,资源不可用
10、同步IO 与异步IO复习总结:
同步IO :应用阻塞在发送和接受数据的状态,直到数据传输成功或返回失败
异步IO :应用发送或者接受数据立刻返回,数据写入OS 缓存,有OS完成数据的发送和接受,并返回成功和失败的信息给应用
11、网络编程中三次握手,四次挥手复习总结:
首先由服务端,和客户端。服务端先进行初始化Socket,在端口进行监听,等待客户端的连接,在这时,如果有客户端初始化socket,然后就开始连接服务端,如果连接成功,
这时客户端与服务端的连接就建立了,客户端发送数据请求,服务端就开始接受并处理请求,然后把回应数据发送个客户端,客户端读取数据,最后关闭连接。
12、一行代码实现九九乘法表的复习总结:
print('\n'.join([ ' '.join( [ '{}*{} = {}'.format(x,y,x*y) for y in range(1,x+1)] ) for x in range(1,10)]) )
13、函数的复习总结:
函数分为:
1、内置函数:Python解释器已经为我们定义好的函数成为内置函数
2、自定义函数:内置函数为我们提供的功能是有限的,这就需要我们根据自己的需求,定制好我们自己的函数来实现某种功能。以后,在遇到应用场景是,调用自定义的函数即可
函数调用的规则:先定义,在调用
定义函数的三种形式:
1、无参:定义时没有参数,意味着调用的时候无需传入参数
2、有参:定义的时候有参数,意味调用的时候必须传入参数
3、空函数
函数的调用:函数名加括号(先找到自己的名字,根据自己的名字调用代码)
函数返回值:
1、无return 返回None
2、return1个值 返回一个值
3、return逗号多个值 返回多个值
14、函数的参数复习总结:
1、位置参数:按照从左到右的顺序依次定义参数
a、位置形参:必选参数
b、位置实参:按照位置给形参传值
2、关键字参数:按照key=value的形式定义实参(无需按照位置为形参传值)
注意的问题:a、关键字实参必须在位置实参右面
b、对同一个形参不能重复传值
3、默认参数:形参在定义的时候就已经为其赋值(可以传值也可以不传值)
注意的问题: a、只在定义时赋值一次
b、默认参数的定义应该在位置形参右面
c、默认参数通常应该定义成不可变类型
4、可变长参数:可变长参数指的是实参值得个数不固定(存放可变长参数的分别是:*args,**kwargs)
5、命名关键字参数:*后定义的参数,必须被传值(有默认值除外),且必须按照关键字实参的形式传递
内置函数的复习总结:内置函数的ID()可以返回一个对象的身份,返回值为整数。内置函数type()则返回一个对象类型
面向对象的复习总结:
1、面向过程的核心设计是 过程,过程值得是:解决问题的步骤
2、 面向过程的优点:极大的降低了程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可
3、面向过程的缺点:一套流水线或者流程就是来用来解决一个问题,代码牵一发而动全身
4、面向对象的核心设计是对象,
15、面向对象的三大特性:
一、继承:
1、继承:是一种创建新类的方式,在Python中,新建的类可以继承一个个或多个父类,父类又称为基类或者超类,新建的类称为派生类或者子类
2、Python中类的继承分为:单继承或多继承
3、继承的两种用途:
a、继承基类的方法,并且做出自己的改变或者扩展,
b、声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能
4、继承的顺序:
a、Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先或广度优先
5、继承的作用:
a、减少代码的重用
b、提高代码的可读性
c、规范编程模式
二、封装:
----将同一类的方法和属性封装到类中
----将数据封装到对象中
1、隐藏对象的属性和实现细节,仅对外提供公共方式
2、封装的好处:
a、将变化隔离
b、便于使用
c、提高复用性
d、提高安全性
3、封装原则
a、将不需要对外提供的内容都隐藏起来
b、把属性都隐藏,提供公共的方法对其访问
三、多态
----多态指:一类事物有多种形态
类的内置方法复习总结:
__call__(在那用过,单例模式,用类做装饰器,Flask源码中用过__call__方法)
__new__(在那用过,单例模式,自定义Form验证,wtforms源码,Django rest-framework中序列化源码用过)
__init__
__del__
__iter__(在那用过,对象要被for循环,stark组件组合搜索中用过)
__getattr__(在那用过,Flask源码,自定义的‘本地线程’,local,rest-framework request中取值中用过)
__getitem__(在那用过,Session源码中用过)
__dict__(在那用过,自定义form)
__add__(在那用过,
data = obj1 + obj2
# obj1.__add__(obj2))
__metaclass__(在那用过,wtforms源码中用过)
16、*args和**kwargs的复习总结:
*args可以传递任意数量的的位置参数,以元组的形式存储
**kwargs可以传递任意数量的关键字参数,以字典的形式存储
*args和**kwargs可以同时定义在函数中,但必须*args放在**kwargs前面
17、什么是lambda函数,它的好处复习总结:
通常是在需要一个函数,但是有的去命名一个函数的场合下使用,也就是匿名函数
lambda的好处:lambda函数比较方便,匿名函数,一般用来给filter,map这样的函数式编程服务,作为回调函数传递给某些应用,比如消息处理
18、装饰器的的复习总结:
装饰器的本质:闭包函数
装饰器的功能:就是在不改变原函数的调用方式的情况下,在这个函数的前后加上扩展功能
装饰器的开放封闭原则:1、对扩展是开放的 2、对修改是封闭的
装饰器的固定方式:
def timer(func): def inner(*args,**kwargs): '''执行函数之前要做的''' re = func(*args,**kwargs) '''执行函数之后要做的''' return re return inner
19、迭代器的复习总结:
1、可迭代:字符串,列表,集合、字典、元组这些都可以被for循环,说明他们是可迭代的
2、迭代就是:将某个数据集内的数据一个挨一个的取出来,就叫做可迭代
3、可迭代的标志:_iter_
4、迭代协议:希望这个数据类型里的东西也可以使用for循环被一个一个的取出来那我们就必须满足for的要求,这个要求就叫做协议
5、可迭代协议:凡是可迭代的内部都有__iter__方法
6、迭代器协议:内部实现了__iter__,__next__方法(迭代器里面既有__iter__方法,又有__next__方法)
7、迭代器:通过iter得到的结果就是一个迭代器(迭代器大部分都是在Python的内部去使用,我们直接拿来用就可以了,它的内置有__iter__,和__next__方法)
8、迭代器遵循迭代器协议:必须有__iter__和__next__方法
9、不管是迭代器还是可迭代对象,都可以被for循环遍历。迭代器的出现的原因是帮你节省内存
10、迭代器和可迭代的相同点:都可以被for循环
11、迭代器和可迭代的不同点:迭代器多实现了一个__next__方法
12、判断可迭代和迭代器的方法:1、判断内部是不是实现了__next__方法 2、用 Iterable(可迭代),Iterator(迭代器) 来判断
20、生成器的复习总结:
1、生成器函数:常规函数定义,使用yield语句而不是return语句返回结果,函数内部有yield关键字,那么函数名()得到的结果就是生成器,并且不会执行函数内部代码(生成器就是迭代器)
2、生成器表达式:类似于列表推导,但是生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表
3、列表推导式:
l =[i*i for i in range(100)] print(l)
21、作用域复习总结:
1、作用域即范围:全局范围(内置名称空间和全局名称空间属于该范围):全局存活,全局有效 局部范围(局部名称空间属于该范围):临时存活,局部有效
2、作用域关系是在函数定义阶段就已经固定的,与函数调用的位置无关
3、查看作用域 :globals()全局变量,locals()局部变量
22、闭包复习总结:
1、什么是闭包:内部函数包含对外部作用域而非全局作用域的引用
2、闭包的意义与应用:
1、闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹一层作用域,这使得,该函数无论在何处调用,
有先使用在外层函数包裹的作用域
2、应用 领域:在延迟计算
23、Cookie和Session的区别、优缺点
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE
4、单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。
24、cookies和session的区别复习总结:
cookies的数据是放在客户的浏览器上的,session的数据是放在服务器上的
25、http协议总结复习:
http是一个基于TCP/IP通信协议来传递数据,HTTP是一个属于应用层的面向对象的协议,HTTP协议工作于客户端-服务端架构为上。
HTTP响应有四个部分组成,分别是:状态行,消息报头,空行和响应正文
请求头和请求体分割:\r\n\r\n
请求体:\r\n
GET无请求体
请求头代表的意义:user-agent:来源,referer:防盗链,context-type:请求体是什么格式
26、post与get的区别复习总结:
根据http协议规范,get一般用于获取/查询资源信息,而post一般用于更新资源信息
get是在URL中传送数据,数据放在请求头上,post是在请求体上传送数据
27、视图函数包含两个对象的复习总结:
request:------>请求信息
HttpResponse:----->响应字符串
28、request包含哪些数据的复习总结:
request.GET:GET请求的数据()
request.POST:POST请求的数据()
request.method:请求的方式:POST或GET
键值对的值是多个的时候,比如:chexbox类型,select类型,需要用:request.POST.getlist()
29、django中模板语法变量复习总结:
在Django模板中遍历复杂数据结构的关键字是句点符:.
如果字符串多余指定的数量,那么会被截断,截断的字符串将以可翻译的省略号序列("...")结尾用truncatechars,如:{{value|truncatechars:9}
如果一个变量为空或者false,使用给定的默认值,否则使用变量的值,如:{{li|default:"nothing"}}
循环序号可以用{{forloop}}显示:
forloop.counter0 从0开始
forloop.revcounter0 反向从直到0
forloop.revcounter 反向开始
对象可以调用自己的属性
30、Django的生命周期复习总结:
wsgi -->中间件-->路由-->视图-->(数据,模板)
渲染工作在Django中执行完成后,字符串返回给浏览器
但是js,css额外再发一次请求仅仅获取静态文件
31、在Django中对比render与redirect复习总结:
render:只是返回页面内容,但是末发送请求
redirect:发送了第二次请求,URL更新
32、Django中的MTV分别代表什么:
M代表什么model(模型):负责业务对象和数据对象
T代表Template(模板):负责如何把页面展示给用户
V代表Views(视图):负责业务逻辑,并在适当的时候调用model和template
33、Django之缓存复习总结:
由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回。
Django中提供了6种缓存方式:
- 开发调试
# 此为开始调试用,实际内部不做任何操作 # 配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 引擎 'TIMEOUT': 300, # 缓存超时时间(默认300,None表示永不过期,0表示立即过期) 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大缓存个数(默认300) 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3) }, 'KEY_PREFIX': '', # 缓存key的前缀(默认空) 'VERSION': 1, # 缓存key的版本(默认1) 'KEY_FUNCTION' 函数名 # 生成key的函数(默认函数会生成为:【前缀:版本:key】) } } # 自定义key def default_key_func(key, key_prefix, version): """ Default function to generate keys. Constructs the key used by all other methods. By default it prepends the `key_prefix'. KEY_FUNCTION can be used to specify an alternate function with custom key making behavior. """ return '%s:%s:%s' % (key_prefix, version, key) def get_key_func(key_func): """ Function to decide which key function to use. Defaults to ``default_key_func``. """ if key_func is not None: if callable(key_func): return key_func else: return import_string(key_func) return default_key_func
- 内存
# 此缓存将内容保存至内存的变量中 # 配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'unique-snowflake', } } # 注:其他配置同开发调试版本
- 文件
# 此缓存将内容保存至文件 # 配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/tmp/django_cache', } } # 注:其他配置同开发调试版本
- 数据库
# 此缓存将内容保存至数据库 # 配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 'LOCATION': 'my_cache_table', # 数据库表 } } # 注:执行创建表命令 python manage.py createcachetable
- Memcache缓存(python-memcached模块)
# 此缓存使用python-memcached模块连接memcache CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': '127.0.0.1:11211', } } CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': 'unix:/tmp/memcached.sock', } } CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': [ '172.19.26.240:11211', '172.19.26.242:11211', ] } }
- Memcache缓存(pylibmc模块)
# 此缓存使用pylibmc模块连接memcache CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': '127.0.0.1:11211', } } CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': '/tmp/memcached.sock', } } CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', 'LOCATION': [ '172.19.26.240:11211', '172.19.26.242:11211', ] } }
34、什么是同源策略复习总结:
同源策略是一种约定,它是浏览器最核心也是最基本的安全功能,如果缺少同源策略,则浏览器的正常功能都会受到影响,可以说web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
所谓同源是指,域名,协议,端口相同。
35、jsonp的复习总结:
jsonp是json用来跨域的一个东西,原理是通过script标签的跨域特性来绕过同源策略
jsonp一定是GET请求
36、js作用域的复习总结:
js作用域(全局变量,局部变量)内部可以访问外部,但外部不能访问内部
37、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会对数据进行深层次迭代;
38、数据库的复习总结:
1、数据库的存储过程:存储过程包含一些列可执行的sql语句,存储过程存放于MYSQL,通过调用它的名字可以执行其执行内部的一堆sql
2、存储过程的优点:
a、用于替代程序写sql语句,实现程序与sql的解耦
b、基于网络传输,传别名的数据量小,而直接传sql的数据量大
3、触发器:使用触发器可以定制用户对表进行【增,删,改】操作是前后的行为,注意,没有查询。
4、事务:事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据的完整性
5、索引本质:通过不断缩小想要获取的数据的范围来筛选出最终想要的结果,同时吧随机事件变成顺序事件,,也就是说,有了这种索引机制,我们总是用同一种方式来锁定数据
6、mysql常用的索引:
a、普通索引:加速查找
b、唯一索引:加速查找+约束(不能重复)
c、主键索引:加速查找+约束(不能为空,不能重复)
d、联合索引:
-PRIMARY KEY(id,name):联合主键索引
-UNIQUE(id,name):联合唯一索引
-INDEX(id,name):联合普通索引
7、使用索引
a、索引末命中
b、索引命中
8、数据库创建表
a、数据库文件夹的操作
create database db1 增加文件夹
show databases 查看所有数据库
show create database db1 查看db1文件夹
drop database db1 删除db1文件夹
b、操作文件
use db1 切换文件夹
\c 取消命令
create table t1(id int,name char(10);) 创建表
show table 查看当前下的所有表
show create table t1 查看表
alter table t1 add age int 增加字段
desc t1 查看表结构
drop table t1 删除表结构
c、操作文件的一行行内容
insert into db1.t1 values(1,'mqj'),(2,'mqj1') 增加记录
select * from t1 查看所有字段对应的值
select * from t1 where id > 2 查看id大于2 的字段
select name from t1 查看单个字段
update t1 set name='SB' where id=3 改里面的记录
delect from t1 where id=3 删除一条记录
truncate t1 整体删除
9、mysql是什么
mysql是基于一个socket编写的C/S架构的软件
10.mysql的数据基本类型:
a、数值类型:整数类型,浮点型,位类型,
b、日期类型
c、字符串类型:char类型,varchar类型
d、枚举类型(enum)和集合类型(set)
枚举类型(enum):单选,只能在给定的范围选一个值
集合类型(set) :多选,在给定的范围内选一个或者一个以上的值
39、redis和memecache的不同在于:
1、存储方式:
memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小
redis有部份存在硬盘上,这样能保证数据的持久性,支持数据的持久化(笔者注:有快照和AOF日志两种持久化方式,在实际应用的时候,要特别注意配置文件快照参数,要不就很有可能服务器频繁满载做dump)。
2、数据支持类型:
redis在数据支持上要比memecache多的多。
3、使用底层模型不同:
新版本的redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
4、运行环境不同:
redis目前官方只支持LINUX 上去行,从而省去了对于其它系统的支持,这样的话可以更好的把精力用于本系统 环境上的优化,虽然后来微软有一个小组为其写了补丁。但是没有放到主干上
40、redis的数据类型复习总结
redis有五大数据类型:字符串,哈希,列表,集合,有序集合