在 Python 中返回偶数和奇数

新手上路,请多包涵

我在回答 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])

原文由 Bill Kariri 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 771
2 个回答

使用列表推导的更 pythonic 方式

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]

原文由 G. Anderson 发布,翻译遵循 CC BY-SA 4.0 许可协议

那么这里有一些问题:

  1. 如果 x >= y ,则 range(x, y) 为空,因此 for 循环将不会枚举任何值;
  2. e % 2 == 0e % 3 == 0 是相等检查,因此将返回一个布尔值;
  3. e % 3 == 0 检查数字是否可以被 3 ,不是奇数;和
  4. 一旦你返回了一些东西,你就从函数中逃脱了。

然而,我们可以编写一个避免循环的函数,首先检查数字,然后 构造 正确的 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 ,(或不)。因为 if x > y 我们应该构造 aa 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(..) 对象,你可以对其进行 _后期处理_。

原文由 Willem Van Onsem 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题