heidern0612 发表于 2018-11-23 18:15:35

[python表达式之列表推导式]

本帖最后由 heidern0612 于 2018-11-23 18:20 编辑

以下文字部分摘自网络,只为个人学习所用,不做任何商业用途,讲的比较浅,有错误希望鱼油给予指正。


每次看大牛的代码很奇怪,比如T=[(x,y) for x in range(5) if x%2==0 for y in range(5) if y %2==1]

这是什么鬼,一个变量T为什么搞得这么拥挤,看着也累啊,后来查了一下才知道这个叫推导式。

推导式是可以从一个数据序列构建另一个新的数据序列的结构体。


【列表推导式】

列表推导能非常简洁的构造一个新列表,只用一条简洁的表达式即可对得到的元素进行转换变形。

其基本格式如下:

代码如下:[exprfor value in collectionifcondition]

过滤条件可有可无,取决于实际应用,只留下表达式;

相当于下面这段for循环:

result = []
for value in collection:                           #for循环
if condition:                                        #if条件
result.append(expression)                        #最后append的值在推导式里第一个出现。


借助列表推导式,我们可以使用 for 循环用一步创建一个列表。



列表推导式中的条件语句:

可以向列表推导式添加条件语句:squares =

如果你要添加 else,则需要将条件语句移到列表推导式的开头,直接放在表达式后面, 如下:

squares =

注意:列表推导式并没有在其他语言中出现,但是在 python 中很常见。



列表推导式总共有两种形式:



此处if主要起条件判断作用,data数据中只有满足if条件的才会被留下,最后统一生成为一个数据列表。




此处if...else主要起赋值作用,当data中的数据满足if条件时将其做exp1处理,否则按照exp2处理,最后统一生成为一个数据列表。


例:

numLists= []
def test():
    for i in xrange(147):
      numList = []
      for j in xrange(147):
            if i == j:
                numList.append(1)
            else:
                numList.append(0)
      numLists.append(numList)
test()


在这个例子中,总共的行数是11行, 那么如果用列表推导式应该怎么写呢?

[[1 if i == j else 0 for i in range(147)] for j in range(147)]   (两部分)


列表推导式生成的结果跟 test 函数生成的结果是一模一样的,但是行数却要少得多。

同时在进行性能测试时发现, 列表推导式的运行时间只有 test 函数的一半,因此无论是为了减少代码行数还是提高性能, 都应该使用列表推导式

当然了, 列表推导式不是只有这样的应用, 它还可以用来生成一个元素符合你想要的列表, 好处在于除了不用特地写个函数或者写个for循环之外, 还在于它的简单而又实用,是优秀的程序员必备的技能之一。

不自律的笨鸟 发表于 2021-5-15 04:15:55

看来还有很多东西要学习啊!
页: [1]
查看完整版本: [python表达式之列表推导式]