推导式python函数的简单介绍

什么是Python中的生成器推导式

Python中有一种紧凑的语法,可以通过一个循环和条件构建一个列表,这种语法叫做列表推导式(list comprehension): my_list = [ f(x) for x in sequence if cond(x) ] 类似地,我们可以通过字典推导式

创新互联建站专注为客户提供全方位的互联网综合服务,包含不限于成都做网站、网站建设、矿区网络推广、小程序开发、矿区网络营销、矿区企业策划、矿区品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联建站为所有大学生创业者提供矿区建站搭建服务,24小时服务热线:18982081108,官方网址:www.cdcxhl.com

Python中有一种紧凑的语法,可以通过一个循环和条件构建一个列表,这种语法叫做列表推导式(list comprehension):

my_list = [ f(x) for x in sequence if cond(x) ]

类似地,我们可以通过字典推导式(dictionary comprehension)创建字典,通过集合推导式(set comprehension)创建集合:

my_dict = { k(x): v(x) for x in sequence if cond(x) }

my_set = { f(x) for x in sequence if cond(x) }

(这一语法支持更加复杂的操作,但这里仅作示例)

最后,你还可以使用类似的语法创建一个生成器:

my_generator = ( f(x) for x in sequence if cond(x) )

不过,这并不叫做生成器推导式,而是叫做生成器表达式(generator expression)。为什么不叫前者呢?如果前三个语法都被称为“推导式”,为什么生成器这个不叫呢?

PEP 289 —— 生成器表达式 的最后给出了详细的备注,其中指出Raymond Hettinger起初提议使用“生成器推导式(generator comprehension)”一词,后来Peter Norvig提出了“累计显示(accumulation displays)”,后来Tim Peters推荐了“生成器表达式”这个

名词。但是它并没有名词出现了这样的变化。

EarlGrey:上面提到的这几位都是大牛啊!具体大家可以谷歌一下。

所以我在Twitter上提出了这个问题:

python 有个我不懂的问题:为什么它们被称为“生成器表达式”,而不是“生成器推导式”?

Guido的回答指出了核心原因:

推导式一开始属于“字面量显示(literal display)”这一概念。而生成器表达式不是一种显示(display)。

Matt Boehm后来找到了Tim Peters提出“生成器表达式”一词的邮件,其中讲述了一些细节:

读完邮件后,我对这个问题的理解更深了。首先,为什么会使用“推导式”(comprehension)一词?Tim在邮件中指出,这个词来源于集合论中的推导公理(Axiom of Comprehension),它指的是通过对另一个集合的元素应用某个谓词(predicate,即条

件)而组成新的集合。这和向另一个序列中的元素应用某个条件从而生成列表的做法非常类似。

EarlGrey:我之前看到很多翻译为“解析”,看到这里才觉得“推导式”才是更准确的说法。

正如Guido所指出的,Python的设计者当时更注重的是显示,而不是条件。“显示”一词在这里意味着代码的语法看上和它将创建的数据结构很像。列表显示(列表推导式)看上去像一个列表。对于集合和字典显示来说,也是一样的道理。但是由于没有生成器

字面量语法,因此根本就没有一个生成器显示可以进行对比,也就不存在生成器显示了。

在设计该功能的那封邮件中,“推导式”一次是“显示”的同义词,由于生成器没有显示,所以也不可能有推导式。

不过Time在他的邮件中也说到,推导式的奇妙之处在于条件。推导公理的核心则是谓语。也许是因为Python推导式中的条件是可选的,关注的焦点被转移到了显示方面。

但是我认为,我们应该叫它们“生成器推导式”。我们在描述这类语法时,并没有使用“显示”一词。我们没有理由将“推导式”与“显示”和字面量语法联系在一起。

列表推导式、字典推导式、集合推导式和生成器表达式,这四个表达式各自之间有着许多相似之处。如果将四者之间的类似点总结为“推导式”,将极大地简化相关概念。它们之间的相似点远大于不同之处,我建议大家对这四个表达式使用同样的概念

《Python进阶》笔记6-推导式Comprehension

推导式(又称解析式)是Python的一种独有特性,是可以从一个数据序列构建另一个新的数据序列的结构体。

共有三种推导,在Python2和3中都支持:

列表推导式(又称列表解析式)提供了一种简明扼要的方法来创建列表。

它的结构是在一个中括号里包含一个表达式,然后是一个for语句,然后是0个或多个for或者if语句。这个表达式可以是任意的,你可以在列表中放入任意类型的对象。返回结果将是一个新的列表,在这个以if和for语句为上下文的表达式运行完成之后产生。

标准规范:

这里是另外一个简明例子:

这将对快速生成列表非常有用。有些人甚至更喜欢使用它而不是filter函数。

列表推导式在有些情况下超赞,特别是当你需要使用for循环来生成一个新列表。举个例子,你通常会这样做:

你可以使用列表推导式来简化它,就像这样:

字典推导和列表推导的使用方法是类似的。

在上面的例子中我们把同一个字母但不同大小写的值合并起来了。就我个人来说没有大量使用字典推导式。

你还可以快速对换一个字典的键和值:

它跟列表推导式也是类似的,唯一的区别在于它使用大括号{ }。

举个例子:

Python 列表推导式怎么理解的呢?

5.1.3. 列表推导式

列表推导式为从序列中创建列表提供了一个简单的方法。普通的应用程式通过将一些操作应用于序列的每个成员并通过返回的元素创建列表,或者通过满足特定条件的元素创建子序列。

例如, 假设我们创建一个 squares 列表, 可以像下面方式:

squares = []

for x in range(10):

... squares.append(x**2)

...

squares

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

注意这个 for 循环中的被创建(或被重写)的名为 x 的变量在循环完毕后依然存在。使用如下方法,我们可以计算squares的值而不会产生任何的副作用:

squares = list(map(lambda x: x**2, range(10)))

或者,等价于:

squares = [x**2 for x in range(10)]

上面这个方法更加简明且易读.

列表推导式由包含一个表达式的括号组成,表达式后面跟随一个 for 子句,之后可以有零或多个 for 或 if 子句。结果是一个列表,由表达式依据其后面的 for 和 if 子句上下文计算而来的结果构成。

Python推导式问题

#列表推导不宜有过多的操作,对for循环里面的操作打包成函数,再推导

a = (0,0,0,0)

def assign(x,i,j):

x = list(x)

x[i] = j

return(tuple(x))

[assign(a,i,j) for i in range(4) for j in range(1,4)]

PYTHON中的列表推导式,字典推导式,集合推导式

功能:是提供一种方便的列表创建方法,所以,列表解析式返回的是一个列表

格式:用中括号括起来,中间用for语句,后面跟if语句用作判读,满足条件的传到for语句前面用作构建先的列表

这个跟列表推导式的用法差不多,只不过中括号改成大括号,毕竟字典本身用的就是大括号。

功能:集合推导式跟列表推导式差不多,都是对一个列表的元素全部执行相同的操作,蛋集合推导式是一种无重复无序的序列

区别:跟列表推导式的区别在于:1.不适应中括号,使用大括号;2.j结果中无重复;3.结果是一个set()集合,集合里面是一个序列


网页标题:推导式python函数的简单介绍
链接分享:http://cdiso.cn/article/hdjdcj.html

其他资讯