1、运算符:
与 and
或 or
非 not
整除 //
浮点除 /
2、类型:
字符串str
可迭代对象Iterable
列表list
切片slice(一组数据或者一组数据中的部分,如[1,3,5,7,9])
slice对象s的起始和结束,s.start与s.stop
3、类型检查:isinstance(变量,类型) type(变量) [callable(变量)——仅用于检查对象是否是函数或者可调用对象(包含__call__()方法的类实例)]
isinstance除了指定类型外,可以检测变量是否为类型组中的一种
isinstance([1,2,3],(tuple,list))
True
4、强制类型转换:
Iterator转list:
list( it )
Iterable转Iterator:
iter( it )
chr与str
chr(66)#ASCII码为66的字符'B'
str(66)#字符串'66'
5、全局变量 :
函数外的一个变量,如果想在函数内使用并且不被认为是函数内部的局部变量。
在函数外定义,在函数内用global声明
A=0defX():globalA
...
6、调用:
工作目录下的.py文件中的类可以直接在别的程序中通过from A import B调用
7、错误:
ZeroDivisionError:除零
ValueError:
AttributerError:参数错误
IOError:IO
KeyError: 引用了错误的下标 D[key],即D中不存在关键字Key
8、方法:
获取方法和属性名
dir():获取类或对象中的所有方法和属性名
__dict__:返回包含对象所有属性和方法名的字典
exit():程序中断函数
time.sleep( float f ): 程序推迟f秒执行
time.time():当前系统时间,可以在程序结束time减去开始time,得到程序运行时间
os.getpid():获取父进程的ID
os.listdir():列出当前目录下的所有文件名
os.listdir('path'):列出指定路径下的所有文件名
os.path.isfile(x):判断x是否为文件
os.path.isdir(x):判断x是否为目录
os.path.splitext(x):将x分割为两部分——文件名+扩展名,如'test.txt'分割为('test','txt')
以一个Student类为例,S是Student类对象,S={'name'='Bob','age'=20,'score'=90}
几个常用的定制类的方法
__str__(self):print(S)
__iter__(self):将一个类改造为可以用于 for …… in循环
__getitem__(self,n):通过下标如 S[2] 访问上文的改造类中的元素
__getattr__(self,attr):访问不存在属性S.attr时返回的内容
__call__(self):通过S()调用实例S自身时的答案
__setattr__(self,key,value):每在__init__中运行一行self.key=value时,都会运行一次__setattr__(self,key,value)
str.lower(),str.upper():字符串中所有英文字符小写/大写(其他字符不变)
len(str):获取字符串长度
str.capitalize():将字符串的首字母大写,其余字母小写
int(s , base = N):将一个N进制的字符串s化为十进制整数
random.random():返回[0,1)区间内的一个实数
random.randint(a,b):返回[a,b)间的一个整数
time.time():返回当前时间的时间戳(自1970年经过的秒数)
time.sleep():推迟多少秒执行
d=json.dumps(S)
json.dump(f,S)#json序列化
S=json.loads(d)
S=json.load(f)#逆序列化
threading.current_thread():当前线程
threading.current_thread().name:当前线程的名字
语句
1、判断元组Tuple/列表List是否为空
#现有元组T 列表L 初始化操作略去
if notT:print('元组T为空')if notL:print('列表L为空')
1.5、判断字符串是否为空
ifS:print('字符串非空')
2、用一句话将一个List中的所有字符串小写化
A=[s.lower() for s in L if isinstance(s,str)]
这里是列表生成式的内容,由于List中可能含有非str类型,所以要用if筛选
3*、初始化一个List并向其中添加元素
L=[]
L.append(1)
L.append(2)
不能在初始化为空List后直接用L[0]=1的方式添加元素,否则会报错IndexError
3、在一个List的首尾添加两个整数1构成一个新的List
L=[ 1 ] + L + [ 1 ]
杨辉三角,根据上一行的List生成下一行的List
L=[1] + [ L[x] + L[x+1] for x in range( len(L)-1 ) ] + [1]
3.1、应用slice切片技术,取出一个List中的部分数据(比如下标为4,6~9,11~15),构成一个新的List
L=[L2[4]]+L2[6:10]+L2[11:16]
要注意的有两点:
①单元素添加时,必须要用 [ ]包括住。否则该元素会被视为某个元素而非List对象,从而导致报错。如上文的 [ L2[4] ]而非 L2[4]
TypeError: can only concatenate str (not "list") to str
②slice[ start : end ]的实际范围为从start到end-1,所以提取时应注意end应该比要提取的下标多一。如上文提取下标6~9,写为L2[6:10]而非L2[ 6:9 ]
3.5、List首尾匹配关系
假设有一个List[ 4 ],则第一个元素下标0对应最后一个元素下标-1,第二个1对应倒数第二个-2
可得第i个与倒数第i个元素的对应关系为下标 i —— -1-i
这在回文数、首尾匹配方面有一定用处
3.6 创建一个队列对象
importqueue
task_queue=queue.Queue()
4、List变为索引-元素对,也是一种key-value对,只是key对于下标,value对应元素
enumerate()方法:
for i,value in enumerate( [ '1', '2', '3'] ):print(i,value)
01
1 2
2 3
可以用这种方法将一个List转化为Dict对象
D={}for i,value in enumerate( [ '1', '2', '3'] ):
D[i]=value
D
{0:'1', 1: '2', 2: '3'}
5、将List变为Dict的一般方法:zip函数
C=zip(A,B)
zip接收两个参数A,B,作用是构造一个Zip对象C,C可通过强制类型转换dict()转化为Dict对象。
D的Key为A,Value为B
A,B长度不同时,多出来的元素不再显示。
A=[str(x) for x in range(1,11)]
B=range(1,11)
C=zip(A,B)
CD=dict(C)
D
{'1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, '10': 10}
5.1 创建dict对象的三种方法:
D1={'name':'Bob','age':20,'score':90}
D2=dict(name='Bob',age=20,score=90)
D3=dict([('a',1),('b',2),('c',3)])
注意用dict()创建时,变量不需要单引号''
5.2 创建一个可以通过属性访问的Dict
例如:d为一个Dict对象,可以通过d['Key']和d.Key两种方式访问value
classDict(dict):def __init__(self,**kw):
super().__init__(self,**kw)def __getattr__(self,key):try:returnself[key]exceptKeyError:raise AttributeError('Dict has no attribute %s'%key)
注意:1、上述代码初始化中的**kw(代码中标红处),因为我们不确定会传入多少个类似a=1,b=2……这样含参数名的参数,所以在处理dict的子类时,用关键字参数**kw接收这些参数,并用
super().__init__(self,**kw)
进行初始化,会起到事半功倍的效果。
2、对于通过属性访问(d.a这样的形式)的问题,都要涉及到内部方法
__getattr__(self,key)
而通过d.a得到的值,即是该函数return的值
一般要用try...except...语句写,try中写return,except抛出访问失败时的错误
5.3、初始化一个继承自字典对象的类对象时
不需要把字典对象的所有内容写入参数,而代之以**kw,并将该**kw传入super().__init__()的参数中(接5.2)
classDict(dict):
def __init__(self,**kw):
super().__init__(self,**kw)
6、raise,错误抛出
if gender != 'Male' and gender != 'Female':raise TypeError('Wrong Input')
7、当两个变量的变化需要中间变量参与时的简单写法
for i inL:
t=a
a=b
b=a+t#可以修改为
for i inL:
a,b=b,a+b
7.2、为一个变量进行选择性赋值的简单写法
a= func() or 1 #当func()为None或者0时取1 否则取func()
8、字符串&字符串
8.1、判断某个字符串中是否包含某个子串,例如
if '.' ins:print(True)#或
if s.find('.')!=-1:print(True)
8.2、输出随机字母
print(chr(random.randint(65,90)))
注意chr与str的区别,见4强制类型转换
9、筛选
①列表生成式:[x for x in ... if 条件]
②filter(f , L):对L中的元素进行f,根据f返回True还是Fasle选择是否保留这个元素。结果是Iterable,需要用list()强制类型转化为List
9.0、筛选出当前目录下的py文件
[x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']
这几个函数的作用可见上文'方法'模块
9.1、筛选出类A有而类B没有的方法
[ x for x in A.__dict__.keys() if x not in B.__dict__.keys()]
9.2、筛选出一个List中的偶数
L=list(filter(lambda x: not x%2,[1,2,4,5,7,8]))
[2, 4, 8]#等价于
[xfor x in [1,2,4,5,7,8] if not x%2]
[2, 4, 8]
10、筛选出某个文件中所有目录下包含某个字符的文件
defsearch(str):for x in os.walk(os.path.abspath('.')):for y in range(len(x[2])):if str in x[2][y]:print(os.path.join(x[0],x[2][y]))
11、用with语句安全打开文件
with open('Test.txt','r') as f:print(f.read())
12、JSON序列化class
D=json.dumps(S,default=lambda obj:obj.__dict__)
13、打印若干个相同的字符,不用for
print('A'*20)#打印20个'A'
AAAAAAAAAAAAAAAAAAAA
14、返回一个非A即B的数值
return A if A>B else B
这种也可以用于匿名函数lambda中:
lambda a,b:a if a>b elseb#等价于
def(a,b):return a if a>b elseb#等价于
def(a,b):if a>b:
reutrn aelse:return b
15
16、进程与线程
①进程
from multiprocessing import Process #单线程
from multiprocessing import Pool #通过进程池的方式批量创建子进程
def X(n): #进程要执行的过程
pass
#创建单个子进程
p=Process(target=X,args=(n,)) #target为上文进程要执行的代码 args为传入的参数
p.start() #启动进程
p.join() #等待子进程结束继续往下执行
#利用进程池批量创建子进程
p=Pool(4)for i in range(5):
p.apply_async(X,args=(n,))
p.close()
p.join()#与单个进程不同,join前要先close
②线程
import threading #线程相关的模块
def A(n): #线程运行的代码
passt=threading.Thread(target=A,args=(n,),name='threadname')
t.start()
t.join()
17、二进制文件处理
struct模块
任意数据类型保存为二进制文件
importstructprint(struct.pack('
b'\x94\x01\x00'
读取二进制文件中保存的文件头信息
例如:读取bmp图像的文件头信息(保存在bmp文件的前30个字节中)
with open('Test.bmp','rb') as f:
s=f.read(30)print(struct.unpack('
(b'B', b'M', 33510, 0, 54, 40, 109, 102, 1, 24)
18、正负号与索引相关的处理
比如:将L1=[1,3,5,7,9] 变为L2=[1,-3,5,-7,9]
关键点:(-1)**索引 * 元素值
L=map(lambda x:(-1) **((x-1)/2)*x, [1 ,3 ,5 ,7 ,9])
list(L)
[1.0, -3.0, 5.0, -7.0, 9.0]