zl程序教程

您现在的位置是:首页 >  后端

当前栏目

python中的列表解析和生成表达式

Python列表 解析 生成 表达式
2023-06-13 09:14:27 时间
列表解析

在需要改变列表而不是需要新建某列表时,可以使用列表解析。列表解析表达式为:

[exprforiter_variniterable][exprforiter_variniterableifcond_expr]
第一种语法:首先迭代iterable里所有内容,每一次迭代,都把iterable里相应内容放到iter_var中,再在表达式中应用该iter_var的内容,最后用表达式的计算值生成一个列表。
第二种语法:加入了判断语句,只有满足条件的内容才把iterable里相应内容放到iter_var中,再在表达式中应用该iter_var的内容,最后用表达式的计算值生成一个列表。

举例如下:
复制代码代码如下:

>>>L=[(x+1,y+1)forxinrange(3)foryinrange(5)]
>>>L
[(1,1),(1,2),(1,3),(1,4),(1,5),(2,1),(2,2),(2,3),(2,4),(2,5),(3,1),(3,2),(3,3),(3,4),(3,5)]
>>>N=[x+10forxinrange(10)ifx>5]
>>>N
[16,17,18,19]

生成器表达式

生成器表达式是在python2.4中引入的,当序列过长,而每次只需要获取一个元素时,应当考虑使用生成器表达式而不是列表解析。生成器表达式的语法和列表解析一样,只不过生成器表达式是被()括起来的,而不是[],如下:
复制代码代码如下:

(exprforiter_variniterable)
(exprforiter_variniterableifcond_expr)

例:
复制代码代码如下:
>>>L=(i+1foriinrange(10)ifi%2)
>>>L
<generatorobject<genexpr>at0xb749a52c>
>>>L1=[]
>>>foriinL:
...L1.append(i)
...
>>>L1
[2,4,6,8,10]

生成器表达式并不真正创建数字列表,而是返回一个生成器,这个生成器在每次计算出一个条目后,把这个条目“产生”(yield)出来。生成器表达式使用了“惰性计算”(lazyevaluation,也有翻译为“延迟求值”,我以为这种按需调用callbyneed的方式翻译为惰性更好一些),只有在检索时才被赋值(evaluated),所以在列表比较长的情况下使用内存上更有效。Ageneratorobjectinpythonissomethinglikealazylist.Theelementsareonlyevaluatedassoonasyouiterateoverthem.

一些说明:

1.当需要只是执行一个循环的时候尽量使用循环而不是列表解析,这样更符合python提倡的直观性。
复制代码代码如下:
foriteminsequence:
process(item)

2.当有内建的操作或者类型能够以更直接的方式实现的,不要使用列表解析。

例如复制一个列表时,使用:L1=list(L)即可,不必使用:
复制代码代码如下:
L1=[xforxinL]

3.如果需要对每个元素都调用并且返回结果时,应使用L1=map(f,L),而不是L1=[f(x)forxinL]