这篇文章主要介绍了python使用列表推导式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
使用列表推导式
一个列表推导式包含以下几个部分:
一个输入序列
一个表示输入序列成员的变量
一个可选的断言表达式
一个将输入序列中满足断言表达式的成员变换成输出列表成员的输出表达式
num = [1, 4, -5, 10, -7, 2, 3, -1] filtered_and_squared = []for number in num: if number > 0: filtered_and_squared.append(number ** 2) print filtered_and_squared# [1, 16, 100, 4, 9]
而如果使用filter、lambda和map函数,则能够将代码大大简化:
num = [1, 4, -5, 10, -7, 2, 3, -1] filtered_and_squared = map(lambda x: x ** 2, filter(lambda x: x > 0, num))print filtered_and_squared # [1, 16, 100, 4, 9] ## 更简化的一种写法 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 # [1, 16, 100, 4, 9]
列表推导也可能会有一些负面效应,那就是整个列表必须一次性加载于内存之中,这对上面举的例子而言不是问题,甚至扩大若干倍之后也都不是问题。但是总会达到极限,内存总会被用完。
针对上面的问题,生成器(Generator)能够很好的解决。生成器表达式不会一次将整个列表加载到内存之中,而是生成一个生成器对象(Generator objector),所以一次只加载一个列表元素。
生成器表达式同列表推导式有着几乎相同的语法结构,区别在于生成器表达式是被圆括号包围,而不是方括号:
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
这比列表推导效率稍微提高一些,让我们再一次改造一下代码:
num = [1, 4, -5, 10, -7, 2, 3, -1]def square_generator(optional_parameter): return (x ** 2 for x in num if x > optional_parameter)print square_generator(0)# <generator object <genexpr> at 0x004E6418># Option Ifor k in square_generator(0): print k# 1, 16, 100, 4, 9# Option IIg = list(square_generator(0))print g# [1, 16, 100, 4, 9]
除非特殊的原因,应该经常在代码中使用生成器表达式。但除非是面对非常大的列表,否则是不会看出明显区别的。 再来看一个通过两阶列表推导式遍历目录的例子:
import os def tree(top): for path, names, fnames in os.walk(top): for fname in fnames: yield os.path.join(path, fname)for name in tree('C:\Users\XXX\Downloads\Test'): print name
感谢你能够认真阅读完这篇文章,希望小编分享的“python使用列表推导式的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。