第
Python趣味入门10:推倒繁琐化烦为简的推导式
《西部世界》的德洛丽丝进入了MAZE迷宫,假设她需要列出一系列的平方数作为密码,来进入迷宫。在以往的代码生成类似的数列需要使用循环语句,写多行语句。Python有了推导式,只需要1句就足够了,下面介绍本篇的主角。
本篇的主角是推导式comprehensions(又称解析式),是Python的大杀器之一。推导式是可以从某组数据序列构建另一个组的数据序列的方式。Python的每一种集合形式的数据结构,都对应有推导式,总共有3种形式:
列表(list)推导式
字典(dict)推导式
集合(set)推导式
1、推导式的形式
下面推导式可以形成0至9当中偶数的平方数,即:[0,4,16,36,64],其中红色的部分是每一个推导式必须不变的。
①与结尾是成对的中括号[]表式这是一个生成列表的推导式,我们可以使用{}来表示字典和集合。当然如果是字典,②的部分就必须要有冒号:。
②集合中元素的表达式。当前表达式表示生成的列表中的元素是变量的平方数,这部分的变量名称必须在④部分出现。
③⑤红色部分,forin表示循环,这是推导式必须的。③是定义的变量名称,表示in后④的每一个元素。
④定义变量,表示⑥集合中的每一个元素。
⑥现成的集合变量,或是现有的集合元素。
⑦筛选条件:可以省略不写,如上式条件为x%2==0,即意味着只有当x满足偶数的情况下才会加入②部分的表达式运算并把结果加入集合,如果x不满足这个条件那么就跳过。我们在终端命令行中,输入上述表达式,看看:
[x**2forxinrange(10)ifx%2==0]
[0,4,16,36,64]
2、生成器()
我们把最外的括号换成圆括号,就可以形成生成器generator,生成器不会立即计算结果,只在需要的时候生成结果,有利于优化运算节省内存。
如下的代码可以计算半径1-10的圆面积,每一个元素包括一个关键字为关径,值为面积的字典类型,如果使用生成器我们就要使用另一个for...in语句来调用它。
1#生成器示例
2gen=({x:x**2*3.14159}forxinrange(1,10))
3print(gen)#看看是不是有结果
4forgingen:
5print(g)
运行的结果如下所示:
generatorobjectgenexprat0x10e0c4200
{1:3.14159}
{2:12.56636}
{3:28.27431}
{4:50.26544}
{5:78.53975}
{6:113.09724}
{7:153.93791}
{8:201.06176}
{9:254.46878999999998}
如上所示第一行显示不出任何结果,只是告诉您它是一个生成器对象。
3、推导式与交互使用
推导式本质上还是循环,它可以和任何语句搭配使用,在西部世界中,提洛公司Delos在每次游戏结束后都要录入5个清除记忆的host接待者的姓名,这个名单录入功能使用了推导式之后,会非常简单。
print([%d.%s%(x,input())forxinrange(1,6)])
这个语句运行只后,系统会等待您输入5个姓名,并且加上序号打印出来,运行的结果如下:
Dolores
Bernard
Maeve
Teddy
Grace
[1.Dolores,2.Bernard,3.Maeve,4.Teddy,5.Grace]
上面的Dolores,Bernard,Maeve,Teddy和Grace五个人的姓名是键盘输入进去的,最后一行是代码打印出来。
4、推导式的嵌套
既然说到神奇的推倒式,本篇继续再推倒一个嵌套难题。
听好了:如何1行语句列出2-100的质数?使用其它任何语言这是不可能的任务。
在解决这个问题之前,我们分2步走,先看看如何判断一个质数,即没有因子的数。
(1)我们先使用推导式把该数的因子列出来,假设这个数是M。如下的程序,就可以完成这个任务。
M=int(input())
print([xforxinrange(2,M)ifM%x==0])
我们试试看输入100的结果是什么?列出了所有100的因子。
[2,4,5,10,20,25,50]
(2)下面我们再把M扩展到2-100的循环,分析上一步的结果,其实是整个质数的判断条件,如果M是质数那么这