Python:一些常用语句/方法(不定时更新)
0、代码改进技巧
1)导入一个库的多个class时,不用每个都写一行,可以写在同一行,不同库之间用逗号隔开
from tkinter import Tk,Text
2)为导入的库起别名
1 | import pandas as pd |
1、基础知识相关
1)运算符
与 and
或 or
非 not
不等于 !=
是 is
//判断是否为空 if a is np.nan: ...
//有时在用numpy.float64类型的nan时上述方法会失效,可以用下一个方法
if np.isnan(a):
...
在一些取值之内(适用于多种取值,如字符串,np.nan,数字):in
//判断a是否为1,2,3中的一个 if a in [1,2,3]: ...
字符串格式化:格式化
#小数 '{:.2f}'.format(3.1415926) '3.14' #百分比 '{:.2%}'.format(0.25) '25.00%'
整除 //
浮点除 /
2)类型相关
字符串str
可迭代对象Iterable
列表list
切片slice(一组数据或者一组数据中的部分,如[1,3,5,7,9])
slice对象s的起始和结束,s.start与s.stop
类型检查
isinstance(变量,类型)
type(变量)
callable(变量)——仅用于检查对象是否是函数或者可调用对象(包含__call__()方法的类实例)
isinstance除了指定类型外,可以检测变量是否为类型组中的一种
isinstance([1,2,3],(tuple,list))
True
强制类型转换
Iterator转list:
list( it )
Iterable转Iterator:
iter( it )
chr与str
chr(66)#ASCII码为66的字符'B' str(66)#字符串'66'
字符串转小数
float('66.0') 66.0
3)全局变量
函数外的一个变量,如果想在函数内使用并且不被认为是函数内部的局部变量。
在函数外定义,在函数内用global声明
A=0 def X(): global A ...
4)调用其他模块
工作目录下的.py文件中的类可以直接在别的程序中通过from A import B调用
5)从键盘输入
key = input('输入一个数字')#输入的key是String
#转int
int(key)
3、错误
常见的错误类型及继承关系:https://docs.python.org/3/library/exceptions.html#exception-hierarchy
ZeroDivisionError:除零
ValueError:
AttributerError:参数错误
IOError:IO
KeyError: 引用了错误的下标 D[key],即D中不存在关键字Key
4、方法
获取方法和属性名
dir():获取类或对象中的所有方法和属性名
__dict__:返回包含对象所有属性和方法名的字典
python中有没有查看一个对象所有属性、属性的值、方法的函数?
exit():程序中断函数
time.sleep( float f ): 程序推迟f秒执行
time.time():当前系统时间,可以在程序结束time减去开始time,得到程序运行时间
文件、路径
os.getcwd():获取当前路径
获取上一级目录的路径:os.path.abspath(os.path.join(os.getcwd(), ".."))
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'),后缀是带.的
for file in os.listdir(): f,e=os.path.splitext(file) ...#对f的处理
获取上一级目录的路径:os.path.abspath(os.path.join(os.getcwd(), ".."))
判断某个路径是否存在:os.path.exists(路径)
创建目录:os.mkdir(路径)
if not os.path.exists(new_root): os.mkdir(new_root)
以一个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():将字符串的首字母大写,其余字母小写
str.split():字符串分割https://www.cnblogs.com/LesBlog/articles/11432597.html
str.startswith(obj , beg=0 , end=len(string)):检查str是否以某个子串开头
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 not T: print('元组T为空') if not L: print('列表L为空')
1.5、判断字符串是否为空
if S: 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.2、去除List中的重复元素
L=[1,3,3,3,4,5,5,6,8,8,9,9,9,0] L=list( set(L) ) L [0, 1, 3, 4, 5, 6, 8, 9]
对List去重后按照原顺序排序
学习自:解决python字典(Dict)和集合(Set)的无序问题 - 惋奈 - 博客园
words_char = ['a','a','e','c','a','d','d','c','b'] words = list(set(words_char)) # 去重 set后词语顺序随机 words.sort(key = words_char.index) # 将元素顺序变为原始顺序 print(words) #输出 ['a','e','c','d','b']
3.5、List首尾匹配关系
假设有一个List[ 4 ],则第一个元素下标0对应最后一个元素下标-1,第二个1对应倒数第二个-2
可得第i个与倒数第i个元素的对应关系为下标 i —— -1-i
这在回文数、首尾匹配方面有一定用处
3.6 创建一个队列对象
import queue task_queue=queue.Queue()
4、List变为索引-元素对,也是一种key-value对,只是key对于下标,value对应元素
enumerate()方法:
for i,value in enumerate( [ '1', '2', '3' ] ): print(i,value) 0 1 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) C <zip object at 0x000001D8C52F8B88> D=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
class Dict(dict): def __init__(self,**kw): super().__init__(self,**kw) def __getattr__(self,key): try: return self[key] except KeyError: 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)
class Dict(dict):
def __init__(self,**kw):
super().__init__(self,**kw)
6、异常
手工抛出异常:raise xxxError
if gender != 'Male' and gender != 'Female': raise TypeError('Wrong Input')
异常处理:try...except...
try: #可能出错的语句块 except xxxError: #异常处理的语句
6.1、无限循环程序的终结方式
①try...except...
try: while(1): #程序 except EOFError: pass
②在其中设置变化的变量,其值随循环不断变化,直到达到临界就break
③异步进程/线程中,通过terminate()方法终结
7、当两个变量的变化需要中间变量参与时的简单写法
for i in L: t=a a=b b=a+t #可以修改为 for i in L: a,b=b,a+b
7.2、为一个变量进行选择性赋值的简单写法
a= func() or 1 #当func()为None或者0时取1 否则取func()
7.3:return与and连用:选择性返回
作用:类似C中的?:选择运算符
return A and B #等价于 return B if C else A #如果C为True就返回B,否则返回A #即 if A: return A else: return B
7.3.5、用选择表达式赋值
max = A if A>B else B #等价于 if A > B: max = A else: max = B
8、字符串&字符串
8.1、判断某个字符串中是否包含某个子串
if '.' in s: 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 条件]
https://www.cnblogs.com/ShineLeBlog/articles/13092386.html
②filter(f , L)
对L中的元素进行f,根据f返回True还是Fasle选择是否保留这个元素。结果是Iterable,需要用list()强制类型转化为List
https://www.cnblogs.com/ShineLeBlog/articles/13164564.html
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] #等价于 [x for x in [1,2,4,5,7,8] if not x%2] [2, 4, 8]
10、筛选出某个文件中所有目录下包含某个字符的文件
def search(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]))
具体解释见:https://www.cnblogs.com/ShineLeBlog/articles/13768531.html最后
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 else b #等价于 def(a,b): return a if a>b else b #等价于 def(a,b): if a>b: reutrn a else: return b
15、批量处理list
map:对list中的每个元素进行函数处理
reduce:对list中每两个元素进行函数处理
filter:筛选list中符合条件的元素构成新的list
sorted:对list中的元素进行排序得到新list
2020.6.19 函数式编程 高阶函数 map&reduce filter sorted
16、进程与线程
一个很好的网站:https://www.cnblogs.com/whatisfantasy/p/6440585.html
①进程
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): #线程运行的代码 pass t=threading.Thread(target=A,args=(n,),name='threadname') t.start() t.join()
17、二进制文件处理
struct模块
任意数据类型保存为二进制文件
import struct print(struct.pack('<I',103456)) b' \x94\x01\x00'
关于参数作用:https://www.cnblogs.com/ShineLeBlog/articles/13787143.html
读取二进制文件中保存的文件头信息
例如:读取bmp图像的文件头信息(保存在bmp文件的前30个字节中)
with open('Test.bmp','rb') as f: s=f.read(30) print(struct.unpack('<ccIIIIIIHH',s)) (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]
19、in
用于检查某个元素是否在某个序列之中。
这里的序列可以是String、Dict、...,
对Dict用in,检查的是Key部分
20、图像相关
20.1、用try...except...安全打开图像文件
try: with Image.open('文件') as im: #处理im except OSError: #异常处理
22、利用正则,查找字符串中第一个中文字符的起始位置(此时不用find):
import re
pattern=re.compile(r'[^\u0000-\u007f]')
match=pattern.serch(fn)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
2019-06-09 WinRar:你需要从上一压缩卷启动解压命令以便解压