我正在尝试检查一个数字模数的模数,如果模数等于元组中我想要返回的其中一个值,则返回True。
这是我到目前为止所尝试过的:
def check(y):
k = (2, 5, 8, 10, 13, 16, 19, 21, 24, 27, 29)
for i in range(0, len(k)):
if k[i] == y % 30:
return True
else:
return False
def main():
print(check(1439))
main()
它总是返回false。
答案 0 :(得分:3)
这总是返回false,因为只检查了第一项。如果第一项是匹配,那么它将返回true。例如,如果y
为32,则返回true。检查所有值后,即在for循环之外,您需要返回false。或者更好的解决方案是使用in
运算符。
def check(y):
k = (2, 5, 8, 10, 13, 16, 19, 21, 24, 27, 29)
return y % 30 in k
答案 1 :(得分:2)
它总是返回false,因为这段代码:
for i in range(0, len(k)):
if k[i] == y % 30:
return True
else:
return False
仅基于数组中的 first 项返回true或false,因为它返回两个可能的代码路径。 k[0] == y % 30
,它返回true,或k[0] != y % 30
,它返回false。
如果你想使用这个基于循环的解决方案,你需要检查数组中的每个项,如果匹配则立即返回true,否则返回false only 列表已经用尽了,类似于(使用循环的for n in k
变体,因为索引在这里无关紧要):
for n in k:
if n == y % 30:
return True
return False
完整的计划是:
def check(y):
k = (2, 5, 8, 10, 13, 16, 19, 21, 24, 27, 29)
for n in k:
if n == y % 30:
return True
return False
def main():
print(check(1439))
print(check(36))
main()
第一个调用生成为1439 % 30 == 29
(在列表中),但第二个调用为false,因为36 % 30 == 6
(不在列表中)。
当然,实现这一目标还有更多的Pythonic方式:
def check(y):
k = (2, 5, 8, 10, 13, 16, 19, 21, 24, 27, 29)
return any (x == y % 30 for x in k)
基本上找到k
中该元素等于y % 30
的任何元素。有关Python any
操作的更多信息,请参阅this link,您会立即看到给出的等效代码与您的循环非常相似:
def any(iterable):
for element in iterable:
if element:
return True
return False
但是,当然,事实证明在这种特殊情况下没有必要使用any
,因为y % 30
实际上是一个固定的值,在搜索名单。相反,您可以选择更简单的方法:
def check(y):
k = (2, 5, 8, 10, 13, 16, 19, 21, 24, 27, 29)
return (y % 30) in k
离开any
变体进行更复杂的比较并不容易,例如只检查列表中的偶数:
def check(y):
k = (2, 5, 8, 10, 13, 16, 19, 21, 24, 27, 29)
return any (x == y % 30 for x in k if x % 2 == 0)
答案 2 :(得分:1)
您可以使用any()
中的生成器表达式完成此操作:
def check(y):
return any(n == y % 30 for n in k)
这构建了一个布尔迭代器,对于除y
的除数的k的所有元素都是正确的。