朋友们,如需转载请标明出处:https://blog.csdn.net/jiangjunshow
声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!由于这套python教程不是由我所写,所以不如我的AI技术教学风趣幽默,学起来比较枯燥;但它的知识点还是讲到位的了,也值得阅读!想要学习AI技术的同学可以点击跳转到我的教学网站。PS:看不懂本篇文章的同学请先看前面的文章,循序渐进每天学一点就不会觉得难了!
我们已经学习了map和filter这样的函数式编程工具,它们会将操作映射到序列和集合结果中。由于这是Python编程中的一种常见任务,所以Python最终创造了一种新的表达式——列表解析。简而言之,列表解析会把任意一个表达式而不是一个函数应用于一个迭代对象中的元素。
让我们举一个例子来帮助大家理解吧。Python的内置ord函数会返回一个单个字符的ASCII整数编码(chr内置函数是它的逆过程,它将一个ASCII整数编码转换为字符):
>>>ord('s')
115
现在,假设我们希望收集整个字符串中的所有字符的ASCII编码。我们可以使用一个简单的for循环,并将结果附加在列表中:
>>>res = []
>>>for x in 'spam':
... res.append(ord(x))
...
>>>res
[115,112,97,109]
然而,现在我们知道了map,我们能够使用一个单个的函数调用,而不必关心代码中列表的结构,从而实现起来更简单:
>>>res = list(map(ord,'spam')) # Apply function to sequence
>>>res
[115,112,97,109]
我们也能够通过列表解析表达式得到相同的结果——map把一个函数映射遍一个序列,列表解析把一个表达式映射遍一个序列:
>>>res = [ord(x) for x in 'spam'] # Apply expression to sequence
>>>res
[115,112,97,109]
列表解析在一个序列的值上应用一个任意表达式,将其结果收集到一个新的列表中并返回。从语法上来说,列表解析是由方括号封装起来的(为了提醒你它们构造了一个列表)。它的简单形式是在方括号中编写一个表达式,在后边跟随着的看起来就像一个for循环的头部一样的语句。
上一个例子的效果与手动进行for循环和map调用相比,没有什么不同。然而,列表解析更方便。
>>>[x ** 2 for x in range(10)]
[0,1,4,9,16,25,36,49,64,81]
上面收集了从0~9数字的平方。下面是等效的map代码:
>>>list(map((lambda x: x ** 2),range(10)))
[0,1,4,9,16,25,36,49,64,81]