#python 学习记录
变量赋值
直接贴代码
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# array
li1 = li2 = li3 = []
print id(li1)
print id(li2)
print id(li3)
li1.append('123')
li2.append('456')
li3.append('789')
print id(li1)
print id(li2)
print id(li3)
print 'array----------------------------'
# int
int1 = int2 = int3 = 0
print id(int1)
print id(int2)
print id(int3)
int1 = 1
print id(int1)
print id(int2)
print id(int3)
int2 = 1
int3 = 1
print id(int1)
print id(int2)
print id(int3)
int1 = 2
int2 = 3
int3 = 4
print id(int1)
print id(int2)
print id(int3)
print 'int----------------------------'
#dict
dict1 = dict2 = dict3 = {}
print id(dict1)
print id(dict2)
print id(dict3)
dict1['param1'] = 1
dict2['param2'] = 2
dict3['param3'] = 3
print id(dict1)
print id(dict2)
print id(dict3)
print 'dict----------------------------'
#str
str1 = str2 = str3 = ''
print id(str1)
str1 = '123'
print id(str1)
print id(str2)
print id(str3)
str2 = '123'
str3 = '123'
print id(str1)
print id(str2)
print id(str3)
str1 = '321'
str2 = '234'
str3 = '345'
print id(str1)
print id(str2)
print id(str3)
str1 = '123tintins'
str2 = '123tintins'
str3 = '123tintins'
print id(str1)
print id(str2)
print id(str3)
print 'str----------------------------'
打印结果:
41051440
41051440
41051440
41051440
41051440
41051440
array----------------------------
32417492
32417492
32417492
32417480
32417492
32417492
32417480
32417480
32417480
32417468
32417456
32417444
int----------------------------
32221920
32221920
32221920
32221920
32221920
32221920
dict----------------------------
31998752
41365256
31998752
31998752
41365256
41365256
41365256
41365400
41365424
41365448
41071840
41071840
41071840
str----------------------------
[Finished in 0.3s]
情况2: 定义自定义类型,如果不进行赋值,直接使用属性会报错,简直奇葩了啊
class stGpuResource:
def __init__(self):
gpuModel=''
gpuNum=0
gpuUsed=0
if __name__ == "__main__":
item = stGpuResource()
it = 1
print(it)
item.gpuModel = 1
print(item.gpuModel)
print(item.gpuNum)
####分析过程
blabla
命名空间:
python 利用命名空间来保存程序中的变量,命名空间是个dict,全局变量存放在global字典中
程序中读取配置文件中的内容,协议解析出key和val。做为程序的全局环境变量。
字符串
replace()
strdst = str.replace(src,dst,ncount) 替换ncount次
接口不改变原字符串,只返回变动后的字符串
find('dst',nCount) 从第nCount个下标开始找
encode() decode()
表示字符串的编码和解码,字符串在python内部以unicode编码保存,在做编解码的时候需要先将其他编码字符串解码(decode)成unicode,再从unicode编码(encode)到另外一种编码
eg1. decode是将其他编码的字符串转换成unicode str1.decode('gb2312')表示将gb2312编码的字符串str1解码成unicode编码。
eg2. encode作用是将unicode编码转换成其他编码字符串。str2.encode('gb2312') 将unicode字符串编码成gb2312
urllib
urlencode()
对url的参数列表进行转码,将url中不能识别的中文或者字符进行编码转换,该函数只能对一个dict进行,当对一个字符串进行转换的时候需要用quote()
对应需要解码的时候调用接口urldecode()
strip lstrip rstrip
去掉字符串前后的指定字符 参数为空去掉空格
just ljust rjust 填充
intern()
函数可以将变量池化, 池化有助于对象数量的减少,和内存的消耗,提升性能
api封装
1、当在一个py中调用另外一个py的接口时会用到import关键字。
2、FileA,FileB两个py在同一目录下的时候,直接可以在FileA中import FileB
3、当两个文件不在同一目录下时,需要在引入的文件夹下新建一个__init__.py空文件
4、当File中含有多个类,可以直接from File import * 直接引入所有的类,也可以只引入某一个类
表达式
三元表达式:
val = val1 if True else val2
列表生成式:
l = [i for i in range(10)]
l = []
for i in range(10):
l.append(i)
l = [i for i in range(10) if i>5]
生成器表达式:
[x for x in range(3)]
静态页面解析 从静态页面中查找关键信息
1、正则
TODO...
2、html解析
from lxml import etree
父子类继承
不同于C++ 的父子类继承,py父子类继承的时候需要在子类__init__接口中手动调用父类的__init__接口
@符号 修饰符
@符号修饰函数,可以用在函数的定义部分,必须是函数定义的前一行,
一个修饰符就是一个函数,它将被修饰的函数作为参数,并返回修饰后同名函数或其他可调用的东西。
先调用修饰的函数,再调用实际函数。
@修饰类 —
函数调用
python 允许函数调用的时候参数列表不按照参数定义的顺序,这种时候需要在调用的时候指明关键字
def printme(name,age):
…
#call func
printme(age = 10,name=‘123’)
lambda lambda [arg1…] :expression
类方法定义:
python 提供3种定义类的方法
1、常规成员函数定义
2、@classmethod 修饰方法 修饰的方法第一个参数 从self 变成 cls 调用的时候不需要实例化当前类
3、@staticmethod 修饰方法 声明一个静态方法
成员变量 python没有public private等关键词修饰类成员变量
私有变量 以__ 开头的变量 类外不可访问
公有变量,全局变量, 非私有用类或实例都能访问 类访问的是初始化的值
局部变量 函数或块内部的变量 外部不可访问
代码块:
python 用tab缩进来划分一个代码块 类似C++的{}
with as 是python的一个流程控制语句,上下文管理器,方便对一些io,文件操作处理,保证无论过程是否异常
都会正常关闭句柄,释放资源
可以将with 和as之间的函数执行结果返回到 as后的变量上,用的时候也可以不带 as 和后面的变量
数据类型
int 类型是不允许被修改的,修改会重新分配一块内存
python 有6个序列的内置类型,常见列表和元组,序列都可以进行操作包括索引,切片,加乘,检查成员
列表: 不需要有相同的数据类型,列表使用方括号
list1 = [‘physics’, ‘chemistry’, 1997, 2000]
元组与列表相似,不同之处在于元组元素不可以修改,元组使用小括号
tup1 = ('physics', 'chemistry', 1997, 2000)
字典
dict = {'a': 1, 'b': 2, 'b': '3'}
uri = url[ : url.index('?')]
python 切片操作 从url头开始一直到?字符结束
RowList = [j+1 for i in rowIndexList for j in range(len(indexList)) if indexList[j] == (preName+str(i))]
类成员声明…
python 不会显式的声明一个类成员变量,所以就是在成员函数内部使用 self.var 这种方式来声明一个类的成员变量,
解释器就可以在全局的范围内进行查找成员变量
同时
1、 _xx 这种以单下划线开头的表示protected类型变量
2、 __xx 双下划线开头的变量是私有类型变量
3、 xx 定义的是特殊的方法 eg main init
多变量赋值
a = b = c = 1
三个变量分配到相同的内存空间
id 用来取变量地址,相同值的变量 会利用引用次数来进行管理
—内部采用类似gmalloc方式来进行内存管理.
类的构造:
python —
python 类的构造会调用两个接口 new init,new 方法会负责创建一个实例,init负责初始化这个实例
类默认会带一个self 参数,类似C++ 的this,
运算符 **= 幂赋值
pyc 文件说明.
python 实际是一个编译解释型语言,运行程序以前会先将程序编译成pyCodeObject,程序结束之后会将pyCodeObject写入
pyc文件中,下次启动时会先检查py和pyc的文件修改时间,假如py修改时间晚于pyc,需要重新编译,否则直接pyc文件内容
作为pyCodeObject来输出程序结果
—0819
- 关键字作用
在参数调用的时候 - func(*arg)的作用是把序列args中的每个元素当做位置参数传递。
** func(**kwargs) --将dict 转换成参数 kwargs 等于 {‘a’:1,‘b’:2,‘c’:3} ,那这个代码就等价于 test(a=1,b=2,c=3)
在函数定义中:
- def func(*args): *args 表示把传进来的位置参数都装在元组中
** def func(**args) **args 表示把传进来的参数都作为 dict args中的元素
变量的声明周期:
python中能够改变变量作用域的代码块是 def 函数定义,class 类定义 lamda匿名函数
此外 if/ try for/while 这些并不能改变变量的作用域,块内定义的块外可以访问。
—0903
zip 函数将对象中的元素打包成元组。
map 会根据提供的函数 做元素映射。
—0904
闭包和修饰器.
python 闭包
<<<<<<<<<<<<<<<<<<<<
def test():
x = [1,2]
def a():
x.append(3)
def b():
print hex(id(x)),x
return a,b
a,b = test()
a()
b()
闭包是指 在函数离开环境之后,依然保持有其上下文状态。
在闭包函数内,将外部变量绑定到返回内函数的func_closure中,这时变量的引用计数增加,所以闭包函数test的堆栈帧没有了 x对象也不会被收回。
一般情况,如果函数结束那么函数内部的变量,都需要还给系统,闭包是一种特殊的情况,外部函数在结束的时候发现自己的临时变量将来会在内部函数中用到就会把临时变量绑定给内部函数,func_closure 然后自己结束。
闭包的条件
1、在一个外函数中定义一个内函数
2、内函数中用到了外函数的临时变量
3、并且外函数的返回值是内函数的引用。
修饰器:
原型–
import time
def showtime(func):
def wrapper():
start_time = time.time()
func()
end_time = time.time()
print(‘spend time is{}’.format(end_time - start_time))
return wrapper
def foo():
print(‘foo…’)
time.sleep(3)
foo = showtime(foo)
foo()
不带参装饰器
<<<<<<<<<<<<<<<<<<<<
import time
def showtime(func):
def wrapper():
start_time = time.time()
func()
end_time = time.time()
print(‘spend time is{}’.format(end_time - start_time))
return wrapper
@showtime #foo = showtime(foo)
def foo():
print(‘foo…’)
time.sleep(3)
@showtime #doo = showtime(doo)
def doo():
print(‘doo…’)
time.sleep(3)
foo()
doo()
带参的被装饰函数
<<<<<<<<<<<<<<<<<<<<
import time
def showtime(func):
def wrapper(a,b):
start_time = time.time()
func(a,b)
end_time = time.time()
print(‘spend time is{}’.format(end_time - start_time))
return wrapper
@showtime #add = showtime(add)
def add(a,b):
print(a+b)
time.sleep(3)
@showtime #sub = showtime(sub)
def sub(a,b):
print(a-b)
time.sleep(3)
add(5,4)
sub(3,2)
带参的装饰器
—实际是对原有装饰器的一个封装,并返回一个装饰器,当使用@time_logger(3)
调用的时候 python能发现这一层封装 并将产生传递到装饰器环境中
<<<<<<<<<<<<<<<<<<<<
import time
def time_logger(flag=0):
def showtime(func):
def wrapper(a,b):
start_time = time.time()
func(a,b)
end_time = time.time()
print('spend time is{}'.format(end_time - start_time))
return wrapper
return showtime
@time_logger(2) #add = showtime(add)
def add(a,b):
print(a+b)
time.sleep(3)
add(5,4)
类修饰器:
原型–
<<<<<<<<<<<<<<<<<<<<
import time
class Foo(object):
def init(self,func):
self._func = func
def __call__(self):
start_time = time.time()
self._func()
end_time = time.time()
print('spend time is{}'.format(end_time - start_time))
@Foo #bar = Foo(bar)
def bar():
print(‘bar…’)
time.sleep(3)
内置装饰器
1、staticmethod 类似实现了静态方法 封装之后可以直接使用 classname.method
2、property 经过property 装饰过的函数不再是一个函数 而是一个property
3、classmethod 与staticmethod类似,只差一点区别
第一个参数需要是表示自身类的cls参数
可以来调用类的熟悉 类的方法,实例化对象。
ast库
dstDict = ast.literal_eval(srcStr)
对于一些由str类型转dict类型时,功能比json库强大太多
1、json库不支持单引号,组成的key-val 对
2、json库对于bool类型要求严格,不支持true,false小写格式,需要转换成True,False
3、json库对字符串本身包含的u""开头的unicode字符串,可以检测去掉
‘{u’success’: True, u’updateNum’: 0, u’list’: [], u’addNum’: -1, u’failNum’: 0, u’totalNum’: 2}’
4、json库对于key_val中对val是tuple类型不支持
{
“logtime”:1573092395.51,
“center”: (“JSESSIONID=3EEB0A4D95BE6DBF050475DEE1AB8ED3; Path=/center; HttpOnly”, “OPSMGRCASTGC=TGT-11-UIh19IsWVUJ7RLhHCjHQg9IV5OaLchOIcSaG4Y7iV0GscPrAeO-cas”),
“sac”: “OPSMGRCASTGC=TGT-11-UIh19IsWVUJ7RLhHCjHQg9IV5OaLchOIcSaG4Y7iV0GscPrAeO-cas sac_jsession=6EDA1D68402C64C512BCEE8F7342434E;”,
“aim-web”: (“SESSION=983e6d30-ad58-4384-a64a-edc8a5e5a03c;”, “fe668ea2-2db4-47b9-abc6-30ae08b904a4”),
“edm”: (“JSESSIONID=jTLw1kpOKHZCZg0wuom1BWtm4ZzXPUe74lTSPh3b”, “CASTGC=TGT-982-kafIjWDYMjYQ4TrW1G73XkME3Mneqbdb7bNT107ZEarm3EDE5c-cas”),
“portal”: (“JSESSIONID=uwYIg6pcWYZeOa-xfX5K_I3OGKGJI8Gx4qNExD0x; curtTabId=all; openIds=; latestUserName=admin; configMenu=; _languageType=zh_CN;CASTGC=TGT-982-kafIjWDYMjYQ4TrW1G73XkME3Mneqbdb7bNT107ZEarm3EDE5c-cas”, “CASTGC=TGT-982-kafIjWDYMjYQ4TrW1G73XkME3Mneqbdb7bNT107ZEarm3EDE5c-cas”),
“cac”: “JSESSIONID=7FE1FC63B47B875B313F65583A14B2EA; OPSMGRCASTGC=TGT-11-UIh19IsWVUJ7RLhHCjHQg9IV5OaLchOIcSaG4Y7iV0GscPrAeO-cas”
}
ast库可以完美支持这些
2-3
除了print…
在库引入这里
2直接 from fileName import Module
3需要 from .fileName import Module