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. ...
随机推荐
- Binary String Copying
Smiling & Weeping ----第一次见你的时候, 在我的心里已经炸成了烟花, 需要用一生来打扫灰炉. 题目链接:Problem - C - Codeforces 题目大意不难,就 ...
- 如何理解SpringBoot的Starter
Starter是SpringBoot的四大核心功能特性之一,除此之外,SpringBoot还有自动装配,Actuator监控等特性 SpringBoot里面的这些特性,都是为了让开发者在开发基于Spr ...
- 使用HTML一键打包EXE工具打包KRPANO全景项目
HTML一键打包EXE工具(HTML封装EXE, HTML转EXE)能把任意HTML项目(网址)一键打包为单个EXE文件,可以脱离浏览器和服务器,直接双击即可运行. 打包工具群:429338543 最 ...
- RK3568开发笔记(十一):开发版buildroot固件移植一个ffmpeg播放rtsp的播放器Demo
前言 目标开发任务还有个功能,就是播放rtsp摄像头,当然为了更好的坐这个个,我们必须支持rtsp播放失败之后重新尝试,比如5s重新尝试打开一次,从而保障联网后重新打开,然后达成这个功能. D ...
- 解锁Java面试中的锁:深入了解不同类型的锁和它们的用途
简介 多线程编程在现代软件开发中扮演着至关重要的角色.它使我们能够有效地利用多核处理器和提高应用程序的性能.然而,多线程编程也伴随着一系列挑战,其中最重要的之一就是处理共享资源的线程安全性.在这个领域 ...
- 2020 ICPC 南京站
gym A. Ah, It's Yesterday Once More 有趣的题,但场上的人恐怕不会这么想( 构造一条长路径,且拐弯处在不同边界.这样每条竖线合并后都在一边,还需要走一遍才能合并到一起 ...
- umich cv-2-2
UMICH CV Linear Classifiers 在上一篇博文中,我们讨论了利用损失函数来判断一个权重矩阵的好坏,在这节中我们将讨论如何去找到最优的权重矩阵 想象我们要下到一个峡谷的底部,我们自 ...
- HTML DOM之二:事件
对事件作出反应 当事件发生时,可以执行 JavaScript,比如当用户点击一个 HTML 元素时. 如需在用户点击某个元素时执行代码,请把 JavaScript 代码添加到 HTML 事件属性中: ...
- [Python急救站课程]五角星的绘制
五角星的绘制 from turtle import * # 从turtle库中导入所有函数 fillcolor("red") # 表示填充红色 begin_fill() # 表示开 ...
- Redis 哨兵模式的原理及其搭建
1.Redis哨兵 Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复. 1.1.哨兵原理 1.1.1.集群结构和作用 哨兵的结构如图: 哨兵的作用如下: 监控:Sentinel ...