Python解析式和生成器表达式

列表解析

□ 应用情景:
	□ 生成一个列表,元素0~9,对每一个元素自增1后,求平方,返回一个新的列表

以往的常规解决方案:

lst= list(range(10))
newList = []
for i in lst:
	newList.append((i + 1) ** 2)
print(newList)

列表解析方式:

lst = [(x+1) ** 2 for x in range(10)]
print(lst)

看!wonderful啊!代码精简到了1行,实现相同的效果
在这里插入图片描述

列表解析式语法

□ [返回值 for 元素 in 可迭代对象 if条件]
□ 使用[]中括号,内部是for循环,if条件可选
□ 返回的是一个新的列表
□ 列表解析式是一种语法糖,编译器会优化,不会因为简写而影响效率,反而因优化提高了效率
# 举例,求10以内的偶数,比较执行效率.
import datetime
start = datetime.datetime.now()
even = []
for x in range(10):
	if x % 2 == 0:
		even.append(x)
print(even)
delta = (datetime.datetime.now() - start).total_seconds()
print(delta)

常规方式结果如下:
在这里插入图片描述
列表解析方式:

# 举例,求10以内的偶数,比较执行效率.
import datetime

start = datetime.datetime.now()
even  = [x for x in range(10) if x % 2 == 0]
print(even)
delta = (datetime.datetime.now() - start).total_seconds()
print(delta)

可以看到,相同的结果,时间没没有太大差异
在这里插入图片描述

列表解析式进阶

进阶多层if条件①

[expr for item in iterable if cond1 if cond2]
# 等价于
ret = []
for item in itertable:
	if cond1:
		if cond2:
			ret.append(expr)

举例:20以内既能被2整除,又能被3整除的数

[i for i in range(20) if i % 2 == 0 and if i % 3 == 0 ]
# or
[i for i in range(20) if i % 2 == 0 if i % 3 == 0 ]

进阶多层for循环②

[expr for i in iterable1 for j in iterable2]
# 等价于
ret = []
for i in iterable1 :
	for j in iterable2 :
			ret.append(expr)

举例:
[(x, y) for x in ‘abc’ for y in range(3)]
[[x, y] for x in ‘abc’ for y in range(3)]
[{x, y} for x in ‘abc’ for y in range(3)]
在这里插入图片描述

生成器表达式

生成器表达式语法

□ (返回值 for 元素 in 可迭代对象 if条件)
□ 列表解析式的中括号[]换成小括号()就ok了
□ 返回的是一个生成器
□ 列表解析式是一种语法糖,编译器会优化,不会因为简写而影响效率,反而因优化提高了效率
□ 和列表解析式的区别:
	□ 生成器表达式是按需计算(或称惰性求值,延迟计算)
	□ 而列表解析式是立即返回所有结果
□ 生成器
	□ 可迭代对象
	□ 迭代器

举例:

it = (x for x in range(10) if x % 2)
print(next(it))

使用next(iterable)方法可以取出生成器中的元素,每次返回一个值,当生成器中所有元素都被next取出后,生成器结束,无法再次使用next
在这里插入图片描述

集合解析式

集合解析式语法

□ {返回值 for 元素 in 可迭代对象 if条件}
□ 列表解析式的中括号[]换成小括号{}就ok了
□ 返回的是一个新的集合

举例:

it = {x for x in range(10) if x % 2}
print(it)

在这里插入图片描述

字典解析式

字典解析式语法

□ {返回值 for 元素 in 可迭代对象 if条件}
□ 列表解析式的中括号[]换成小括号{}就ok了
□ 返回值使用key:value形式
□ 返回的是一个新的字典

在这里插入图片描述

发布了62 篇原创文章 · 获赞 3 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Leonardy/article/details/103362749