我在回答 python 测验时遇到了一些问题:
给定两个数字 X 和 Y,编写一个函数: 返回 X 和 Y 之间的偶数,如果 X 大于 Y,否则返回 x 和 y 之间的奇数
例如,取整数 10 和 2 。该函数将返回 2 到 10 之间的所有偶数。
我真的很感激一些帮助,因为我还是个新手
这是我的代码:
def number_game(x,y):
num = range(x,y)
for e in num:
if x > y:
return e%2 == 0
else:
return e%3 == 0
这里是测试用例:
test.assert_equals(number_game(2,12), [3, 5, 7, 9, 11])
test.assert_equals(number_game(0,0), [])
test.assert_equals(number_game(2,12), [3, 5, 7, 9, 11])
test.assert_equals(number_game(200,180), [180, 182, 184, 186, 188, 190, 192, 194, 196, 198])
test.assert_equals(number_game(180,200), [181, 183, 185, 187, 189, 191, 193, 195, 197, 199])
请您参考如下方法:
这里有一些问题:
- 如果
x >= y, 然后range(x, y)是空的,因此for循环不会枚举任何值; -
e % 2 == 0和e % 3 == 0是相等性检查,因此将返回一个 bool 值; -
e % 3 == 0检查数字是否可以被3整除, 不奇怪;和 - 一旦你返回了一些东西,你就退出了这个函数。
但是,我们可以编写一个避免循环的函数,首先检查数字,然后构造正确的 range(..)对象,例如:
def number_game(x,y):
if x > y:
if y % 2 == 1:
y += 1
return list(range(y, x, 2))
else:
if x % 2 == 0:
x += 1
return list(range(x, y, 2))
例如:
>>> number_game(14, 25)
[15, 17, 19, 21, 23]
>>> number_game(15, 25)
[15, 17, 19, 21, 23]
>>> number_game(25, 14)
[14, 16, 18, 20, 22, 24]
>>> number_game(25, 13)
[14, 16, 18, 20, 22, 24]
>>> number_game(2,12)
[3, 5, 7, 9, 11]
>>> number_game(0,0)
[]
>>> number_game(2,12)
[3, 5, 7, 9, 11]
>>> number_game(200,180)
[180, 182, 184, 186, 188, 190, 192, 194, 196, 198]
>>> number_game(180,200)
[181, 183, 185, 187, 189, 191, 193, 195, 197, 199]
代码可以更紧凑:
def number_game(x,y):
if x > y:
return list(range(y + (y%2), x, 2))
else:
return list(range(x+1-(x%2), y, 2))
我们这样做是首先检查是否 x > y , (或不)。因为如果x > y我们应该构建一个 range(y, x, 2) ,但问题可能是 y是奇数,所以我们首先检查它是否是奇数,如果是,我们增加值。
如果 x <= y 也会发生类似的事情: 我们构造一个 range(x, y, 2) , 但以防万一x是偶数,我们也增加它。
因为我们采用两个步骤(range(..) 中的最后一个参数),这也将更有效地构建列表,因为 range(..)函数不会测试一个数字是偶数还是奇数,而只是简单地用2 递增变量。 .
如果您不希望“具体化”可迭代对象(将元素放入列表中),而只是返回相关的 range(..)可迭代的,我们可以这样做:
def number_game(x,y):
if x > y:
return range(y + (y&1), x, 2)
else:
return range(x+1-(x&1), y, 2)
这样做的好处是range(..)允许快速成员检查,范围也可以非常有效地切片等。所以你保留 range(..)对象,您可以后处理它。
