这里有一些问题:如果x >= y,则range(x, y)为空,因此for循环将不会枚举任何值
e % 2 == 0和e % 3 == 0是相等检查,因此将返回布尔值
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增加变量。
如果您确实不想“具体化”iterable(将元素放入列表中),而只是返回相关的range(..)iterable,我们可以这样做: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(..)对象,并且可以后处理它。