https://www.imooc.com/article/36931css
python用一个tuple将多个值传递给模板,每一个值对应一个格式符
print(“ my name is %s ,im %d year old”%("gaoxu",19))
自从python2.6开始,新增了一种格式化字符串的函数str.format(),经过{}和.来代替传统的%
主要的区别是:不须要指定的字符串仍是数字类型html
print('ma name is {} ,age is {} year old'.format("小明",17))print('my name is {1},age is {0}'.format(15,'小明')) #:位置攒参的方式li=['hollo',18]print('may name is {0},my year old is {1}'.format(*li))# 按照关键字传参hash={'name':'hoho','age':18}print ('my name is {name},age is {age}'.format(**hash))
t1=(('a'),('b')) t2=(('c'),('d')) res=lambda t1,t2:[{i:j}for i,j in zip(t1,t2)] print(res(t1,t2))
l=[11,2,3,4,7,6,4,3,54,3,] now_l=[]for i in l:if i not in now_l: now_l.append(i)print(now_l) 也能够用set直接去重和排序print(set(l)
匿名函数与函数有共同的做用域,可是匿名函数意味着引用计数为0除非让他有名字
好处:一次性使用,随时随地的定义更容易阅读,作了什么更是一目了然python
是被用于在代码被执行的时候构建新的函数对象而且返回mysql
在python中定义函数,可也用必选函数,默认参数,可变参数,和关键字参数,这四种参数均可以一块使用,或者只用其中的一些可是请注意的是参数定义的顺序必须是必选参数,默认参数,可变参数,关键字参数nginx
re.match()老是匹配的是字符串的开头,并返回匹配的math对象,若是去匹配字符串非开头的部分就会返回none
re.search()函数对整个字符串进行搜索,并返回第一个匹配字符串的match对象程序员
python中的and是从左往右计算的,若全部的值都是真的,则返回最后一个,若存在假的,返第一个假的,1 or 2由于是1是非零,因此返回的值是1web
*args(表示的就是将实参中按照位置传参,多余的都是给args,切都是以元组的方式实现)
**kwargs:(表示的是按照关键字传参,保存的是字典的形式ajax
print((i%2 for i in range(10))) #:<generator object <genexpr> at 0X000001c577DDE258>print([i%2 for i in range(10)]) [0,,1,0,1,0,1,0,1]
总结:
1,把列表解析【】换成()获得生成器表达式
2,列表解析和生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存
3,pyrhon不但使用迭代器协议,让for循环变得更加通用,大部份内置函数,也是使用迭代器协议
访问对象的,列如:sun是python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议算法
python3的字节是python2的字符串
python3的字符窜是python2的unciode
在python3中print要加括号
在python3中数字除法有小数点sql
Unicode--->encode----->utf-8utf-------->decode------>unicode
迭代器即迭代工具,那么什么是迭代那
迭代重复上一个重复的过程,每一次重复即一次迭代,而且每一次迭代的结果都是下一次迭代的开始
为什么要用迭代器
对于序列类型:字符串,列表,元组,咱们可使用索引的方式迭代取出包含的元素
对于字典,集合,文件等类型没有索引,若还行取出内部包的元素,则须要找出不依赖索引的方式,那这就是迭代器
什么是可迭代的对象,具备init方法返回就是迭代器,具备next方法
特色优势:提供了一种不依赖索引的取值的方式
缺点: 只能往前循环,不能日后找没法获取长度,
注意的是:迭代器对象必定是可迭代对象,但可迭代对象不必定是迭代器的对象
生成器迭代器的一种关键字yield+关键字,next方法,yield语句一次返回一个结果,在每一个
结果中间挂起钩子函数,以便下次重它离开的地方继续
生成器表达式相似于列表推导式,可是生成器返回按需求产生结果的一个对象,而不是一次构建
一个结果的列表
特色:惰性运算,节省空间
装饰器:在不改变原来函数和函数的调用方式进行扩展,就是对外开放,对内封闭的原则
目标:为被装饰的对象添加新的功能
Python函数在定义的时候。默认b的值就被计算出来了,即[],由于默认参数b也是一个变量,它指向
对象即[],每次调用这个函数,若是改变b的内容每次调用时候默认参数也就改变了,不在是定义时候的[]了
image.png
因此默认参数要牢记一点:默认参数必须指向不变对象
for i in range(1,10): for j in range(1,i+1): print('%s * %s= %s'%(i,j,i*j),end="") print('')
print( '\n'.join([' '.join(['%s*%s=%-2s' % (y,x,x*y) for y in range(1,x+1)])for x in range(1,10)]))
拷贝有两种方式:浅拷贝和深拷贝copy.copy()and copy.deepcopy()
咱们寻常意义上的复制就是深复制,即将被复制的对象彻底再复制一遍做为独立的新个体单独存在,因此
改变原有被复制的到对象不会对已经复制的新对象产生影响。
而浅复制并不会产生一个独立的对象存在,他只是将原有的数据打上一块新标签,因此当其中一块标签被
改变时候,数据就会变化,另外一个标签也会随之改变,数据块就发生变化,另外一个标签也会随着改变,
image.png
装饰器本质上就是一个python函数,它可让其余函数在不须要任何代码变更的前提下增长额外的功能
,装饰器的返回值也是一个函数对象,她有不少的应用场景,好比:插入日志,事物处理,缓存,权限装饰器就是为已经存在的对象
添加额外功能
def outher(func): def good(*args,**kwargs): ret=func(*args,**kwargs) return ret return good@outherdef bar(): print('狗241131313') bar()
计算列表中的元素的个数和向末尾追加元素所用到的方法?len(),append()
判断字典中有没有某个key的方法?用到get('key')方法,若没有,将返回值none
现有my_list=range(100)
主要是以对象引用计数为主标记清除和分带技术为辅的那么一种方式
Python在内存中存储了每一个对象的引用计数(reference count)。若是计数值变为0,那么相应的对象就会消失。分配给该对象的内存就会释放出来用做他用。
偶尔也会出现引用循环。垃圾回收器会定时寻找这个循环,并将其回收。
Python中还使用了某些启示算法来加速回收。
a='sadsadada'print(isinstasnce(a,str))
http://www.hacksparrow.com/python-difference-between-list-and-tuple.html
首先xrange在python3中已经不适用了
range:
函数说明:range([start,]stop[,step]),根据start与stop指定的范围以及step设定的步长
生成一个列表
xrange与range相似,只是返回的是一个“xrange object"对象,而非数组list
要生成很大的数字序列的时候,用xrange会比range性能优不少
区别:range会生成一个list对象,而xrange会返回一个生成器对象
x='1','2','3'li=[]for i in x: li .append(i)print(li)'1','2','3' 如何变成[1,2,3] x='1','2','3'li=[]for i in x: li .append(int(i))print(li)
target=list(map(lambda x: x*x,[1,2,3,4,5,6,7,8,9,10]
map obj
并补全下面的代码
image.png
import os os.remove(r'D:\ggg\fileobj) os.remove(‘路径’)
import random print(random.randint(1,10))
image.png
image.png
# def beautiful(c):# for i in range(c):# yield i**2# for item in beautiful(5):# print(item)#函数# def gensquares(N):# res=[0]# for i in range(N):# res.append(i*i)# return res# for item in gensquares(5):# print(item)
总结:
1语法上和函数相似:生成器函数和常规函数几乎如出一辙的,他们都是使用def语句进行
定义,区别在于,生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值
2.自动实现迭代器的协议:对于生成器,python自动实现迭代器协议,因此咱们能够调用它的next
方法,而且在没有值返回的时候,生成器自动生成Stopltwration异常
3.状态挂起,生成器使用yield语句返回一个值.yield语句挂起该生成器函数的状态,保留足够的信息,方便以后离开的
地方继续执行
a=input('please enter a string')print(a[::-1])
list1=[2,3,4,9,6] list2=[5,6,10,17,11,2] list1.extend(list2)print(sorted(list(set(list))))####33.到底什么是python?你能够在回答中进行技术对比(也鼓励这样作)。python是一门解释性语言,这里说与c语言和c的衍生语言不一样,python代码不须要编译,其余解释语言还包括Ruby和pyp python是动态语言,在声明变量的时候,不须要声明变量的类型 python很是适合面向对象编程,由于它支持经过组合和继承的方式定义类 python代码编写快,可是运行速度比编译语言一般要慢,好在python容许加入基于c语言编写扩展,所以咱们能优化代码,消除瓶颈,这点一般是能够实现的numpy就是一个很好的例子 python用途很普遍----网络应用,自动化,科学建模,大数据应用,等等一般被称为胶水语言
状态代码有三位数字组成,第一个数字定义响应的类别,共分5种类型
1xx:提示信息--表示请求接受,继续处理
2xx:成功表示请求成功接收,理解,接受
3xx:重定向要完成请求必须更进一步操做
4xx:客户端错误,请求有语法错误或请求没法实现
5xx:服务器端错误--服务器没有实现合法请求
常见状态码:
200 OK//客户端请求成功 400 Bad Request//客户端请求有语法错误,不能被服务器所理解401 Unauthorized//请求未经受权,这个状态代码必须和WWW-Authenticate报头域一块儿使用 403 Forbidden//服务器收到请求,可是拒绝提供服务 404 Not Found//请求资源不存在,eg:输入了错误的URL 500 Internal Server Error//服务器发生不可预期的错误 503 Server Unavailable//服务器当前不能处理客户端的请求,一段时间后可能恢复正常
l2=[lambda:i for i in range(10)] l1=[i for i in range(10)] print(l1[0]) print(l2[0]) print(l2[0]())
eval有返回值
exec没有返回值
print(eval('2+3'))print(exec('2+1'))exec("print('1+1')")
class obj(object): passa = eval('obj()') print(a,type(a)) #<__main__.obj object at 0x000001F1F6897550> <class '__main__.obj'>
session在服务器,cooking在客户端(浏览器)
session默认存在服务器上的文件里面(也能够是内存,数据库)
session的运行依赖session_id,而session_id是存在cookie中,也就是说,若果浏览器禁用lcookie,同时session也会失效(可是能够经过其余方式实现,好比在url中传入session_id)
session能够放在文件,数据库,内存中均可以的
用户验证一般会用session
维持一个会话核心就是客户端的惟一标识,即session_id
无状态协议,判断session_id是否相同。
没有重复的数的总和
def MyPlus(l): new_l = [] for i in l: if i not in new_l: new_l.append(i) return sum(new_l) print(MyPlus(l = [2,3,4,4,5,5,6,7,8]))
print(i for i in range(1,100)if i%2 ==0])
nums = [] for i in range(1,6): for j in range(1,6): for k in range(1,6): if i != j and j != k and i !=k: new_num = i*100 + k*10 + j if new_num not in nums: nums.append(new_num) print(nums)
get,post,put,delete,head,connect
守护进程(daemon)
主进程建立守护进程
其一:守护进程会在主进程代码执行结束后就终止
其二:守护进程内没法开启子进程,不然抛出异常:AssertionError: daemonic processes are not allowed to have children
注意:进程之间是相互独立的,主进程的代码运行结束,守护进程随即终止
p.join([timeout]): 主进程等待相应的子进程p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。须要强调的是p.join()只能join住start开始的进程,而不能join住run开启的进程
因为GIL的影响,python没法利用多核优点
CIL本质就是一把互斥锁,既然是互斥锁,全部互斥锁都同样将并发运行转化为串行,此时来控制同一时间内只能被一个任务修改,进而保证数据的安全.能够确定的是:保护不一样数据的安全,须要加不一样的锁。
如今计算机基本都是多核,python对于计算密集型任务开多线程的效率并不能带来多大的技术提高,甚至不如串行(没有大量的切换),可是对于io密集型任务效率仍是有显著的提高的
所以,对于io密集型任务,python多线程更加的适合。
./run.py.shell直接调用python脚本 python run.py 调用python 解释器来调用python脚本
一、TCP协议是有链接的,有链接的意思是开始传输实际数据以前TCP的客户端和服务器端必须经过三次握手创建链接,会话结束后也要结束链接。而UDP是无链接的
二、TCP协议保证数据发送,按序送达,提供超时重传保证数据可靠性,可是UDP不保证按序到达,甚至不能保证到达,仍是努力交付,即使是按序发送的序列,也不保证按序送到。
三、TCP协议所需资源多,TCP首部需20个字节(不算可选项),UDP首部字段只需8个字节。
四、TCP有流量控制和拥塞控制,UDP没有。网络拥堵不会影响发送端的发送速率。
五、TCP面向的字节流的服务,UDP面向的是报文的服务。
三次握手创建链接时,发送方再次发送确认的必要性?
主 要是为了防止已失效的链接请求报文段忽然又传到了B,于是产生错误。假定出现一种异常状况,即A发出的第一个链接请求报文段并无丢失,而是在某些网络结 点长时间滞留了,一直延迟到链接释放之后的某个时间才到达B,原本这是一个早已失效的报文段。但B收到此失效的链接请求报文段后,就误认为是A又发出一次 新的链接请求,因而就向A发出确认报文段,赞成创建链接。假定不采用三次握手,那么只要B发出确认,新的链接就创建了,这样一直等待A发来数据,B的许多 资源就这样白白浪费了。
四次挥手释放链接时,等待2MSL的意义?
第 一,为了保证A发送的最有一个ACK报文段可以到达B。这个ACK报文段有可能丢失,于是使处在LAST-ACK状态的B收不到对已发送的FIN和ACK 报文段的确认。B会超时重传这个FIN和ACK报文段,而A就能在2MSL时间内收到这个重传的ACK+FIN报文段。接着A重传一次确认。
第二,就是防止上面提到的已失效的链接请求报文段出如今本链接中,A在发送完最有一个ACK报文段后,再通过2MSL,就可使本链接持续的时间内所产生的全部报文段都从网络中消失。
tcp是面向链接的,可靠的字节流服务,udp是面向无链接的,不可靠而数据服务
python有以下的字典,
dic_tmp={'carry':17,'bob':21,'matty':23,'jack':33,'tom':17,'alex':23}
print(sorted(dic_tmp.items(),key=lambda dic_tmp:dic_tmp[0]))
innodb是mysql最经常使用的一种存储引擎,Facebook,google等公司的成功已证实了innodb存储引擎具备高可用性,高性能以及高扩展性,支持事物,其特色是行锁设计,支持外键,并支持相似oracle的非锁定读,对于表中数据的存储,inndb存储引擎采用了汇集的方式,每张表都是按主键的顺序进行存储的,若是没有显示地在表定义时候指定主键,innodb,存储引擎会为每一行生成六个字节的ROWId,并以此为主键。
myisam不支持事物,表锁设计,支持全文索引,主要面向一些olap数据库应用,此外myisam存储引擎的另外一个不同凡响的地方是,它的缓冲池只缓存索引文件,而不缓存数据文件,这与大多数数据库不同
class Open(object): def __init__(self,name,mode): self.name=name self.mode=mode def __enter__(self): self.opened=open(self.name,self.mode) return self.opened def __exit__(self,exc_type,exc_val,exc_tb): self.opened.close() with open('mytext.txt','w') as write: write.write('hello qaweqwe world')
1,当用户在浏览器中输入url时浏览器会生成请求头和请求体发送给服务端请求头和请求体中会包含浏览器的动做(action)这个动做一般为get或者post提如今url之中
2.url通过Django中的wsgi再通过django的中间件,最后url到路由的映射表一条一条进行匹配一旦其中的某一条匹配成功就执行视图函数,后面的路由就不在继续匹配了
3视图函数根据客户端的请求查询相应的数据,返回给Django,而后Django把客户端想要的数据做为一个字符串返回给客户端
4客户端浏览器接受到返回的数据,通过渲染后显示给用户
1url后尽可能用名词,由于rest frame是面向资源的编程,所以url命名时能体现出资源
2method的不一样,实现增删改查的操做
3版本号,由于有版本的更替,为了体现出版本的过分,所以在发请求的时候,要体现出版本号
4返回值,与以往只返回json不一样,rest api规范要加上状态码。
5域名,因为先后端分离,所以要处理跨域问题,解决方法:jsonp,cors
6过滤,经过url传参的形式传递搜索条件(列如:指定返回的记录数量,指定分页等)
jsonp的本质就是利用script的src属性绕过同源策略
cors
整个cors通讯过程,都是浏览器自动完成,不须要用户参与,对于开发者来讲cors通讯和同源的ajax没有什么区别,挨代码彻底同样,浏览器一旦发现ajax请求跨源,就会自动添加一些附加头的信息,有时还会多出一次附加的请求,但用户不会有感受.
print(sorted(dic.items(),key=lambda dic:dic[1]))
innodb存储引擎(最经常使用的引擎,支持事物,特色是行锁,特色是行锁设计,支持外键)
myisam存储引擎(不支持事物,表锁的设计,支持全文索引)
nod存储引擎
memory存储引擎
class BiTreeNode(object): def __init__(self,data): self.data = data self.lchild = None self.rchild = Nonea = BiTreeNode('A') b= BiTreeNode('B') c = BiTreeNode('C') d = BiTreeNode('D') e = BiTreeNode('E') f = BiTreeNode('F') g = BiTreeNode('G') e.lchild = a e.rchild = g a.rchild = c c.lchild = b c.rchild = d g.rchild = f root = e# 前序遍历 (先找作子树,后找右子树)def pre_order(root): if root: print(root.data,end='') # EACBDGF pre_order(root.lchild) pre_order(root.rchild) pre_order(root) print('')# 中序遍历def in_order(root): if root: in_order(root.lchild) print(root.data,end='') # ABCDEGF in_order(root.rchild) in_order(root) # ABCDEGFprint('')# 后序遍历def post_order(root): if root: post_order(root.lchild) post_order(root.rchild) print(root.data,end='') post_order(root) #BDCAFGE
1轮训
2长轮训
3websocket
优势:后端程序编写比较容易
缺点:请求中有大半是无用浪费带宽和服务器资源.
实例:适用小型应用
优势:在无消息的状况下不会频繁的请求
缺点:服务器hold链接会消耗资源。
实例:webqq,hi网页版,facebook im。
d = {key: value for (key, value) in iterable}
>>> class MyClass():... def __init__(self): ... self.__superprivate = "Hello"... self._semiprivate = ", world!"...>>> mc = MyClass()>>> print mc.__superprivate Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: myClass instance has no attribute '__superprivate'>>> print mc._semiprivate , world!>>> print mc.__dict__{'_MyClass__superprivate': 'Hello', '_semiprivate': ', world!'}
foo:一种约定,Python内部的名字,用来区别其余用户自定义的命名,以防冲突,就是例如init(),del(),call()这些特殊方法
_foo:一种约定,用来指定变量私有.程序员用来指定私有变量的一种方式.不能用from module import * 导入,其余方面和公有同样访问;
__foo:这个有真正的意义:解析器用classname__foo来代替这个名字,以区别和其余类相同的命名,它没法直接像公有成员同样随便访问,经过对象名.类名__xxx这样的方式能够访问.
详情见:http://www.zhihu.com/question/19754941
函数重载主要是为了解决两个问题。
1.可变参数类型。
2.可变参数个数。
另外,一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不一样之外,其功能是彻底相同的,此时才使用函数重载,若是两个函数的功能其实不一样,那么不该当使用重载,而应当使用一个名字不一样的函数。
好吧,那么对于状况 1 ,函数功能相同,可是参数类型不一样,python 如何处理?答案是根本不须要处理,由于 python 能够接受任何类型的参数,若是函数的功能相同,那么不一样的参数类型在 python 中极可能是相同的代码,没有必要作成两个不一样函数。
那么对于状况 2 ,函数功能相同,但参数个数不一样,python 如何处理?你们知道,答案就是缺省参数。对那些缺乏的参数设定为缺省参数便可解决问题。由于你假设函数功能相同,那么那些缺乏的参数终归是须要用的。
好了,鉴于状况 1 跟 状况 2 都有了解决方案,python 天然就不须要函数重载了。
引自知乎:http://www.zhihu.com/question/20053359
虚拟存储器是指具备请求和调入功能,能从逻辑上对内存容量加以扩充的一种存储系统
分页: 用户程序的地址空间被划分红若干固定大小的区域,称为“页”,相应地,内存空间分红若干个物理块,页和块的大小相等。可将用户程序的任一页放在内存的任一块中,实现了离散分配。
分段: 将用户程序地址空间分红若干个大小不等的段,每段能够定义一组相对完整的逻辑信息。存储分配时,以段为单位,段与段在内存中能够不相邻接,也实现了离散分配。
1.页是信息的物理单位,分页是为了实现非连续分配,以便解决内存碎片问题,或者说分页是因为系统管理的须要.段是信息的逻辑单位,它含有一组意义相对完整的信息,分段的目的是为了更好地实现共享,知足用户的须要.
2.页的大小固定,由系统肯定,将逻辑地址划分为页号和页内地址是由机器硬件实现的.而段的长度却不固定,决定于用户所编写的程序,一般由编译程序在对源程序进行编译时根据信息的性质来划分.
3.分页的做业地址空间是一维的.分段的地址空间是二维的.
用集合
list(set(l))
用字典
l1 = ['b','c','d','b','c','a','a'] l2 = {}.fromkeys(l1).keys()print l2
用字典并保持顺序
l1 = ['b','c','d','b','c','a','a'] l2 = list(set(l1)) l2.sort(key=l1.index)print l2
列表推导式
l1 = ['b','c','d','b','c','a','a'] l2 = [] [l2.append(i) for i in l1 if not i in l2]
sorted排序而且用列表推导式
l = ['b','c','d','b','c','a','a'] [single.append(i) for i in sorted(l) if i not in single] print single
1->2->3->4转换成2->1->4->3.
class ListNode: def __init__(self, x): self.val = x self.next = Noneclass Solution: # @param a ListNode # @return a ListNode def swapPairs(self, head): if head != None and head.next != None: next = head.next head.next = self.swapPairs(next.next) next.next = head return next return head
1直接建立
dict = {'name':'earth', 'port':'80'}
2工厂方法
items=[('name','earth'),('port','80')] dict2=dict(items) dict1=dict((['name','earth'],['port','80']))
3frokeys()方法
dict1={}.fromkeys(('x','y'),-1) dict={'x':-1,'y':-1} dict2={}.fromkeys(('x','y')) dict2={'x':None, 'y':None}
#coding:utf-8def binary_search(list,item): low = 0 high = len(list)-1 while low<=high: mid = (low+high)/2 guess = list[mid] if guess>item: high = mid-1 elif guess<item: low = mid+1 else: return mid return Nonemylist = [1,3,5,7,9]print binary_search(mylist,3)
pychecker是一个python代码静态分析工具,它能够帮助python代码找bug会对代码的复杂度提出警告 pulint高阶的python代码分析工具,分析python代码中的错误查找不符合代码风格标准
find()方法能够在一个较长的字符串中查找子字符串,返回子串坐在位置的最左端索引
replace()方法返回某字符串的全部匹配项均被替换以后获得的字符串
转自:https://www.jianshu.com/p/177bb9c418ed
import osimport re s='这是一个test字符串'result=re.findall(r'[\u4e00-\u9fa5]',s) print(len(result)
python是一门解释性语言,运行以前不须要编译,动态类型语言在声明变量的时候不用声明变量的类型面向对象编程,编写快,用途普遍,能让困难的事变得容易.
def print_directory_contents(sPath):
““””
这个函数接受文件夹的名称做为输入参数,
返回该文件夹中文件的路径,
以及其包含文件夹中文件的路径。
"""
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
装饰器,装饰器是一种特殊的函数,要么接受函数做为输入参数,并返回一个函数,要么接受一个类为输入参数,并返回一个类
@标记是语法糖,可让你简单易读的方式装饰目标对象。
详细三种装饰器:Sheena@codementor
try....except执行try下的语句,若是发生异常,则执行过程跳到except语句,对每一个except分支顺序尝试执行,若是异常与except中的异常组匹配,指行相应的语句.
占位符
在python中,unittest是python中的单元测试框架,它有支持共享搭建,自动测试,在测试中暂停代码,将不一样测试迭代成一组.
在python中,模块是搭建程序的一种方式,每一个python代码文件都是一个模块,而且能够引用其余的模块,好比对象和属性。
一个包包含许多python代码的文件夹是一个包,一个能够包含模块和子文件夹
74题是一种方式
assert语句:判断assert后面紧跟语句是True,仍是False,若是是True则继续执行print若是是false则中断程序,调用默认的异常处理器,同时输出assert语句逗号的提示信息.
with语句:若是with语句或语句块中发生异常,会调用默认的异常处理器处理但文件仍是会正常关闭。
前者是贪婪匹配,会从头匹配到尾
然后者是非贪婪匹配,只匹配到第一个
将原函数的对象指定属性复制给包装函数对象,默认有module。name,doc
mod_python,这是一个apache内置模块,很严重的依赖于mod_python编译使用的python版本,和apache配套使用,不推荐
fastcgi,这是目前流行最广的作法,经过flup模块来支持的在nginx里面对应的配置指令是fastcgi_pass
scgi是cgi的替代版本scgi和fastcgi差很少nginx对应的配置指令是scgi_pass
Django中有三种继承方式
一般,你只想用父model来保存那些你不想在子model中重复录入的信息,父类是不使用的也就是不生成单独的数据表,这种状况下使用抽象基类继承 Abstract base classes
若是你想从现有的model继承并并让每一个model都有本身的数据表,那么使用多重表继承MUlti-table inheritance.
最后,若是你只想在model中修改python-level级的行为,而不涉及改变字段改变,代理model (proxy models)适用各类场合.
减小http的请求
使用cdn(cdn内容发布网络)是一组分布在不一样地理位置的web服务器 ,cdn可能选择网络阶跃数最小的服务器,或者具备最短期的服务器.
添加Expires头(页面初次访问会进行不少的http请求,可是经过使用一个长久的expires头,可使这些组件被缓存,下次访问的时候就能够减小没必要要的http请求,从而提升加载速度
压缩组件从http1.1开始web服务端能够经过http请求中的accept-Encoding头表示对压缩的支持
将脚本放在底部
避免css表达式(css表达式是动态设置css属性的一种强大而且)
from collections import Counterimport rewith open('a.txt', 'r', encoding='utf-8') as f: txt = f.read() c = Counter(re.split('\W+',txt)) #取出每一个单词出现的个数print(c) ret = c.most_common(10) #取出频率最高的前10个print(ret)
max(list)
说明max实现原理?
max(iterable, *[, default=obj, key=func]) -> value max(arg1, arg2, *args, *[, key=func]) -> value With a single iterable argument, return its biggest item. The default keyword-only argument specifies an object to return if the provided iterable is empty. With two or more arguments, return the largest argument.
num=9def f1(): num=20def f2(): print(num) f2() f1() f2()
结果:
9
9
AttributeError 试图访问一个对象没有的树形,好比foo.x,可是foo没有属性x IOError 输入/输出异常;基本上是没法打开文件 ImportError 没法引入模块或包;基本上是路径问题或名称错误 IndentationError 语法错误(的子类) ;代码没有正确对齐 IndexError 下标索引超出序列边界,好比当x只有三个元素,却试图访问x[5] KeyError 试图访问字典里不存在的键 KeyboardInterrupt Ctrl+C被按下 NameError 使用一个还未被赋予对象的变量SyntaxError Python代码非法,代码不能编译(我的认为这是语法错误,写错了)TypeError 传入对象类型与要求的不符合 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是因为另有一个同名的全局变量, 致使你觉得正在访问它 ValueError 传入一个调用者不指望的值,即便值的类型是正确的`
做者:绝地无双连接:https://www.imooc.com/article/36931来源:慕课网