【经验分享】Python技巧之推导式

·  阅读 23

简介

列表推导式(List Comprehensions)也是来自函数式编程语言,可以优雅的对一个序列进行数据筛选和处理得到一个结果列表。

比如,把一个列表中所有大于0的数平方后生产一个新的列表。

num = [-2, 3, 5, -4, 10, 7]
复制代码

按常规做法,我们会

num = [-2, 3, 5, -4, 10, 7]
result = []
for x in num:
if x > 0:
result.append(x**2)
print result
复制代码

然后,用列表推导式的话,只需要

print [x**2 for x in num if x > 0]
复制代码

组成

怎么解读这个式子呢? image.png 把这个式子分成三个部分:输出处理、for循环、if判断。其中if判断部分是可选的。 if 判断部分是用来筛选。

输出处理部分比较灵活,随便自己想怎么处理。

比如有个列表A = [‘1’, ‘2’, ‘3’],我们可以[int(x) for x in A],把列表所有元素转换成int类型。 上面是最基本的形式了。还有一些稍微复杂的形式,怎么解读呢?


方法

方法是,除开“输出处理”部分,其它都是按从左到右顺序来的。

1)多个for循环

[(x, y) for x in range(3) for y in range(5)]
复制代码

在这里,处理部分是(x, y),其它按从左到右。等价于

for x in range(3):
for y in range(5):
#处理部分
复制代码

2)嵌套列表推导式

[[0 for y in range(3)] for x in range(5)]
复制代码

在这里,处理部分是[0 for y in range(3)],其它按从左到右。等价于

for x in range(5):
#处理部分
复制代码

3)多个if判断

[(x, y) for x in range(3) if x>1 for y in range(5) if y>2]
复制代码

在这里,处理部分是(x, y),其它按从左到右。等价于

for x in range(3):
if x>1:
for y in range(5):
if y>2:
#处理部分
复制代码

拓展

1)其他推导式

除了列表推导式。还有生成器推导式、集合推导式(python2.7及以上)、字典推导式(python2.7及以上)。

[x for x in range(3)] #-> 列表推导式
(x for x in range(3)) #-> 生成器推导式
{x for x in range(3)} #-> 集合推导式
{x:None for x in range(3)} #-> 字典推导式
复制代码

比如

>>> d = {'a':1, 'b':2, 'c':3}
>>> d2 = {v:k for k,v in d.items()}#反向映射
>>> d2
{1: 'a', 2: 'b', 3: 'c'}
>>> d3 = {k:v.upper() for k,v in d2.items()}#把所有值都大写
>>> d3
{1: 'A', 2: 'B', 3: 'C'}
复制代码

2)Python3 base64编码与解码 在蓝鲸项目中,部分接口的报文是通过base64加密传输的,所以在进行接口自动化时,需要对所传的参数进行base64编码,对拿到的响应报文进行解码;

例如:作业平台的fast_execute_script(快速执行脚本)的script_content python3.x 中字符都为unicode编码,而b64encode函数的参数为byte类型,所以必须先转码。

import base64
# encode 编码
# decode 解码
s ='adsvsdega15s1dasda'
encodestr = base64.b64encode(s.encode('utf-8'))
print(encodestr)
# b'YWRzdnNkZWdhMTVzMWRhc2Rh'
print(str(encodestr, 'utf-8'))
# YWRzdnNkZWdhMTVzMWRhc2Rh

decodestr = base64.b64decode(encodestr)
print(decodestr)
# b'adsvsdega15s1dasda'
print(str(decodestr, 'utf-8'))
# adsvsdega15s1dasda
复制代码

蓝鲸智云

本文由腾讯蓝鲸智云编辑发布,腾讯蓝鲸智云(简称蓝鲸)软件体系是一套基于PaaS的技术解决方案,致力于打造行业领先的一站式自动化运维平台。目前已经推出社区版、企业版,欢迎体验。

分类:
前端
标签:
收藏成功!
已添加到「」, 点击更改