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中如何获取类属性的列表

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为AValue为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中写returnexcept抛出访问失败时的错误

 

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)

 

posted @   ShineLe  阅读(311)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
历史上的今天:
2019-06-09 WinRar:你需要从上一压缩卷启动解压命令以便解压
点击右上角即可分享
微信分享提示