python笔记 列表解析式补充和其他生成解析式

96 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

0 环境

  • 编辑器:idea或vscode
  • 系统版本:windows10
  • python版本:3.9.6

1 三元表达式

给偶数乘以2,给奇数乘以3。正常我们会写if 为偶数时:乘以2,为奇数时,乘以3。有么有和省事的写法呢,比如a % 2 === 0 ? 乘以2 : 乘以3。 答案是有的,a * 2 if a % 2 === 0 else a * 3。大意就是 x if 条件成立 else y,if条件成立,返回x,否则返回y。代码如下,不要和之前的if判断记混了,而且if和esle双分支都要存在,缺少else也会报错,并且添加elif也是会报错的:

result = [x * 2 if x % 2 == 0 else x * 3 for x in range(7)]
print(result)

image.png

2 生成器解析式

生成器解析式,它的优势或者说用它的目的是啥呢,一个是不占用太多的内存,二个是惰性求值呀。比如我range()不想一次性用完呢,需要一次用一次,怎么使用呢外面加个括号,这样就可以按需获取了。只要变一下列表解析式它的中括号,变成小括号就是生成器解析式。当我们不需要缓存的时候,用它还是很方便的,若是需要缓存不要用它。

g = (x ** 2 for x in range(111111))
print(g)
print(next(g))
print(next(g))
print(next(g))
print(next(g))

image.png

3 集合解析式

集合解析的方式和列表的类似,它的格式是:{val for val in range(数值)},注意除了外面的大括号,其他操作都是一样的,不要一眼以为是字典哦,之前的文章有写过,比如定义个{1,2,3},它是set集合。

4 字典解析式

我想把它解析成字典怎么弄,还是用大括号,没错和集合类似,唯一的区别是在for前面变成key:value的方式其他都一样。

a = {x: x for x in range(11)}
print(a)

image.png

5 总结

我们掌握了内置数据结构它的定义和初始化的值,不难发现它们推导的规则。它是在原来的规则上简化了,什么时候用解析式呢,它的存在,简化了我们重复的操作,但不要为了简化而简化,当你感觉用它写起来不直观,麻烦,还不如原来的方式简单,或者说增加了你的阅读效率,那么请选择用原来的方式。集合和字典两种的方式很类似,区别在for前面是key:value还是单独一个value值,而三元表达式,是在for前面展示双分支,一定是if..else,不能多增也不能减少,都会报错。