我在回答以下要求的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])
答案 0 :(得分:4)
这里有一些问题:
var optional: Int?
checkNil: do {
guard let unwrapped = optional else {
print("optional is nil")
break checkNil
}
print("Optional is not nil, has value \(unwrapped)")
}
为空,则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)
是奇数,因此我们首先检查它是否为奇数,如果是,则增加该值。 / p>
如果y
也会发生类似的情况:我们构造了一个x <= y
,但是如果range(x, y, 2)
是偶数,我们也将其递增。
因为我们执行两个步骤(x
中的最后一个参数),所以这也会更有效地构造列表,因为range(..)
函数将不会 test 一个数字是偶数/奇数,但只需用range(..)
来增加变量。
如果您不希望“实现”可迭代对象(将元素放入列表中),而只是返回相关的2
可迭代对象,我们可以这样做: / p>
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(..)
对象,然后可以后处理< / em>。
答案 1 :(得分:2)
使用列表推导的更Python化方式
def number_game(x,y):
if x > y:
return [n for n in range(y,x) if n%2==0]
elif y==x:
return []
else:
return [n for n in range(x,y) if n%2!=0]
答案 2 :(得分:1)
使用Generators
(yield
关键字)查看解决方案
def number_game(x,y):
num = range(min(x,y),max(x,y))
for e in num:
if x > y and e%2 == 0:
yield e
elif x < y and e%2 != 0:
yield e
# you have to materialize generators to lists before comparing them with lists
print(list(number_game(2,12)) == [3, 5, 7, 9, 11])
print(list(number_game(0,0)) == [])
print(list(number_game(2,12)) == [3, 5, 7, 9, 11])
print(list(number_game(200,180)) == [180, 182, 184, 186, 188, 190, 192, 194, 196, 198])
print(list(number_game(180,200)) == [181, 183, 185, 187, 189, 191, 193, 195, 197, 199])