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. ...
随机推荐
- 为不断增长的Go生态系统扩展gopls
原文在这里. 由 Robert Findley and Alan Donovan 发布于 2023年9月8日 今年夏天初,Go团队发布了gopls的v0.12版本,这是Go语言的语言服务器,它进行了核 ...
- KRPANO太阳光插件
KRPano太阳光插件可以在全景项目中添加太阳光特效,如下图所示: 同时,该插件支持可视化编辑 使用说明 1.下载插件,把插件放入skin文件夹里面 2.在tour.xml文件中,添加下面的插件引用 ...
- .NET 8 的 green thread 异步模型被搁置了
.NET 平台上的green thread 异步模型实验结果最近出来了,具体参见:https://github.com/dotnet/runtimelab/issues/2398 ,实验结果总结一下就 ...
- android 尺寸适配相关
Android上常见度量单位 px(像素):屏幕上的点,绝对长度,与硬件相关. in(英寸):长度单位. mm(毫米):长度单位. pt(磅):1/72英寸,point. dp(与密度无关的像素):一 ...
- 安装了less后仍然报错:Error: Cannot find module 'less'
结果是命令有点问题,正常来说是用下面的: npm i less –save-dev-g 然后可以正常启动了: --------------------------------------------- ...
- 通过.NET Core CLI 来创建并运行ASP.NET CORE应用程序
说明: .NET Core 命令行接口 (CLI) 工具是用于开发.生成.运行和发布 .NET Core 应用程序的跨平台工具链. .NET Core CLI 包含在 .NET Core SDK 中. ...
- 【Qt6】列表模型——几个便捷的列表类型
前面一些文章,老周简单介绍了在Qt 中使用列表模型的方法.很明显,使用 Item Model 在许多时候还是挺麻烦的--要先建模型,再放数据,最后才构建视图.为了简化这些骚操作,Qt 提供了几个便捷类 ...
- BFF层提升业务性能实际解决方案,以及nodeJs和KOA框架介绍
本文干货满满,介绍了用BFF层(Back-end For Front-end)中间层提升性能的整体解决方案和思路,涉及前期技术调研,聚合业务分析,聚合方法,验收,最后向同学们普及node.koa基础知 ...
- Jail 【Python沙箱逃逸问题合集】
借助NSS平台题目,以2022年HNCTF为例展开分析 背景: 由于目前很多赛事有时候会出现一些pyjail的题目,因此在这里总结一下以便以后遇见可以轻松应对. 注:由于Python3中的unicod ...
- SQL改写案例2
postgresql 并没有像 oracle .dm 有这么丰富的 hint,在不改 sql 的情况下能干预执行计划. 如果想学好 postgresql.kingbase.MySQL 的sql 调优 ...