婚庆类网站模板,做的比较好的猎头网站,logo设计在线生成免费免费设计logo生成器,wordpress 搜索 插件哈喽大家好#xff0c;今天给大家介绍两个Python中特性-列表推导式和生成器表达式 今天我想向你介绍python语言的两个非常有用的特性#xff1a;列表推导式和生成器表达式。这两个特性都可以让你用一行简洁的代码来创建一个序列#xff0c;而不需要写循环或者函数。但是它们… 哈喽大家好今天给大家介绍两个Python中特性-列表推导式和生成器表达式 今天我想向你介绍python语言的两个非常有用的特性列表推导式和生成器表达式。这两个特性都可以让你用一行简洁的代码来创建一个序列而不需要写循环或者函数。但是它们之间也有一些重要的区别我们一起来看看吧。 技术交流
技术要学会分享、交流不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。
本文文章由粉丝的分享、推荐资料干货、资料分享、数据、技术交流提升均可加交流群获取群友已超过2000人添加时最好的备注方式为来源兴趣方向方便找到志同道合的朋友。 方式①、添加微信号pythoner666备注来自CSDN 加群 方式②、微信搜索公众号Python学习与数据挖掘后台回复加群 列表推导式
列表推导式是一种用方括号包围的表达式它可以根据一个或多个迭代器来生成一个列表。例如如果你想要生成一个包含1到10的平方数的列表你可以这样写
squares [x**2 for x in range(1, 11)]
print(squares)
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]你也可以在列表推导式中加入条件判断来过滤掉一些不想要的元素。例如如果你只想要生成偶数的平方数你可以这样写
even_squares [x**2 for x in range(1, 11) if x % 2 0]
print(even_squares)
# [4, 16, 36, 64, 100]你还可以在列表推导式中使用多个迭代器来生成笛卡尔积。例如如果你想要生成两个列表中所有可能的组合你可以这样写
colors [red, green, blue]
shapes [circle, square, triangle]
combinations [(c, s) for c in colors for s in shapes]
print(combinations)
# [(red, circle), (red, square), (red, triangle), (green, circle), (green, square), (green, triangle), (blue, circle), (blue, square), (blue, triangle)]列表推导式的优点是它可以快速地创建一个列表并且语法简洁易读。但是它也有一个缺点就是它会一次性地把所有的元素都存储在内存中这可能会占用很多空间尤其是当生成的列表很大或者无限时。这时候我们就可以使用生成器表达式来解决这个问题。
生成器表达式是一种用圆括号包围的表达式它和列表推导式非常相似只是它不会立即生成一个列表而是返回一个生成器对象。生成器对象是一种特殊的迭代器它可以按需地产生下一个元素而不需要提前计算和存储所有的元素。例如如果你想要生成一个包含1到10的平方数的生成器对象你可以这样写
squares_gen (x**2 for x in range(1, 11))
print(squares_gen)
# generator object genexpr at 0x000001F7E8C6D740注意这里打印出来的不是一个列表而是一个生成器对象。如果你想要获取生成器对象中的元素你可以使用next()函数或者for循环来遍历它。例如
print(next(squares_gen))
# 1
print(next(squares_gen))
# 4
for square in squares_gen:print(square)
# 9
# 16
# ...注意每次调用next()函数或者遍历生成器对象时它都会动态地计算下一个元素并且记住当前的状态。
生成器表达式
生成器表达式的语法和列表推导式基本一致只是用圆括号代替方括号。你也可以在生成器表达式中加入条件判断和多个迭代器就像列表推导式一样。例如
even_squares_gen (x**2 for x in range(1, 11) if x % 2 0)
combinations_gen ((c, s) for c in colors for s in shapes)生成器表达式的优点是它可以节省内存空间因为它不会一次性地创建一个列表而是按需地产生下一个元素。这样你就可以处理很大或者无限的序列而不需要担心内存溢出。例如如果你想要生成一个无限的斐波那契数列你可以这样写
def fib():a, b 0, 1while True:yield aa, b b, a bfib_gen (x for x in fib())注意这里我们使用了一个生成器函数来定义斐波那契数列然后用一个生成器表达式来包装它。生成器函数是一种使用yield语句来返回值的函数它也会返回一个生成器对象。生成器函数和生成器表达式都是生成器的两种不同的写法它们都可以用来创建惰性求值的序列。
生成器表达式的另一个优点是它可以提高性能因为它可以避免不必要的计算和中间变量。例如如果你想要计算一个序列中所有元素的和你可以这样写
total sum([x**2 for x in range(1, 11)])但是这样会先创建一个列表然后再对列表中的元素求和这样会浪费时间和空间。如果你使用生成器表达式你可以这样写
total sum(x**2 for x in range(1, 11))这样就不会创建一个列表而是直接把每个元素的平方数传给sum()函数这样会更快更省空间。事实上很多内置的函数都可以接受一个生成器作为参数例如min(), max(), all(), any()等等。你也可以把一个生成器传给list()函数或者set()函数来转换成一个列表或者集合。
总结 我可以用一个餐厅的例子来比喻列表推导式和生成器表达式。假设你是一个餐厅的老板你想要给你的客人提供一份菜单让他们选择自己喜欢的菜品。你有两种方式来制作菜单 一种是使用列表推导式也就是提前把所有的菜品都做好然后放在一个大盘子里让客人自由挑选。这样的好处是客人可以看到所有的菜品也可以多次取用而且速度很快。但是这样的坏处是你需要占用很多的厨房空间和食材而且有些菜品可能会变凉或者变质造成浪费。 另一种是使用生成器表达式也就是根据客人的需求现场做出一个菜品然后送到客人的桌子上。这样的好处是你不需要占用很多的厨房空间和食材而且每个菜品都是新鲜的不会浪费。但是这样的坏处是客人不能看到所有的菜品也不能多次取用而且速度可能会慢一些。
所以你应该根据不同的情况来选择合适的方式来制作菜单。如果你有很多的客人而且他们都喜欢吃不同的菜品那么你可能更适合使用列表推导式。如果你只有少数的客人而且他们都喜欢吃新鲜的菜品那么你可能更适合使用生成器表达式。
总之列表推导式和生成器表达式都是非常有用的特性它们可以让你用一行简洁的代码来创建一个序列。列表推导式适合于需要多次遍历或者操作的序列而生成器表达式适合于只需要遍历一次或者处理很大或者无限的序列。你应该根据不同的场景来选择合适的方式来提高你的代码效率和可读性。