python中的算术或几何序列

时间:2017-04-14 10:40:59

标签: python

你知道我们如何在Python中编写代码,包括一个获取列表并查明它是算术还是几何的函数?我写了一个代码,但它只是布尔,并没有说它的算术或几何,也有额外的输出。

L=[int(x) for x in input("please enter a list:").split()]

def Arithemetic(L):
  i=1
  if(L[0]+L[i]==L[i+1]):
    return True
  i+=1

def Geometric(L):
  i=1
  if(L[0]*L[i]==L[i+1]):
    return True
  i+=1

def IsArithemeticOrGeometric(L):
  if(Arithemetic(L)):
    print(Arithemetic(L))
  elif(Geometric(L)):
    print(Geometric(L))

print(IsArithemeticOrGeometric(L))

1 个答案:

答案 0 :(得分:1)

这里有一些错误,我会逐一尝试一遍

要求列表

L=[int(x) for x in input("please enter a list:").split()]

当它被输入非数字类型时,这将抛出ValueError。这也将围绕任何floatint

通过使用while循环和try-catch block

围绕问题可以解决问题
while True:
    try:
        L=[int(x) for x in input("please enter a list:").split()]
        break
    except ValueError:
        pass

int更改为int(x)

,可以轻松解决float(x)的问题

使用float时,请注意the nature of floating point numbers

检查算术和几何

在您的解决方案中,i永远不会增加,因此这只检查前两个值。借用@ dex-ter的评论,您可以将其更改为

def is_arithmetic(l):
    return all((i - j) == (j - k) for i, j, k in zip(l[:-2], l[1:-1], l[2:]))

有关其工作原理的解释,请查看list splicingzip的背景

对于is_geometric,您可以轻松调整此解决方案。

这也是一个很好的例子,unittests会使这个错误变得清晰

assert is_geometric((1,2))
assert is_geometric((1,2, 4))
assert is_geometric((1,2, 4, 8))
assert not is_geometric((1,2, 4, 9))
try:
    is_geometric((1, 2, 'a'))
    raise AssertionError('should throw TypeError')
except TypeError:
    pass

结果

您的结果只打印True或False是因为这是您告诉程序要执行的操作。您的IsArithemeticOrGeometric()没有返回语句,因此它始终返回None,但不会打印。 ,因此所有输出都来自print(Arithemetic(L))print(Geometric(L))

这里可能的解决方案是这样的:

def is_arithmetic_or_geometric(l):
    if is_arithmetic(l):
        return 'arithmetic'
    if is_geometric(l):
        return 'geometric'

print(is_arithmetic_or_geometric(L))