Python花式编程案例集锦(5)

问题描述:

输入三个序列,例如:[0.9,0.5,0.7],[0.4,0.6,0.3],[0.5,0.2,0.4],输出三个序列中各取一个相乘后最大的值,以及组合方式,如最大值为0.9*0.6*0.5,0,1,0组合,第一个序列第一个,第二个序列第二个,第三个序列第一个。

参考代码及优化思路:

首先让我们导入标准库random,并编写用来获取随机列表的函数,以便后面进行测试:

from random import randrange

# 获取测试数据 def getData(m, n): return [[randrange(1,50) for i in range(m)] for j in range(n)]

然后先按照传统套路编写代码如下:

# 传统套路 def demo1(x, y, z): product = -float('inf') positions = () for i, v1 in enumerate(x): for j, v2 in enumerate(y): for k, v3 in enumerate(z): t = v1*v2*v3 if t > product: product = t positions = (i, j, k) return (product, positions)

仔细看上面的代码,虽然是Python的语法,但是整个代码散发着浓浓的C语言气息,换汤不换药啊。

仔细分析题意,大概可以知道,因为是乘法运算,所以从每个列表中选择最大数再相乘,应该也是符合题意的,于是编写代码如下:

# 利用Python内置函数和列表对象方法 def demo2(x, y, z): i = max(x) iPos = x.index(i) j = max(y) jPos = y.index(j) k = max(z) kPos = z.index(k) return (i*j*k, (iPos, jPos, kPos))

但是,上面的代码看上去还是很笨啊,傻傻的样子,并且和第一段代码一样不灵活,难道就没有更好的办法吗?

# 利用Python函数式编程特点 def demo3(lst): maxValues = tuple(map(max, lst)) f = lambda lst, item: lst.index(item) positions = tuple(map(f, lst, maxValues)) product = eval('*'.join(map(str, maxValues))) return (product, positions)

上面的代码减少了很多限制,比如可以处理3个以上的列表,对客户的需求改动不敏感。

那么,上面的几段代码是否等价呢,让我们用测试代码来说话,直接测试一亿次吧。注意第三个函数的调用方式与前两个略有区别。

# 测试代码,运行一亿次 for i in range(10**8): m = randrange(1, 30) n = 3 x, y, z = getData(m, n) if not (demo1(x,y,z) == demo2(x,y,z) == demo3((x,y,z))): print(x,y,z)

把上面的代码整合到一起运行一下,没有任何输出,说明三个函数功能等价。

原文发布于微信公众号 - Python小屋(Python_xiaowu)

原文发表时间:2017-09-18

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PHP实战技术

PHP面试常考易错题之变量作用域解析

PHP面试中变量作用域是面试中常常出现的问题,也是必考的问题,下面就给大姐讲解一下在面试中注意的点:

1214
来自专栏WebDeveloper

跟我学习php字符串常用函数-下篇

1> mixed parse_url ( string $url [, int $component = -1 ] )

832
来自专栏Java技术栈

Redis 常用操作命令,非常详细!

nx:如果key不存在则建立,xx:如果key存在则修改其值,也可以直接使用setnx/setex命令。

1332
来自专栏阮一峰的网络日志

尾调用优化

尾调用(Tail Call)是函数式编程的一个重要概念,本文介绍它的含义和用法。 ? 一、什么是尾调用? 尾调用的概念非常简单,一句话就能说清楚,就是指某个函数...

3255
来自专栏企鹅号快讯

10分钟就能学会写代码 你不信 看完这篇文章就能当Python工程师

Python是一种动态解释型的编程语言。Python可以在Windows、UNIX、MAC等多种操作系统上使用,也可以在Java、.NET开发平台上使用。 ? ...

2040
来自专栏腾讯NEXT学位

前端简洁并实用的工具类

30513
来自专栏Python私房菜

你所不知道的Python | 字符串连接的秘密

字符串连接,就是将2个或以上的字符串合并成一个,看上去连接字符串是一个非常基础的小问题,但是在Python中,我们可以用多种方式实现字符串的连接,稍有不慎就有可...

1375
来自专栏黑泽君的专栏

try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

982
来自专栏IMWeb前端团队

bash 的变量和参数

对一个编程脚本来说,最最基础的当然是变量。 对大多数开发者来说,变量也是最不值得的大说特说的。 但 bash 里的变量有一些特别的地方值得说说,谨防跌坑。 基本...

1760
来自专栏重庆的技术分享区

关于eslint使用规则,和各种报错对应规则

4615

扫码关注云+社区