Python学习Day2(下)----列表解析表达式&Lamda表达式

部分内容引用自:https://www.jianshu.com/p/1bc403c9eda6

一.列表解析表达式

        列表解析,可以简单高效的处理一个可迭代的对象,并生成结果列表。表达形式如下:
[ expr for 元素1 in 序列1 ... for 元素n in 序列n ]
[ expr for 元素1 in 序列1 ... for 元素n in 序列n if 条件]
        expr指定了每次迭代的内容,如果指定了条件则只有满足条件的元素参与迭代,列表表达式不仅简洁,而且运行速度也比普通的循环快。
举个例子,给定二维列表:
                d = [[1, 2], [3, 4, 5], [6, 7, 8, 9]]
把它转换成一维的:
                d = [1, 2, 3, 4, 5, 6, 7, 8, 9]
一般的想法就是嵌套循环两次,用一个一维数组来接收

def fun1(d = []):
    a = []
    for i in range(len(d)):
        for j in range(len(d[i])):
            a.append(d[i][j])
    return a

        而用列表表达式一句代码就行

def fun2(d = []):
    a = [d[i][j] for i in range(len(d)) for j in range(len(d[i]))]
    return a

        虽然列表表达式乍一看是比较简洁,其实忽略缩进和换行,两种方法并没有多大区别,都用了两次循环,究竟谁更好?导入time模块测试一下

import time
d = [[1, 2], [3, 4, 5], [6, 7, 8, 9]]
step1 = time.clock()
print(fun1(d))
step2 = time.clock()
print(fun2(d))
step3 = time.clock()
print('普通循环的运行时间为:{}\n列表表达式运行时间为:{}'.format(step2 -step1, step3-step2))
#输出:
>>>>  [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>>  [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>>  普通循环的运行时间为:4.799999999999249e-05
>>>>  列表表达式运行时间为:2.755500000001243e-05

        可以看到列表表达式比普通的循环快了将近一倍,至于为什么列表表达式会快一点呢,这个原因留给读者自己思考(其实我也不知道为什么....)。除了列表,字典等可排序集合中也可以使用表达式来快速批量生成数据。
        上面程序运行会报错,不用慌张,这是提示time.clock函数将会在Python3.8版本中删除。


更新提示

二.Lamda表达式

        Lamda表达式是一种简便的、在同一行中定义函数的方法,实际上生成的是一个函数对象(匿名函数),基本格式如下:
        lambda arg1,arg2,...,arg n:
        其中arg1、arg2...是函数的参数,是函数式,结果为函数的返回值,例如下面定义一个求和函数:

f = lambda x, y: x + y
print(f(1, 2))
#输出:
>>>>  3

        匿名函数广泛应用于需要函数作为参数的函数,例如序列内置的函数filter(),filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象

  • filter()
    调用格式:filter(function, iterable)
    function是筛选函数,iterable是可迭代的对象,下面举例说明,用filter()函数和Lamda表达式刷选列表中大于0的数
from random import randint
data = [randint(-10, 10) for _ in range(10)]
print(data)
new_data = filter(lambda x: x > 0, data)
print(sorted(new_data))
#输出:
>>>>  [-10, -3, 1, -10, -6, -1, 8, 1, -7, 2]
>>>>  [1, 1, 2, 8]

你可能感兴趣的:(Python学习Day2(下)----列表解析表达式&Lamda表达式)