您的位置:威尼斯官方网站 > 威尼斯正规官网 > 威尼斯官方网站:列表推导式是数学中一种

威尼斯官方网站:列表推导式是数学中一种

发布时间:2019-10-10 20:11编辑:威尼斯正规官网浏览(199)

    威尼斯官方网站 1

    本种类小说译自Python之父 吉多 van 罗斯尔um 的文山会海博客“The History of Python”。那些博客体系对我们精通Python及其演化很有赞助,在这边翻译推荐给咱们,希望大家欢悦,也请我们多都赐教!

    列表推导式是在Python2.0中新扩充的性状,最早源于于GregEwing提交的patchs,Skip Montanaro和ThomasWouters也是有进献(假如笔者回想没有错的话,TimPeter也不行欣赏那些创新意识)。本质上说,列表推导式是数学中一种“集合”的Python版本。比方说:

    { x | x > 10 }

    意味着大于10的全体x的集。在数学中,这些表明式代表贰个全集(分化语境下,那些集能够有两样的意味,比方存有大于10的实数、全体大于10的平头等)。Python中并未二个全集的定义,而在Python2.0中,以致还并未有集合的定义(Python中的元组是另多个幽默的传说,会在以往的博文中为我们介绍)。

    除此以外也由于一些别的因素的虚拟,就有了Python中的以下表明式:

    [ f for x in S if P ]

    以此表明式会变卦三个列表,由连串 S 中符合 P 条件,并经 f 函数管理获得的值组成。当中条件 P 是可选的, for 循环能够嵌套,每三个 for 循环都有二个可选的 P 条件(实际上少之甚少用到,因为列表推导式平常用来将叁个多维对象转变到一维列表)。

    列表推导式为Python内置函数 map() 和 filter() 提供了代表方案。

    map 等价于

    [ f for x in S ]

    而 filter 等价于

    [ x for x in S if P ]

    稍加人唯恐会感到,map() 和 filter() 函数似乎更简洁,完全未有理由使用列表推导式啊!

    不过,在实质上中国人民解放军海军事工业程大学业作中其实不然。举个例子说,借使要为列表中的每一种成分加 1 并赶回贰个新的列表,接纳列表推导式写法是

    [ x 1 for x in S ]

    而选取 map() 函数的写法是

    map(lambda x: x 1, S)

    其中的 lambda x: x 1 是Python中的无名氏函数写法。

    稍微人或许会说,就以此例子来讲, map() 函数写法之所以比列表推导式复杂,重若是因为Python中的无名函数太琐碎,假如有多少个更简短的无名氏函数写法,大家就能够利用 map() 函数了。

    本人个人并不容许这种观念——作者感觉列表推导式比函数写法的可读性要好得多,特别是在管理函数变得更为参差不齐的情况下。别的,列表推导式的快慢也要比函数表明式快得多,因为调用 lambda 函数必要创立新的库房,而列表推导式没有要求。

    鉴于列表推导式的打响,以至生成器的引进(关于生成器,会在随后的稿子中作越来越多介绍),Python2.4 中新扩张了一种类似推导式的写法,用于表示三个管理结果类别,而不用预先生成整个列表,这么些新扩展的风味叫“生成器表明式”。举个例子说:

    sum(x**2 for x in range

    那行代码调用内置的 sum() 函数,使用的参数是一个生成器表达式,生成从 1 到 10 的平方。因而,这一个 sum() 函数的意味便是 1 到 10 的平方之和,结果是 385。

    在近似例子中,使用生成器表达式的补益很引人注目,倘使生成列表再求和,这些列表就能够在函数推行到位前直接占领内部存款和储蓄器空间,假设列表比较长,所攻克的内部存款和储蓄器是可怜惊人的。

    不得不说,列表推导式与生成器表达式之间的区分非常神秘,比如说,在Python第22中学,下面这么些推导式是树立的:

    [ x**2 for x in 1, 2, 3 ]

    但在生成器表明式中不树立:

    ( x**2 for x in 1, 2, 3 )

    在生成器表明式中必需这么写:

    ( x**2 for x in

    自然,在Python3中,列表推导式也亟要求加括号了:

    [ x**2 for x in ]

    但是,在“日常”只怕说“明显”的 for 循环中,你还能省略括号:

    for x in 1, 2, 3: print
    

    为何推导式和生成器表明式之间要有分别呢?为啥在 Python3 中列表推导式也利用更严谨的写法呢?那五个难题涉及到的因素包括向后极度、表明歧义、统一写法乃至语言产生等。

    在前期版本的 Python 中(未对外透露前 :-),唯有语义显明的 for 循环写法,在显要字 in 之后选用逗号是不曾歧义的,小编想为了方便,当然不写括号的好。那也让自身回想,在Algol-60言语中,你能够平素写:

    for i := 1, 2, 3 do Statement

    并且在那些语言中,你还足以用 step-until 语句替换循环对象,举例说:

    for i := 1 step 1 until 10, 12 step 2 until 50, 55 step 5 until 100 do Statement

    (事后追思,若是Python也能同一时候迭代四个体系该多好啊,但是……)

    当我们在 Python2.0 中扩充列表推导式的时候,列表推导式之后只或者有 ] ,也许重大字 for 或 if,不会有歧义,由此,不利用括号是没难点的。

    然则当我们在 Python2.4 中追加生成器表明式的时候,就超出了发挥歧义的难点:生成器表明式前后的括号有只怕不是生成器表明式的一有个别。例如说:

    sum(x**2 for x in range

    这行代码外层的括号是 sum() 函数的一有些,而生成器表达式只是那些函数的首先个参数。由此,有个别代码大概会有二种以上的语义,举个例子说:

    sum(x**2 for x in a, b)

    有望可见为:

    sum(x**2 for x in

    也或然掌握为:

    sum((x**2 for x in a), b)

    在纠缠了比较久未来(假设自己回忆没有错的话),大家决定,生成器表明式的 in 关键字之后必需带括号。但是当下大家并不想改换列表推导式的写法。

    在之后安排 Python3 的历程中,大家决定,列表推导式的写法:

    [ f for x in S if P ]

    相应与利用内置 list() 函数通过生成器表明式生成列表的写法完全一致:

    list for x in S if P

    故此,列表推导式也被供给利用与生成器表明式一样的更严酷的写法。

    别的,在Python3中,为了巩固列表推导式和生成器表明式写法之间的统一性,我们还做了有的改造。在Python第22中学,列表推导式会把内层变量“败露”到外围中,举个例子说:

    x = 'before'a = [x for x in 1, 2, 3]print x # 这里会打印 3 而不是 'before'
    

    那是前期版本的列表推导式所带来的震慑,长久以来,都属于Python的“靛青小秘密”之一。一齐始,这一个企划是为了加快列表推导式的演算速度所做的故意妥协。平时的话,菜鸟不会时时踩到那些坑,但不论如何,那么些标题依然时常令人抓狂。

    生成器表明式不会有其一主题素材,它继续自生成器,在独立的栈帧中试行命令。也因为那些缘故,生成器表达式(特别用在多少个短类别的时候)会比列表推导式成效更低。

    在Python3中,大家决定修复那些“青色小秘密”,让列表推导式和生成器表明式选取同样的接轨战略。因而,在Python3中,因为列表推导式中的 x 不遮掩外层 x,下面的代码会打字与印刷 before 并非 3 。

    也不用顾忌Python3中列表推导式的运维效能:由于在Python3的完好运转速度方面投入了大侠的不竭,不论列表推导式依然生成器表明式,在Python3中都比Python第22中学运转作用要高!(况兼它们在运转功能上也不再有哪些分别)

    更新:本来,小编忘了涉及,Python3还帮衬元组推导式和字典推导式,它们都以列表推导式这几个定义的直接扩张。

    接待关怀个体公众号:读书录

    威尼斯官方网站 2

    本文由威尼斯官方网站发布于威尼斯正规官网,转载请注明出处:威尼斯官方网站:列表推导式是数学中一种

    关键词: