在Python中返回偶数和奇数

时间:2018-09-26 20:00:42

标签: python python-3.x

我在回答以下要求的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])

3 个答案:

答案 0 :(得分:4)

这里有一些问题:

  1. 如果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)循环将不会枚举任何值;
  2. fore % 2 == 0是相等检查,因此将返回布尔值;
  3. e % 3 == 0检查数字是否可被e % 3 == 0除,而不是奇数;和
  4. 一旦您返回某些内容,就会退出该函数。

但是,我们可以编写一个避免循环的函数,方法是先检查数字,然后构造正确的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)

使用Generatorsyield关键字)查看解决方案

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])