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.txtf变量接收文件对象返回的对象;
  • 读取文本中的内容,逐行打印;
  • 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__方法。
posted @ 2020-03-25 19:16  Franciszw  阅读(277)  评论(0编辑  收藏  举报