python生成式

生成式(comprehensions), 也称推导式,是python中的一种高级玩法,编码风格更加简洁优美。

它可以使用简单的一行代码实现列表、字典等数据类型的创建或数据类型的转换等任务。

列表生成式

列表生成式,列表推导式(list comprehensions)

# 列表生成式即生成列表的生成式,写法简单而优雅,可以将多行代码用一行代码实现,且效率较高。
# 一般用于创建简单的新列表或对过滤出新列表。另外,还可以做数据类型间的转换。
# 用 [] 构造列表生成式

# 功能1
nums = [i for i in range(10) if i%2 == 0]		# nums= [0, 2, 4, 6, 8]
nums2 = [i for i in nums if i >5]				# num2= [6, 8]

# 功能2
nums = list(i for i in range(1, 5))				# nums = [1, 2, 3, 4]

# 数据类型转换
a = {"name":"jack", "age": 18}
a2 = [key for key in a]							# a2 = ['name', 'age']

字典生成式

# 字典生成式即生成字典的生成式。特殊场合下,可以写出很优美的代码。
# 也分为两种生成方式,一种默认的使用{},括号体内使用循环生成。另外配合内置方法的使用,效果很优美。
# 用 {} 构造字典生成式

# 方式1
{k:v for k,v in enumerate(range(1,5))}	# {0: 1, 1: 2, 2: 3, 3: 4}

# 方式2
li = [[1,2], (3,4)]
dict(x for x in li)			# {1: 2, 3: 4}

集合生成式

# 用{}构造集合生成式

# 方式1
b = {i for i in range(1,5)}			# {1,2,3,4}

# 方式2
a = set(i for i in range(1,5))		# {1,2,3,4}

元组生成式

# 元组生成式即生成元组的生成式,按理说应该使用()定义,括号内循环的方式生成元组生成式,
# 但是()被python中的生成器占用,就只剩下一种方式生成元组生成式。

# 方式1
tuple(x for x in range(1,5))		# (1, 2, 3, 4)

# 数据类型转换
nums = [3,4,5,6]
tuple(x for x in nums)				# (3, 4, 5, 6)

生成器生成式

使用()内循环的方式可以生成最简单的生成器,生成器替代列表的使用可以减小内存的消耗。生成器可以通过 next输出数据,但最后一个后会报错;一般使用for循环的方式使用生成器。其实,range(10)本质上就是一个最简单的生成器。

a = (i for i in range(1,5))		# <generator object <genexpr> at 0x0000027B1B5994C8>

print(next(a))		# 1
print(next(a))		# 2
print(next(a))		# 3
print(next(a))		# 4
print(next(a))		# 抛出异常StopIteration

# 可以使for循环的方式避免异常
print([i for i in a])	# [1,2,3,4]
posted @ 2020-03-07 23:50  the3times  阅读(875)  评论(0编辑  收藏  举报