Python趣味入门10:推倒繁琐化烦为简的推导式
前言
《西部世界》的德洛丽丝进入了MAZE迷宫,假设她需要列出一系列的平方数作为密码,来进入迷宫。在以往的代码生成类似的数列需要使用循环语句,写多行语句。Python有了推导式,只需要1句就足够了,下面介绍本篇的主角。
本篇的主角是推导式comprehensions(又称解析式),是Python的大杀器之一。推导式是可以从某组数据序列构建另一个组的数据序列的方式。 Python的每一种集合形式的数据结构,都对应有推导式,总共有3种形式:
- 列表(list)推导式
- 字典(dict)推导式
- 集合(set)推导式
1、推导式的形式
下面推导式可以形成0至9当中偶数的平方数,即:[0,4,16,36,64],其中红色的部分是每一个推导式必须不变的。
① 与结尾是成对的中括号[]表式 这是一个生成列表的推导式,我们可以使用{}来表示 字典和集合。当然如果是字典,②的部分就必须要有冒号:。
② 集合中元素的表达式。当前表达式表示生成的列表中的元素是变量的平方数,这部分的变量名称必须在④部分出现。
③⑤ 红色部分,for…in…表示循环,这是推导式必须的。③是定义的变量名称,表示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语句来调用它。
1 #生成器示例
2 gen = ({x:x**2* 3.14159} for x in range(1,10))
3 print(gen) #看看是不是有结果
4 for g in gen:
5 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有趣不掉队。
Python趣味入门10:推倒繁琐化烦为简的推导式的更多相关文章
- Python趣味入门5:循环语句while
跟着小牛叔,找准正确编程入门姿势,每天只要阅读10分钟. 任何语言都有循环语句,在Python里循环更是变化无穷,有基本的循环,有循环else语句,引伸出来的还有迭代器.推导式,咱们先学习最简单的一种 ...
- Python趣味入门01:你真的了解Python么?
小牛叔倾情出品,史上更简单有趣的Python入门系列教程,用认真.上心的原创带你飞. 0.Why Python ? 什么入门用python,其实这和它的气质有关,根据CHM(计算机历史博物馆)网站介绍 ...
- Python趣味入门02: 妥妥地安装配置Python(Windows版)
< 上一篇:Python趣味入门01:你真的了解Python么? 本篇内容手把手教您如何去网上下载安装Python的运行环境,本文写于2020年Python稳定的版本是3.8,Windows流行 ...
- Python小世界:匿名函数、高阶函数、推导式
前言 木子本人搞起Python已有多年,一直觉得什么都会,但是有时候实操起来,才觉得很多底层基础的知识都没有彻底的灵活掌握. 另外,网上关于Python基础知识的各种普及已有太多太多. 附上相关大神的 ...
- python全栈开发day13-迭代器、生成器、列表推导式等
昨日内容:函数的有用信息.带参数的装饰器.多个装饰器修饰一个函数 迭代器 可迭代对象:内部含有__iter__方法 迭代器 定义:可迭代对象.__iter__()就是迭代器,含有__iter__且__ ...
- python scrapy 入门,10分钟完成一个爬虫
在TensorFlow热起来之前,很多人学习python的原因是因为想写爬虫.的确,有着丰富第三方库的python很适合干这种工作. Scrapy是一个易学易用的爬虫框架,尽管因为互联网多变的复杂性仍 ...
- python爬虫入门10分钟爬取一个网站
一.基础入门 1.1什么是爬虫 爬虫(spider,又网络爬虫),是指向网站/网络发起请求,获取资源后分析并提取有用数据的程序. 从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HT ...
- Python趣味入门3:变量、字串输入与输出
安装配置python环境完毕,非常有必要花十分钟对一些基本概念:变量.数学字符.输入.输出等4个概念进行理解,下面通过简单示例,深入了解python的基本语法. 本文的示例均在IDLE的命令行模式中完 ...
- Python趣味入门4:选择往往是最重要的-条件语句
人生处处有选择,程序也有选择,为了让程序变得更加强壮,程序员必须考虑任何情况,上一篇了解到了如何使用Python来行顺序语句的编写,我们写了一个可以输入姓名的生日祝贺程序,今天我们挑战条件语句! 1. ...
- python break/continue - python基础入门(10)
在昨天的文章:python while循环 文章结尾,我们留下了一个bug,当条件成立时,程序陷入了死循环,如何解决呢? 为了规避这个问题,今天介绍两个关键词:break和continue. ...
随机推荐
- nvm、node、vue安装、vue项目创建打包
nvm.node.vue安装.创建vue项目 nvm作用:可以管理多个版本的node,切换node版本,下载node. 前情提要 参 考:https://zhuanlan.zhihu.com/p/51 ...
- Redis系列24:Redis使用规范
Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...
- Go语言系列——31-自定义错误、32-panic和recover、33-函数是一等公民(头等函数)、34-反射、35-读取文件、36-写入文件
文章目录 31-自定义错误 使用 New 函数创建自定义错误 使用 Errorf 给错误添加更多信息 使用结构体类型和字段提供错误的更多信息 使用结构体类型的方法来提供错误的更多信息 32-panic ...
- 一行代码搞定 font-size 响应式
前言 公司要做大屏,但是大屏还要有个嵌在系统的版本,屏幕(iframe)小了但字体大了怎么办.网上找了很多代码都很长,个人参考了资料后实现了一个一行代码 font-size 响应式. TL;DR ht ...
- 解密Prompt系列17. LLM对齐方案再升级 WizardLM & BackTranslation & SELF-ALIGN
话接上文的指令微调的样本优化方案,上一章是通过多样性筛选和质量过滤,对样本量进行缩减,主打经济实惠.这一章是通过扩写,改写,以及回译等半监督样本挖掘方案对种子样本进行扩充,提高种子指令样本的多样性和复 ...
- 使用Github Copilot完成代码编写
上篇文章,我们使用VSCode创建了T.Global解决方案和两个类库工程,接下来我们使用Github Copilot完成代码编写 先说以下业务需求: 提供一个公共的本地化组件,支持对数字.货币.时间 ...
- Istio 入门(七):出入口网关 - 负载均衡和熔断等一系列功能
本教程已加入 Istio 系列:https://istio.whuanle.cn 目录 5,出入口网关 istio-ingressgateway 部署服务 配置 Gateway 子版本 istio-e ...
- NOI Linux 食用指北
写这篇 blog 的原因是某个小朋友要考 CSP 了还不会用 linux,怎么回事呢. 单击图片即可放大. 前置- linux 虚拟机的安装 在官网 / 其他地方下载 VMware. 在 noi 官网 ...
- 子组件emit 父组件方法,成功后回调执行子组件方法
场景: 父组件 update方法 子组件 确定按钮 getlist 刷新列表 子组件点击确定按钮,调用父组件新增接口,新增成功以后,子组件列表刷新 子组件: emit("confirmPa ...
- HTML5学习内容-3
(一)行高 line-height,一行文字的高度 例子 <!DOCTYPE html> <html lang="en"> <head> < ...