小牛叔讲Python第10章:化繁为简的推导式

上一篇:小牛叔讲Python第9章:函数是你走过的套路

下一篇:小牛叔讲Python第11章:函数的高级用法以及匿名函数

目录

前言

1、推导式的形式

2、生成器 - ()

3、推导式与交互使用

4、推导式的嵌套

紧跟小牛步的脚步,学习Python有趣不掉队。


前言

《西部世界》中德洛丽丝进入了MAZE迷宫,假设她需要列出一系列的平方数作为密码,来进入迷宫。其它编程语言生成类似的数列,必须使用循环语句,并且通过编写多行语句来完成。我们利用Python的推导式,只需要1句就足够了,下面介绍本篇的主角。

本篇的主角是推导式comprehensions(又称解析式),是Python的杀器之一。推导式是可以从某组数据序列构建另一个组的数据序列的方式。 Python的每一种集合形式的数据结构,都对应有推导式,总共有3种形式:

  • 列表(list)推导式
  • 字典(dict)推导式
  • 集合(set)推导式

1、推导式的形式

下面推导式生成0至9当中偶数的平方数,即:[0,4,16,36,64],其中红色的部分是每一个推导式必须不变的。

① 与结尾是成对的中括号[]表式 这是一个生成列表的推导式,我们可以使用{}来表示 字典和集合。当然如果是字典,②的部分就必须要有冒号:。

② 集合中元素的表达式。当前表达式表示生成的列表中的元素是变量的平方数,这部分的变量名称必须在④部分出现。

③⑤ 红色部分,for…in…表示循环,这是推导式必须的。

定义变量,表示⑥集合中的每一个元素。

现成的集合变量(或是可枚举的对象)或是现有的集合元素的值。

筛选条件:可以省略不写,如上式条件为x%2==0,即意味着只有当x满足偶数的情况下才会加入②部分的表达式运算并把结果加入集合 ,如果x不满足这个条件那么就跳过。我们在终端命令行中,输入上述表达式,看看:

>>> [   x**2  for    x    in   range(10)   if x%2==0]
[0, 4, 16, 36, 64]
>>> 

2、生成器 - ()

我们把最外的括号换成圆括号,就可以形成生成器generator,生成器不会立即计算结果,只在需要的时候生成结果,有利于优化运算节省内存。

如下的代码可以计算半径1-10的圆面积,每一个元素包括一个关键字为关径,值为面积的字典类型,如果使用生成器我们就要使用另一个for...in语句来调用它。

#生成器示例
gen = ({x:x**2* 3.14159} for x in range(1,10))
print(gen) #看看是不是有结果
for g in gen:
    print(g)

运行的结果如下所示:

<generator object <genexpr> at 0x10e0c4200>
{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()) for x in range(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([ x for x in range(2,M) if M%x ==0])

我们试试看输入100的结果是什么?列出了所有100的因子。

[2, 4, 5, 10, 20, 25, 50]

(2)下面我们再把M扩展到2-100的循环,分析上一步的结果,其实是整个质数的判断条件,如果M是质数那么这个列表一定是空的。所以下面我们把上面的式子放在外循环的条件中就行了。

print([M for M in range(2,100) if not [ x for x in range(2,M) if M%x ==0] ])

运行之后的结果如下图:

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

推导式还有很多神奇的应用,就不一一列举了。

紧跟小牛步的脚步,学习Python有趣不掉队。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小牛叔208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值