本文主要介绍了Python列表推导式使用的注意事项有哪些,希望大家阅读完这篇文章后有一定收获和自己的见解。下面让小编带着大家一起了解一下。
我们要知道,Python 列表推导式并不是给初学者用的,因为它非常反直觉。
使用建议和注意事项如下:
(一)不要忘了定义构造函数
有的开发者觉得列表推导式非常酷炫,觉得是Python独有的功能,所以有些开发者为了急于炫耀自己的Python水平,即使有更好替代方案也要使用它。
>>> # 使用 range 创建列表对象 >>> numbers = [x for x in range(5)] >>> print(numbers) [0, 1, 2, 3, 4] >>> # 以一个字符串为基础,创建一个小写字母的字符列表 >>> letters = [x.lower() for x in 'Smith'] >>> print(letters) ['s', 'm', 'i', 't', 'h']
上述例子中,我们使用了 range 和 string,这两种数据结构都是可迭代的,list()构造函数可以直接使用 iterable 创建一个 list 对象。下面的代码提供了更合理的解决方案。
>>> # 使用 range 创建列表对象 >>> numbers = list(range(5)) >>> print(numbers) [0, 1, 2, 3, 4] >>> # 以一个字符串为基础,创建一个小写字母的字符列表 >>> letters = list('Smith'.lower()) >>> print(letters) ['s', 'm', 'i', 't', 'h']
(二)不要忘了生成器表达式
在 Python 中,生成器是一种特殊的可迭代对象,它会延迟加载元素,直到被请求才会加载。这在处理大量数据时会非常高效,它能提升存储效率。相比之下,list 对象为了方便计数和索引,一次性创建所有的元素。所以跟生成器相比,在元素个数相同时,list 需要占用更多内存。
那么我们可以定义一个生成器函数来创建生成器。我们也可以使用下面的语句来创建生成器,这是一种称为生成器表达式的方法。
(expression for item in iterable)
你可能会注意到,除了使用圆括号外,它的语法跟使用 list 的语句很相似。所以需要注意区分。
考虑下面这个例子。我们要计算前一百万个数字的平方和。如果使用 list 来实现,方法如下。
>>> # 创建列表对象 squares >>> squares = [x*x for x in range(10_000_000)] >>> # 计算它们的总和 >>> sum(squares) 333333283333335000000 >>> squares.__sizeof__() 81528032
如上所示,list 对象占据 81528032 字节。我们考虑使用 generator 进行相同的操作,代码如下。
>>> # 创建 generator 对象,保存每个数的平方数 >>> squares_gen = (x*x for x in range(10_000_000)) >>> # 计算它们的总和 >>> sum(squares_gen) 333333283333335000000 >>> squares_gen.__sizeof__() 96
使用generator与list 相比,前者的内存开销小得多,只有 96 字节。原因很简单,它不需要获取所有的元素。相反,它只需要获取各个元素在序列中的位置,创建下一个元素并呈现它,而且不必保存在内存中。
以上就是小编给大家分享的Python列表推导式使用的注意事项所有知识点了,希望大家阅读后对自己的编写能力有所提升。