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

2022-06-28 11:26:29 浏览数 (2)

简介

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

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

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

按常规做法,我们会

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

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

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

组成

怎么解读这个式子呢?

image.pngimage.png

把这个式子分成三个部分:输出处理、for循环、if判断。其中if判断部分是可选的。

if 判断部分是用来筛选。

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

比如有个列表A = ‘1’, ‘2’, ‘3’,我们可以int(x) for x in A,把列表所有元素转换成int类型。

上面是最基本的形式了。还有一些稍微复杂的形式,怎么解读呢?


方法

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

1)多个for循环

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

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

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

2)嵌套列表推导式

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

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

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

3)多个if判断

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

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

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

拓展

1)其他推导式

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

代码语言:shell复制
[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)} #-> 字典推导式

比如

代码语言:shell复制
>>> 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类型,所以必须先转码。

代码语言:python代码运行次数:0复制
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的技术解决方案,致力于打造行业领先的一站式自动化运维平台。目前已经推出社区版、企业版,欢迎体验。

  • 官网:https://bk.tencent.com/
  • 下载链接:https://bk.tencent.com/download/
  • 社区:https://bk.tencent.com/s-mart/community/question

0 人点赞