python 高级使用技巧(推导式,三元,上下文管理详解)
推导式(生成式)
推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。
列表生成式
列表生成式可以快速创建一个列表
语法格式:
lis = [放入列表的元素 for 可迭代对象元素 in 可迭代对象 if 条件]
如果不写if 条件相当于if True
举例
# 不使用列表生成式取出所有dsb
l = ['alex_dsb', 'lxx_dsb', 'wxx_dsb', "xxq_dsb", 'egon']
new_l=[]
for name in l:
if name.endswith('dsb'):
new_l.append(name)
# 使用列表生成式取出所有dsb
l = ['alex_dsb', 'lxx_dsb', 'wxx_dsb', "xxq_dsb", 'egon']
new_l=[name for name in l if name.endswith('dsb')]
print(new_l)
# 把所有小写字母全变成大写
new_l=[name.upper() for name in l]
print(new_l)
# 把所有的名字去掉后缀_dsb
# 方法一:
new_l=[name.replace('_dsb','') for name in l]
print(new_l)
# 方法二:
new_l=[name.split("_")[0] for name in l]
print(new_l)
字典生成式
字典生成式可以快速创建一个字典
语法格式
dic = {放入字典的key:放入字典的value for 可迭代对象元素 in 可迭代对象 if 条件}
如果不写if 条件相当于if True
举例:
keys=['name','age','gender']
dic={key:None for key in keys}
print(dic)
items=[('name','egon'),('age',18),('gender','male')]
res={k:v for k,v in items if k != 'gender'}
print(res)
集合生成式
集合生成式可以快速创建一个集合
语法格式:
s = {放入集合的元素 for 可迭代对象元素 in 可迭代对象 if 条件}
如果不写if 条件相当于if True
举例:
keys=['name','age','gender']
set1={key for key in keys}
print(set1,type(set1))
# {'gender', 'age', 'name'} <class 'set'>
生成器表达式
生成器表达式可以快速创建一个生成器
语法格式
g=(放入生成器的元素 for 可迭代对象元素 in 可迭代对象 if 条件)
如果不写if 条件相当于if True
注意:()得到的不是元组类型
举例
g=(i for i in range(10) if i > 3)
print(g,type(g))
print(g)
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
# 计算文件中字符的总数量
with open('笔记.txt', mode='rt', encoding='utf-8') as f:
# 方式一:
res=0
for line in f:
res+=len(line)
print(res)
# 方式二:生成列表进行叠加
res=sum([len(line) for line in f])
print(res)
# 方式三 :效率最高,生成生成器进行累加
res = sum((len(line) for line in f))
# 上述可以简写为如下形式
res = sum(len(line) for line in f)
print(res)
三元表达式
三元表达式是if语句的简略写法
语法格式:
res1 if 条件 else res2
res1是条件成立时返回的结果
res2是条件不成立是返回的结果
举例:
# 返回较大值
def func(x,y):
if x > y:
return x
else:
return y
res=func(1,2)
print(res)
# 使用三元表达式完成
x=1
y=2
res=x if x > y else y
print(res)
上下文管理
with的作用:
with语句
:可以代替try...except...finally语句,使代码更加简洁;context
:通常是表达式,返回一个对象;var变量
:用来保存context返回的对象,可以是单个值或元组;with_suite
:使用变量var对context返回对象进行各种操作的代码段
with打开文件
# 查看文件内容
XZ:learn xz$ cat with.txt
with...as...
12345
abcde
In [2]: with open('with.txt','r+') as f:
...: for line in f.readlines():
...: print(line)
...: print('with is closed : ', f.closed)
...:
...:
with...as...
12345
abcde
with is closed : True
- 打开文本
with.txt
,f
变量接收文件对象返回的对象; - 读取文本中的内容,逐行打印;
with
中的代码执行完成后,会自动关闭文件;- 如果
with
语句中没有做try...except
异常处理,出现错误时会直接将异常交给Python解释器抛出,不会自动关闭文件,如果做了try...except
异常处理,出现异常时,会自动关闭文件,再抛出异常。
单例锁
class Singleton(object):
instance=None
lock = threading.Lock()
def __new__(cls, *args, **kwargs):
if cls.instance:
return cls.instance
with cls.lock:
if not cls.instance:
cls.instance=super().__new__(cls)
return cls.instance
with原理
with语句实质上是上下文管理
- 上下文管理协议:包含2个方法:
__enter__
和__exit__
; - 支持该协议的对象,要实现这2个方法,才能被with语句进行操作。
上下文管理器
- 定义执行with语句时建立的运行时上下文,负责执行with语句上下文的进入和退出操作;
- 进入上下文管理器:调用管理器
__enter__
方法,如果设置了as var
语句,变量var接受__enter__
方法的返回值; - 退出上下文管理器:调用管理器的
__exit__
方法。