在Python中返回偶数和奇数

在Python中返回偶数和奇数,python,python-3.x,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 ==

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

这里有一些问题:

  • 如果
    x>=y
    ,则
    范围(x,y)
    为空,因此
    for
    循环不会枚举任何值
  • e%2==0
    e%3==0
    是相等检查,因此将返回布尔值
  • e%3==0
    检查该数字是否可除以
    3
    ,而不是奇数;及
  • 一旦返回某个内容,就退出函数
  • 但是,我们可以编写一个避免循环的函数,首先检查数字,然后构造正确的
    范围(…)
    对象,如:

    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
    我们应该构造一个
    范围(y,x,2)
    ,但问题可能是
    y
    是奇数,所以我们首先检查它是否是奇数,如果是,我们增加值


    如果
    x发生类似的情况,那么这里有一些问题:

  • 如果
    x>=y
    ,则
    范围(x,y)
    为空,因此
    for
    循环不会枚举任何值
  • e%2==0
    e%3==0
    是相等检查,因此将返回布尔值
  • e%3==0
    检查该数字是否可除以
    3
    ,而不是奇数;及
  • 一旦返回某个内容,就退出函数
  • 但是,我们可以编写一个避免循环的函数,首先检查数字,然后构造正确的
    范围(…)
    对象,如:

    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
    我们应该构造一个
    范围(y,x,2)
    ,但问题可能是
    y
    是奇数,所以我们首先检查它是否是奇数,如果是,我们增加值


    如果
    x使用列表理解的更具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]
    

    使用列表理解的更具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]
    

    使用
    生成器
    (关键字
    产量
    查看解决方案)

    def number_游戏(x,y):
    num=范围(最小(x,y),最大(x,y))
    对于数字中的e:
    如果x>y且e%2==0:
    产量e
    elif x
    使用
    生成器查看解决方案
    收益率
    关键字)

    def number_游戏(x,y):
    num=范围(最小(x,y),最大(x,y))
    对于数字中的e:
    如果x>y且e%2==0:
    产量e
    elif x
    返回e%2==0
    是一个布尔值,而不是一个数值
    num=range(x,y)
    这应该是非包容性的吗?您的e%3比较不太正确-您应该在这两种情况下比较
    a%2
    ,但要比较不同的数字。试着弄清楚你自己要去哪@vash_the_stampede:基于测试用例,上界是独占的。因为否则
    200
    应该是最后一个测试用例。只需使用
    number\u game=lambda x,y:[i为过滤器中的i(lambda i:i%2==(x>y),range(*(x,y+1)if y>x else(y,x+1))]
    返回e%2==0
    是一个布尔值,而不是数值
    num=range(x,y)
    这应该是非包容性的吗?您的e%3比较不太正确-您应该在这两种情况下比较
    a%2
    ,但比较的数字不同。试着弄清楚你自己要去哪@vash_the_stampede:基于测试用例,上界是独占的。因为否则
    200
    应该是最后一个测试用例。只需使用
    number\u game=lambda x,y:[i for i in filter(lambda i:i%2==(x>y),range(*(x,y+1)if y>x else(y,x+1))]
    为什么要费心处理列表中的那些
    if
    子句呢?你应该使用
    范围的
    步骤
    参数。这一点很好,但由于OP使用了mod运算符,但并不完全正确,我认为在实际操作中显示它是有帮助的。另外,我认为这是更好的自文档化代码,但这正是我的偏好。事实上,它所做的工作是它所需要的两倍多,这在这里并不重要。除非x和y之间有巨大的差异<代码>测试。断言等于(数字游戏(10000000000000,-10000000000000),[-1000000000000,-99999999998,…
    让我咯咯地笑,tho!为什么要为列表中的
    if
    子句操心呢?你应该使用
    范围的
    步骤
    参数。这很好,但由于OP使用了mod运算符,但不太正确,我认为在实际操作中显示它是有帮助的。另外,我认为这是更好的自我文档我喜欢代码,但那只是我的偏好