Skip to main content
 首页 » 编程设计

python之在 Python 中返回偶数和奇数

2025年05月04日14myhome

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

请您参考如下方法:

这里有一些问题:

  1. 如果x >= y , 然后 range(x, y)是空的,因此 for循环不会枚举任何值;
  2. e % 2 == 0和 e % 3 == 0是相等性检查,因此将返回一个 bool 值;
  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 , (或不)。因为如果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(..)对象,您可以后处理它。