不属于python特点的是 运行效率高_一道真实 Python 面试题,看看你是否有效率意识...

很多人都见过这么一个数列 0,1,1,2,3,5,8,13 …… 其中的规律也很好理解,相信数学好的人可能一下就看出了其中的规律。不就是除了前两项以外,其他的数字都等于前两个数字之和么。没错,就是这样。这个数列的名字大家应该也不陌生,就是传说中的斐波那契数列。

至于斐波那契数列为什么这么出名,是因为其在现代物理、化学等领域都有直接的应用,另外在生活中比如松果、凤梨、树叶的排列、某些花朵的花瓣数等都能找到对应关系,但这不是今天的终点,有兴趣的可以自行谷歌一下。

之所以写斐波那契数列是因为我之前一个读者在面试时某互联网公司数据分析岗时被面试官考到了这道题,这就引起了我的重视。毕竟面试官出的题一般不会太 Low,在我仔细研究后发现这道题并不像想象中的那么简单。

因为这个数列看似简单,实则有多种写法,并不是让你简简单单用 Python 写出来就结束了,而是考察了你各个方面的能力,是一道很好的考察一个人工程能力的试题。下面我们就进入正题。

递归法

这是一种很常见的写法,也是很多初学 Python 的人在考虑这道题时常用的办法。那什么叫递归呢?其实在构建一个函数时,可以再函数内部调用其他函数,当然也可以调用函数本身,如果一个函数在内部调用了自身本身,这个函数就是递归函数。下面来看一下代码你就会明白很多。

def Fibo_seq(n):

if n in (0, 1):

return n

return Fibo_seq(n - 1) + Fibo_seq(n - 2)

for i in range(20):

print(Fibo_seq(i))

可以看出上面代码中我们定义了 Fibo_seq 这个函数,但是在这个定义的 return 中又重复使用了两次 Fibo_seq 函数,这就会造成大量的重复计算,所以效率非常低,虽然能在数字较小的时候能够计算出结果,但当数值一大,其运算速度将巨慢无比(有兴趣的可以将 range 函数中的数字换成 100 尝试运行一下),所以说这种求解方式并不可取。

递推法

递推法也是比较符合人类思维模式的一种方式,其逻辑为先将起始的两个数字添加到列表中,然后将列表中最后两个数字相加,得到下一个数字,然后将得到的数字在存储到列表中,以此类推。

def Fibo_seq(n):

result_list = []

a, b = 0, 1

for i in range(n):

result_list.append(a)

a, b = b, a + b

return result_list

print(Fibo_seq(20))

这种写法的好处在于,是将前两个数字不断相加,来产生第三个数字,相当于 a, b 两个变量交替向前进行,而不像上一种方法中每计算下一位数时需要重新计算一遍前两位数。因此在效率上就高了很多。

生成器yield关键字

另外在 Python 中还可以使用生成器的方法来写,也就是在函数中使用 yield 关键字。

def fib(max):

n, a, b = 0, 0, 1

while n < max:

yield a

a, b = b, a + b

n = n + 1

print(list(fib(20)))

对于 yield 的含义,想要如果想要彻底的弄明白,最好是系统的了解一下生成器及迭代器的原理。这里就简单说一下使用生成器含义和好处。

首先使用生成器返回的相当是一个算法,当需要的时候根据算法来一个个推演出具体的数字,yield 关键字相当于 return,用来返回 a 的值。。而上面的递推法中的函数时直接计算完然后生成一个列表,所以在 print()函数中你可以看到,使用生成器后,你需要将结果转换为列表来输出。

另外使用生成器后代码的复杂度降低,更加符合人的思维逻辑,可读性较高。另外生成器是 Python 一个独特的特性,这在其他语言里是没有的,所以掌握了生成器也就意味着你对 Python 的了解程度更高。

矩阵法

这是更加高端的方法,其原理是使用线性代数中的矩阵根据斐波那契数列的规则推导出最终简化的公式,所以想要用这种写法就必须对「线性代数」很熟悉。由于牵扯到的概念就更多了,这里就不展开来谈了,所以感兴趣的朋友可以去下面这个链接看一下。

通过这道面试题可以看出,考官在考察面试者能力时往往比表面上的要全面,尤其是在大厂更是如此,因为越是大厂数据量越大,对代码的运行效率要求也就越高,这就要求面试者至少需要有考虑运行效率的意识。

另外在我自己的工作中我也慢慢的感受到了代码效率对于海量数据时的重要性。由于在做一些奖励性数据提取的需求时往往会让两个人同时写一个需求的代码,最后两个人比对最终数据,这样能降低数据的出错率。而这时你会发现,高手和菜鸟写出来的代码长度能差上百行,运行效率能差几个小时之久,可见差距之大。

这篇文章算是我写的第一篇技术类文章了,因为要写技术类文章,至少自己得了解的非常透彻后才写的出来,所以花了不少时间去查阅各种资料,导致拖了这么久才发。

所以也希望大家能点个「赞」,你的赞就是我写文的动力。

文末是我这次参考的关于生成器和矩阵法一些资料,有兴趣的可以了解一下。

关注公众号「转行做DT」,回复关键字「简历」即可获得我当年转行成功时的简历。回复关键字「面试题」「面试题SQL」「面试题SAS」即可获得我为你准备的独家真实面试题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值