Python列表内涵如何进行相关的编写。其实在使用的时候有不少的问题需要存在,下面我们就来看看相关的使用情况。具体就用如何编写列表内涵的一个著名例子是生成九九乘法表来向大家介绍。#t#
Python列表内涵(List Comprehensions,也译作“列表推导式”)是Python***有力的语法之一,常用于从集合对象中有选择地获取并计算元素,虽然多数情况下可以使用for、if等语句组合完成同样的任务,但列表内涵书写的代码更简洁(当然有时可能会不易读)。
列表内涵的一般形式如下,我们可以把[]内的列表内涵写为一行,也可以写为多行(一般来说多行更易读)。
[表达式 for item1 in 序列1 ... for itemN in 序列N if 条件表达式]
上面的表达式分为三部分,最左边是生成每个元素的表达式,然后是for 迭代过程,最右边可以设定一个if 判断作为过滤条件。
列表内涵的一个著名例子是生成九九乘法表:
- s = [(x, y, x*y) for x in range(1, 10) for y in range(1,10) if x>=y]
列表内涵可能放在函数编程一章更合适,因为它可以统一实现map和filter等高阶函数(下一章介绍)。不过我还是倾向于将它看为一种组合的流程控制语句,而且我个人感觉它与C#中的LINQ有点神似(当然LINQ更强大,可以处理数据库和XML)。下面是两个例子,一个用LINQ实现,一个用Python的列表内涵实现。
- C#中用LINQ找出10以内的偶数
- var s = from x in Enumerable.Range(0, 10) where x % 2 == 0 select x;
- #Python中用列表内涵模拟以上LINQ语句
- s = [x for x in range(0, 10) if x % 2 == 0]
当然上边的例子很简单,实际上我们可以用列表内涵完成更复杂的程序设计任务,而且效率一般会比使用for、if等的组合语句高(因为中间省略了一些列表的生成和赋值过程)。Python 2.5 之后,列表内涵进行了进一步的扩展,如果一个函数接受一个可迭代对象作为参数,那么可以给它传递一个不带中括号的列表内涵,这样就不需要一次生成整个列表,只要将可迭代对象传递给函数。
动态表达式
先布置一个思考题:在C#语言中,如果需要在文本框中输入1+2(或更复杂的数学表达式)后计算它的值,你会怎么做呢?
不怕大家笑,我在用C#解决这个问题的时候,是自己做了一个表达式解析器…………,虽然只能计算加减乘除的简单组合,但也着实费了我好大力气。后来才开始使用各种各样的第三方Parse组件,msscript等。现在我们有了Python,要完成这个任务可以说是非常简单,简单到你不敢相信:只要用内置的eval()函数,就可以计算并返回任意有效表达式的值。例如:
- str = '1+2'2 print eval(str)
你还可以试验更复杂的表达式,是不是很Powerful的一项功能?
除了eval函数之外,Python还提供了exec语句将字符串str当成有效Python代码来执行,看下面的例子:
- #exec.py
- exec 'a=100'3 print a
另外还有execfile函数,它用来执行一个外部的py文件。上一个例子存为exec.py后,运行下边的代码就知道是怎么回事了:
- execfile(r'c:\exec.py')
***提醒,默认的eval(),exec,execfile()所运行的代码都位于当前的名字空间中,eval(), exec,和execfile()函数也可以接受一个或两个可选字典参数作为代码执行的全局名字空间和局部名字空间,具体可以参考Python的手册,我就不啰嗦了。