本篇閱讀的代碼實現了計算列表中元素的最小公倍數的功能。
本篇閱讀的代碼片段來自於30-seconds-of-python(https://github.com/30-seconds/30-seconds-of-python)。
lcm
from functools import reduce
from math import gcd
def lcm(numbers):
return reduce((lambda x, y: int(x * y / gcd(x, y))), numbers)
# EXAMPLES
lcm([12, 7]) # 84
lcm([1, 3, 4, 5]) # 60
兩個數的最大公約數和最小公倍數滿足如下公式:
lcm(a, b) * gcd(a, b) = abs(a * b)
而對於兩個以上數據的列表時,只需要將任意兩個數的最小公倍數和剩下的其他數字繼續計算最小公倍數即可。也就是說:
lcm(a, b, c, ...) = lcm(lcm(a, b), c, ...)
因此我們使用functools.reduce
函數對列表進行迭代。
functools.reduce
functools.reduce(function, iterable[, initializer])
reduce
函數中的第一個參數是函數function
,它接受兩個參數。reduce
函數將function
累積的應用在第二個參數,iterable
,可迭代的對象上。function
使用可迭代對象的前兩個值作為輸入參數,並將返回值和可迭代對象的下一個值作為function
的輸入參數進行下一次迭代,直到用盡可迭代對象的所有值。例如以下的例子:
# ((((1+2)+3)+4)+5)
reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
reduce
函數大致相當於:
def reduce(function, iterable, initializer=None):
it = iter(iterable)
if initializer is None:
value = next(it)
else:
value = initializer
for element in it:
value = function(value, element)
return value
實際使用
上面的代碼片段是展示了Python一種使用方法。細心的同學可以看出來,如果要投入實際生產應用,lcm
函數是有一些問題的,主要是兩點,一是異常處理,包括除零等;另一個是最小公倍數都是正整數,而該函數的返回值可能出現負數。
30-seconds-of-python(https://github.com/30-seconds/30-seconds-of-python) 的代碼主要是展現了一種思路。並不會對邊緣情況和異常進行檢查,背后的原因是為了保持項目的簡單性,展示有趣的技術和思維方式。所有的代碼片段都假設用戶對問題、語言和可能發生的潛在錯誤有基本的了解,因此不會添加異常處理或參數檢查。