列表推导式python菜鸟教程,Python列表推导式,并解释它的作用_1

  列表推导式python菜鸟教程,Python列表推导式,并解释它的作用

  Python教程栏目今天翻译介绍列表推导式使用的注意事项。

  

Python 列表推导式使用注意事项

Python列表推导不适合初学者,因为它非常反直觉,即使对于其他编程语言背景的人也是如此。

  当我们接触到List的使用时,学习的内容是分散的。所以我们缺乏一个关于如何在各种场景下使用List的知识体系。

  本文提供了一些使用List的指南,尽可能地涵盖了所有方面。希望这篇文章能成为你的一站式实用手册。

  00-1010

使用建议

使用List最基本的方法是基于iterable对象创建List对象,iterable对象可以是任何可以迭代元素的Python对象。用法如下。

  iterable中item的表达式]复制代码以下代码显示了一个使用与列表相关的技术创建List对象的示例。在这个例子中,我们定义了一个整数列表,基于这个对象,我们创建了一个保存每个数字的平方数和立方数的列表对象。

  #创建整数列表=[1,2,3,4,5,6] #创建正方形和立方体列表幂=[(x * x,pow (x,3)) for x in integers] print (powers)

  [(1,1),(4,8),(9,27),(16,64),(25,125),(36,216)]复制代码上面的例子使用List对象作为迭代器。要知道很多类型的对象都是可以迭代的,比如List、Set、Dictionary、String等等。其他数据类型,如pandas包中的范围、地图、过滤器、系列和数据框,是迭代的。下面的代码演示如何使用一些对象。

  #使用range对象integer _ range=range(5)[x * x for x in integer _ range]

  [0,1,4,9,16] #使用系列对象import pandas as PD _ Series=PD . Series(range(5))print(PD _ Series)0 01 12 23 34 4d type 3360 int 64[x * x for x in PD _ Series]

  [0,1,4,9,16]复制代码

1.建议使用迭代的方式

。假设您需要收集满足特定条件的元素并创建一个列表。相关语法如下所示。

  【iterable if条件中item的表达式】复制代码if语句用于实现条件判断。下面的代码显示了这种用法的一个简单示例。

  #同时创建一个整数列表integers=[1,2,3,4,5,6] #过滤出偶数并创建这些偶数的平方数列表squares _ of _ events=[x * x for x in integers if x % 2==0]print((squares _ of _ events))

  [4,16,36]if-else形式的条件判断也可用于复制代码

2.如果只需用到其中的某些元素,应当使用条件判断语句

列表对象。语法如下。

  iterable中项目的if条件表达式else表达式1]复制代码。这有点类似于前面的用法。不要混淆这两种用法。在这个例子中,条件语句本身是一个整体。下面的

  代码提供了一个例子。

  

>>> # 创建一个 Integer 列表>>> integers = [1, 2, 3, 4, 5, 6]>>> # 遍历 integers 中的元素,如果是偶数,取平方数存入新的列表>>> # 如果是奇数,取立方数存入新的列表>>> custom_powers = [x*x if x % 2 == 0 else pow(x, 3) for x in integers]>>> print(custom_powers)

  [1, 4, 27, 16, 125, 36]复制代码

4.如果有嵌套结构,可以使用嵌套的循环

有可能可迭代对象中的元素自身也是可迭代的,尽管这种情况不太常见。如果你对嵌套的可迭代对象有兴趣,可以使用 for 来实现循环嵌套。语法如下。

  

[expression for item_outer in iterable for item_inner in item_outer]

  # 与下面的代码等同

  for item_outer in iterable:

   for item_inner in item_outer:

   expression复制代码

上面的代码展示了使用for实现嵌套循环的例子。

  

>>> # 创建一个包含元组的列表>>> prices = [('$5.99', '$4.99'), ('$3.5', '$4.5')]>>> # 获取元组中的每个价格,以此创建一个一维列表>>> prices_formatted = [float(x[1:]) for price_group in prices for x in price_group]>>> print(prices_formatted)

  [5.99, 4.99, 3.5, 4.5]复制代码

5.替换高阶函数

有的人比较习惯函数式编程,比如使用高阶函数也是这种习惯的表现之一。特别说明一下,高阶函数是那些需要使用输入或输出参数的函数。在 Python 中,常用的高阶函数有 map()filter()

  

>>> # 创建一个 integer 类型的列表>>> integers = [1, 2, 3, 4, 5]>>> # 使用 map 创建平方数列表>>> squares_mapped = list(map(lambda x: x*x, integers))>>> squares_mapped

  [1, 4, 9, 16, 25]>>> # 使用列表推导式创建平方数列表>>> squares_listcomp = [x*x for x in integers]>>> squares_listcomp

  [1, 4, 9, 16, 25]>>> # 使用 filter 取得 integers 中的偶数列表>>> filtered_filter = list(filter(lambda x: x % 2 == 0, integers))>>> filtered_filter

  [2, 4]>>> # 使用列表推导式取得 integers 中的偶数列表>>> filterd_listcomp = [x for x in integers if x % 2 == 0]>>> filterd_listcomp

  [2, 4]复制代码

从上面的例子可以看出,使用 list 的某些特性比使用高阶函数更具有可读性,而且也能实现较复杂的嵌套结构。

  

使用禁忌

1.不要忘了定义构造函数

有人认为列表推导式很酷炫,是 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']复制代码

2.不要忘了生成器表达式

在 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复制代码
跟使用 list 相比,使用 generator 内存开销小得多,只有 96 字节。原因很简单———— generator 不需要获取所有的元素。相反,它只需要获取各个元素在序列中的位置,创建下一个元素并呈现它,而且不必保存在内存中。

  

结论

本文中,我们整理了 list 应用的一些关键要领。这些该做的和不该做的都非常清晰明了。我估计你会在合适的场景中用到它。下面是本文内容的小结。

  

  • 使用迭代的方式。 Python 中有许多类型的 iterable,你应当在掌握基础(list 和 tuple)的同时融会贯通。
  • 使用条件判断语句。 如果你对在 iterable 中筛选某些元素感兴趣,可以多多研究条件判断。
  • 使用条件判断表达式。 如果你需要有选择性地获取某些数据,可以使用条件判断表达式。
  • 使用嵌套的循环。 如果你要处理嵌套的 iterable,可以使用嵌套的循环结构。
  • 用 list 替代高阶函数 在很多情况下,可以用 list 替代高阶函数。
  • 不要忘记 list 的构造函数 定义 list 的构造函数,可以使用 iterable 创建一个 list 对象。如果你直接使用 iterable,推荐用这个方法。
  • 不要忘了生成器表达式 它的语法与 list 中的语法相似。在处理大量的对象时,这是一种节省内存开销的办法。list 和 generator 不同的是,为了日后的索引和访问, list 必须提前创建,如果元素个数很多,就会消耗很大的内存。
大量免费学习推荐,敬请访问python教程(视频)

  

以上就是Python 列表推导式使用注意事项的详细内容,更多请关注盛行IT软件开发工作室其它相关文章!

  

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: