利用global修改全局变量
a=5
def fun():
global a
a=4
fun()
print(a)
4
os:提供了不少与操作系统相关联的函数
sys:通常用于命令行参数
re:正则匹配
math:数学运算
datetime:处理日期时间
GIL 是python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。
多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个python解释器,所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大
这里**args,**kwargs主要用于函数定义,你可以将不定数量的参数传递给一个函数。这里的不定的意思是预先并不知道函数使用者会传递多少个参数给你,所以在这个场景下使用这两个关键字,*args是用来发送一个非键值对的可变数量的参数列表给一个函数
eg:
def demo(args_f,*args_v):
print (args_f)
for x in args_v:
print (x)
demo('a','b','c','d')
**kwargs允许你将不定长度的键值对作为参数传递给一个函数,如果你想要在一个函数里处理带名字的参数,你应该使用 **kwargs
eg:
def demo(**args_v):
for k,v in args_v.items():
print(k,v)
demo(name='nginx')
整型–int
布尔型–bool
字符串–str
列表–list
元组–tuple
字典–dict
__init__是初始化方法,创建对象后,就立刻被默认调用了,可接收参数
class Bike:
def __init__(self,WheelNum,Color):
self.WheelNum=WheelNum
self.Color=Color #__init__方法自动被调用,可以创建对象接收参数
def move(self):
print('车会跑')
#创建对象
BM=Bike(2,'green')
print('车的颜色为:%s' %(BM.Color))
print('车轮数量:%d' %(BM.WheelNum))
由上可知:只打印__init__方法执行的结果,move方法未执行。
class A(object):
def __init__(self):
print('这是init方法',self)
def __new__(cls):
print('这是cls的ID',id(cls))
print('这是new方法',object.__new__(cls))
return object.__new__(cls)
A()
print('这是类A的ID',id(A))
cls和类ID一样,说明指向同一个类,也就是cls就是创建的实例类
init方法和new方法返回值地址一样,说明返回值是对象
r , 表示需要原始字符串,不转义特殊字符
select distinct name from student
不可变数据类型:数值型、字符串型string和元组tuple
不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象(一个地址),用id()方法可以打印对象的id
可变数据类型:列表list和字典dict;
允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。
python:os.remove(文件名)
linux: rm 文件名
dict={'name':'zz','age':19,'city':'西安','tel':'13249869988'}
list=sorted(dict.items(),key=lambda i:i[0],reverse=False)
print('sorted根据字典键排序',list)
new_dict={}
for i in list:
new_dict[i[0]]=i[1]
print('新字典',new_dict)
(.)是贪婪匹配,会把满足正则的尽可能多的往后匹配
(.?)是非贪婪匹配,会把满足正则的尽可能少匹配
s='哈哈呵呵'
import re
res1=re.findall('(.*)',s)
print('贪婪匹配',res1)
res2=re.findall('(.*?)',s)
print('非贪婪匹配',res2)
ORM,全拼Object-Relation Mapping,意为对象-关系映射
实现了数据模型与数据库的解耦,通过简单的配置就可以轻松更换数据库,而不需要修改代码只需要面向对象编程,orm操作本质上会根据对接的数据库引擎,翻译成对应的sql语句,所有使用Django开发的项目无需关心程序底层使用的是MySQL/Oracle/sqlite…,如果数据库迁移,只需要更换Django的数据库引擎即可
redis: 内存型非关系数据库,数据保存在内存中,速度快
mysql:关系型数据库,数据保存在磁盘中,检索的话,会有一定的Io操作,访问速度相对慢
前端优化:
后端优化:
数据库优化:
同源策略需要同时满足以下三点要求:
1)协议相同
2)域名相同
3)端口相同
http:www.test.com与https:www.test.com 不同源——协议不同
http:www.test.com与http:www.admin.com 不同源——域名不同
http:www.test.com与http:www.test.com:8081 不同源——端口不同
只要不满足其中任意一个要求,就不符合同源策略,就会出现“跨域”
进程:
线程:
应用:
__init__:对象初始化方法
__new__:创建对象时候执行的方法,单列模式会用到
__str__:当使用print输出对象的时候,只要自己定义了__str__(self)方法
那么就会打印从在这个方法中return的数据
__del__:删除对象执行的方法
类:具有同种属性的对象称为类,是个抽象的概念。比如说:汽车、人、狗、神;
对象:日常生活中的所有东西都是对象,是类的实例化。比如说:推土车是汽车的实例化;姚明是人的实例化;小白(狗的名字)是狗的实例化;二郎神是神的实例化;
属性:用来描述具体某个对象的特征的是属性,是静态的。比如:姚明身高2.6米多;小白的毛发是棕色的;二郎神额头上有只眼睛;
方法:日每个对象有它们自己的行为或者是使用它们的方法,比如说一只狗会跑会叫等,我们把这些行为称之为方法,是动态的,可以使用这些方法来操作一个对象;
类的成员:属性和方法称为这个对象的成员,因为它们是构成一个对象的主要部分,没有了这两样东西,那么对象也没什么存在意义了。