零基础学编程020:强大的列表推导

问题描述:找出50之内的所有勾股数。

所谓勾股数,就是三个正整数,满足x*x + y*y = z*z。例如:3,4,5或5,12,13。

电脑解题只会用笨办法,一个一个地试,x、y、z都从1递增到49,三重循环搞定。

for x in range(1, 50) : for y in range(1, 50) : for z in range(1, 50) : if x*x + y*y == z*z : print(x, y, z)

输出的结果中有许多重复答案,比如:3 4 5 和 4 3 5 实际上算一种答案。可以加个要求:x<y<z,代码稍微修改即可。

for x in range(1, 50) : for y in range(x, 50) : for z in range(y, 50) : if x*x + y*y == z*z : print(x, y, z)

可能大家感觉这个题目太初级,但这里想提的是Python中强大的列表推导list comprehension)。

比如:输出1到9的平方数,在Python中用一行语句:

[x*x for x in range(1, 9)]

输出:[1, 4, 9, 16, 25, 36, 49, 64]

有了这个武器,前面的问题可以用一行语句搞定:

[(x,y,z) for x in range(1,50) for y in range(x,50) for z in range(y,50) if x*x + y*y == z*z]

输出结果:[(3, 4, 5), (5, 12, 13), (6, 8, 10), (7, 24, 25), (8, 15, 17), (9, 12, 15), (9, 40, 41), (10, 24, 26), (12, 16, 20), (12, 35, 37), (15, 20, 25), (15, 36, 39), (16, 30, 34), (18, 24, 30), (20, 21, 29), (21, 28, 35), (24, 32, 40), (27, 36, 45)]

小结:

Python语言中的列表List借鉴了许多现代语言的优点,可以用比较简短的语句写出一些强大的表达式。为了得到一个数组array或列表list,直接用列表推导就可以方便地搞定。

知乎上有个贴子:一行Python能实现什么丧心病狂的功能?点击文章左下角的“阅读原文",直达该链接。

--- END ---

原文发布于微信公众号 - 申龙斌的程序人生(slbGTD)

原文发表时间:2017-02-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小红豆的数据分析

小蛇学python(19)装饰器

python的装饰器是python的特色高级功能之一,言简意赅得说,其作用是在不改变其原有函数和类的定义的基础上,给他们增添新的功能。

882
来自专栏灯塔大数据

干货 | 数据科学入门必读:如何使用正则表达式?

有时候,这些数据中会包含大量文本语料。比如,假如我们需要搞清楚「xxx文件 」中谁给谁发送过邮件,那么我们就要筛查 1150 万份文档!我们可以采用人工方式,亲...

1112
来自专栏java一日一条

Java高级特性之枚举学习总结

在Java SE5之前,我们要使用枚举类型时,通常会使用static final 定义一组int常量来标识,代码如下

832
来自专栏机器学习实践二三事

Numpy使用4

上篇博客写到了numpy的索引与切片,这篇博客介绍numpy的一些数学统计上的使用和如何结合numpy实现对结构化文本的处理 通用函数 所谓的通用函数(ufun...

1945
来自专栏微信公众号:Java团长

10个最受欢迎的Java类

每一个Java程序员都有一份属于自己的Java类排名表。这个排名表没有严格的规定,也没有可遵循的规则,它完全取决于你参与的Java项目的工作。下面这些类,不用我...

1072
来自专栏WOLFRAM

Mathematica使用中易犯的错误

3563
来自专栏Java成神之路

java_面试_01_一个月的面试总结(java)

       JVM内存管理机制和垃圾回收机制(基本每次面试都会问,一定要搞得透彻)

783
来自专栏Crossin的编程教室

浅谈 Python 2 中的编码问题

Python 2.x 里的编码实在是一件令人烦躁的事情。不断有初学者被此问题搞得晕头转向。我自己也在很长一段时间内深受其害,直到现在也仍会在开发中偶尔被坑。在本...

34714
来自专栏owent

C++ 新特性学习(一) -- 概述+智能指针(smart_ptr)

C++ 0x/11 终于通过了,真是个很爽的消息。于是乎我决定对新的东西系统学习一下。

631
来自专栏difcareer的技术笔记

Android智能指针

网上已经有很多分析智能指针的文章了,讲得不错的是:Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析。本文尽量从不分析代码的角度,将And...

664

扫码关注云+社区