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

资源魔 131 0

Python教程栏目明天翻译引见列表推导式应用的留意事项。

Python 列表推导式应用留意事项

Python 列表推导式并非给初学者用的,由于它十分反直觉,乃至关于有其余编程言语布景的人也是如斯。

咱们接触到 List 的应用时,学习的内容都是零星的。以是咱们短少一个对于若何正在各类百般的场景下应用 List 的常识体系。

本文提供了一些 List 的应用指南,尽可能涵盖方方面面。心愿本文能够成为你的一站式适用手册。

应用倡议

1.倡议应用迭代的形式

应用 List 最根本的形式是以一个可迭代工具为根底,创立一个 List 工具,这个可迭代工具能够是恣意能够迭代元素的Python工具。应用办法以下。

[expression for item in iterable]复制代码

上面这段代码展现了一个应用列表相干技巧创立 List 工具的例子。正在这个例子中,咱们界说了一个 Integer 列表,并基于这个工具创立了保留每一个数字的平方数以及立方数的 List 工具。

>>> # 创立一个 Integer 列表>>> integers = [1, 2, 3, 4, 5, 6]>>> # 创立平方数以及立方数列表>>> powers = [(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 等等。其余数据类型,像 range、map、filter,和 pandas 包中的 Series、DataFrame,都是可迭代的。上面的代码演示了某些工具的应用办法。

>>> # 应用 range 工具>>> integer_range = range(5)>>> [x*x for x in integer_range]
[0, 1, 4, 9, 16]>>> # 应用 Series 工具 >>> import pandas as pd>>> pd_series = pd.Series(range(5))>>> print(pd_series)0    01    12    23    34    4dtype: int64>>> [x*x for x in pd_series]
[0, 1, 4, 9, 16]复制代码

2.假如只要用到此中的某些元素,该当应用前提判别语句

假定你需求将合乎某种前提的元素归集起来,并创立一个 list。上面展现了相干的语法。

[expression for item in iterable if condition]复制代码

if 语句用来完成前提判别。上面的代码展现了这类用法的一个简略示例。

>>> # 一样创立一个 Integer 列表>>> integers = [1, 2, 3, 4, 5, 6]>>> # 挑选出偶数,创立一个这些偶数的平方数列表>>> squares_of_evens = [x*x for x in integers if x % 2 == 0]>>> print((squares_of_evens))
[4, 16, 36]复制代码

3.应用前提判别语句

List 工具中还能够应用 if-else 方式的前提判别,语法以下。

[expression0 if condition else expression1 for item in iterable]复制代码

这跟后面的那种用法有些相似,别把这两种用法混杂。正在本例中,前提语句自身是一个全体。上面的代码提供了一个例子。

>>> # 创立一个 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 列表推导式应用留意事项的具体内容,更多请存眷资源魔其它相干文章!

标签: Python python教程 python编程 python使用问题 列表推导

抱歉,评论功能暂时关闭!