python列表推导式和生成器表达式-

Python017

python列表推导式和生成器表达式-,第1张

列表推导式和生成器表达式以及字典推导式 通常被视为Python中函数式编程的一部分,列表推导允许您使用包含较少代码的for循环创建列表。

用[] 包围

用{} 包围

生成器表达式允许在没有yield关键字的情况下即时创建生成器。

语法和概念类似于列表推导的语法和概念:用()包围

题主你好,

你的问题出在不了解列表推导的语法.

先说一下你写的代码问题出在哪, 因为列表推导是一种语法糖, 语法糖这东西我的理解就是代码精简式的写法, 你可以简单的理解为正常的写法可能要10行, 用语法糖可能1行就搞定了. 优点是可以减少代码量, 缺点也显而易见,就是相对于常规写法一开始学起来理解要困难一些.

列表推导写法:  n = [ j if j*5==10 ]

把你的这个1行的列表推导转化为常规写法要3行:

转化后的代码不知题主有没有看出问题,

这三行代码单看都没有问题, 第一行是给n赋一个空列表第二行是判断变量j*5的结果是10第三行是结果第二行的条件成立,则将j追加到列表n中.

但问题也出来了, 第二行中, if的条件部分, 变量j的值是啥呀? 你前面都没有定义变量j,这里就直接用肯定是会出错的, 因为python中的变量是前面定义了之后, 后面才能使用.

举个小例子:

从上面图片可以看出, 在没有a赋值时,你直接用,会提示你a这个变量还没定义而你给a赋值3后, 再使用时,会直接输出a的值,3 就是这个道理.

-----

下面说下最常规的用法:

一般的列表推导都是for与if同时存在:

n = [j for j in range(10) if j*5==10]

照着上面讲的逻辑说, for语句中给变量j提供值, 然后if中把这个值代入条件表示式看是否成立,如果成立,则将j追加到列表n中.

我们把这个列表推导转换为常规写法:

上面代码就形成了一个完整的闭环了.

所以学习列表推导很关键的一点是题主能否在常规代码与列表推导之间进行转换, 如果可以的话,题主写完列表推导后可以将其转化为常规代码去看, 如果常规代码没问题, 则列表推导自然也就是对的.

-----

扩展阅读:

网页链接该链接中有一些简单的例子,里面既给出了列表推导的写法也给出了相对应的常规写法,题主可以研究一下这二者是怎么转换的, 不难.

=====

希望可以帮到题主, 欢迎追问.