美文网首页
Python 推导式(Comprehensions)

Python 推导式(Comprehensions)

作者: 戒灵 | 来源:发表于2018-12-14 15:32 被阅读0次
    1,列表推导式
    num = [1, 2, -5, 10, -7, 5, 7, -1]
    filtered_and_squared = [ x**2 for x in num if x > 0]
    print (filtered_and_squared)
    

    迭代器(iterator)遍历输入序列num的每个成员x
    断言式判断每个成员是否大于零
    如果成员大于零,则被交给输出表达式,平方之后成为输出列表的成员。
    列表推导式被封装在一个列表中,所以很明显它能够立即生成一个新列表。这里只有一个type函数调用而没有隐式调用lambda函数,列表推导式正是使用了一个常规的迭代器、一个表达式和一个if表达式来控制可选的参数。

    另一方面,列表推导也可能会有一些负面效应,那就是整个列表必须一次性加载于内存之中,这对上面举的例子而言不是问题,甚至扩大若干倍之后也都不是问题。但是总会达到极限,内存总会被用完。

    针对上面的问题,生成器(Generator)能够很好的解决。生成器表达式不会一次将整个列表加载到内存之中,而是生成一个生成器对象(Generator objector),所以一次只加载一个列表元素。

    生成器表达式同列表推导式有着几乎相同的语法结构,区别在于生成器表达式是被圆括号包围,而不是方括号:

    2,生成器表达式
    num = [1, 4, -5, 10, -7, 2, 3, -1]
    filtered_and_squared = ( x**2 for x in num if x > 0 )
    print filtered_and_squared
     
    # <generator object <genexpr> at 0x00583E18>
     
    for item in filtered_and_squared:
        print item
     
    # 1, 16, 100 4,9
    

    这比列表推导效率稍微提高一些

    3,zip()函数一次处理两个或多个列表中的元素
    alist = ['a1', 'a2', 'a3']
    blist = ['1', '2', '3']
     
    for a, b in zip(alist, blist):
        print a, b
     
    # a1 1
    # a2 2
    # a3 3
    

    相关文章

      网友评论

          本文标题:Python 推导式(Comprehensions)

          本文链接:https://www.haomeiwen.com/subject/vvdghqtx.html