马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 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为什么搞得这么拥挤,看着也累啊,后来查了一下才知道这个叫推导式。
推导式是可以从一个数据序列构建另一个新的数据序列的结构体。
【列表推导式】
列表推导能非常简洁的构造一个新列表,只用一条简洁的表达式即可对得到的元素进行转换变形。
其基本格式如下:
代码如下:[expr for value in collection if condition]
过滤条件可有可无,取决于实际应用,只留下表达式;
相当于下面这段for循环:result = []
for value in collection: #for循环
if condition: #if条件
result.append(expression) #最后append的值在推导式里第一个出现。
借助列表推导式,我们可以使用 for 循环用一步创建一个列表。
列表推导式中的条件语句:
可以向列表推导式添加条件语句:squares = [x**2 for x in range(9) if x % 2 == 0]
如果你要添加 else,则需要将条件语句移到列表推导式的开头,直接放在表达式后面, 如下:
squares = [x**2 if x % 2 == 0 else x + 3 for x in range(9)]
注意:列表推导式并没有在其他语言中出现,但是在 python 中很常见。
列表推导式总共有两种形式:
①[x for x in data if condition]
此处if主要起条件判断作用,data数据中只有满足if条件的才会被留下,最后统一生成为一个数据列表。
②[exp1 if condition else exp2 for x in data]
此处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循环之外, 还在于它的简单而又实用,是优秀的程序员必备的技能之一。
|