你知道我们如何在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))
答案 0 :(得分:1)
这里有一些错误,我会逐一尝试一遍
L=[int(x) for x in input("please enter a list:").split()]
当它被输入非数字类型时,这将抛出ValueError
。这也将围绕任何float
到int
通过使用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 splicing和zip的背景
对于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))