列表函数中的赔率和余数 - Python

时间:2017-10-01 23:41:47

标签: python list append return-value modulus

我正在尝试创建一个名为“odd_even”的函数,它接受我已经创建的列表(名为“nums”)并确定奇数和偶数的数量,然后将变量返回给我。但是,当我运行此代码时,我得到:

NameError:名称'odd'未定义

我该如何解决这个问题?如果你能给我任何关于“返回”功能的有用指针,也会非常感激。

import random

def main():

     nums = []

     for x in range(10):

     nums.append(random.randrange(1,26))

     def odd_even(given_list):
         odd = 0
         even = 0
         for x in given_list:
             if x % 2 == 0:
                 even += 1
             else:
                 odd += 1

         return odd
         return even

     odd_even(nums)

     print("List had ", odd, "odds and ", even, "evens.")

 main()

2 个答案:

答案 0 :(得分:4)

你做错了两件事。

首先,您尝试return两个值但在不同的行上。你不能这样做,为了做到这一点,做一个元组:

def odd_even(given_list):
     odd = 0
     even = 0
     for x in given_list:
         if x % 2 == 0:
             even += 1
         else:
             odd += 1

     return odd, even

其次,您调用该函数但不存储return的值。所以你需要改变:

odd_even(nums)odd, even = odd_even(nums)

试图执行:

print("List had ", odd, "odds and ", even, "evens.")

main()正在寻找变量oddeven,但它们在main()中不存在,它们存在于odd_even()本地(因此你为什么调用return以及将它们返回到调用函数。您只看到odd错误的原因是因为它是print()中的第一个变量解释器遇到错误。

如果不正确使用return,解决这个问题的唯一方法就是将它们声明为global。但这是一个坏主意,所以不要这样做,把东西放在堆栈中!

答案 1 :(得分:-1)

你有一些语法错误。 Python ......与许多编程语言不同,它具有空白意识。这意味着您需要小心缩进和间距。更多传统语言(如Java和C)使用方括号{}来定义范围和分号;找出线路终止。

也许你复制得很差,但从我看到的情况来看,似乎你在函数main()中定义了函数odd_even()。也就是说,odd_even()的定义是向右标签,这意味着它的定义在函数main中。我假设你想要main调用函数odd_even()。因此,您必须将其重新标记到左侧,以使其与main()处于相同的缩进级别。

出于这个原因,我使用水平线(见下文)来清楚地概述功能的范围。当我用Python编写时,这对我有好处,因为否则一个函数的结束位置以及另一个函数的开始位置可能非常不清楚。

此外,好像你有2个return语句。如果要返回2个值,则应将其包含在对象中。为了解决这个问题,我想到了两个简单的解决方案。你可以让odd_even()函数访问全局变量(不推荐)......或者你可以返回一个数组(任意数量的值)或一个元组(正好是2,但这是特定于python的)。

以下是两者的实现:

import random

# Declare global variables outside the scope of any function
odd = 0
even = 0

#-------------------------------------------------------------------------------

def main():

    nums = [1,2,3,4,5,6,7,8,9,10]

    return_value = odd_even(nums)

    # Get the individual values back
    o = return_value[0]
    e = return_value[1]

    # You can use the global variables
    print("List had ", odd, "odds and ", even, "evens.")


    # Or you can get the array back
    print("List had ", o, "odds and ", e, "evens.")


#-------------------------------------------------------------------------------

def odd_even(given_list):

    # This means we are referencing the variables odd and even that are global
    global odd
    global even

    # Loop through the array
    for x in given_list:
        if x % 2 == 0:
            even += 1
        else:
            odd += 1

    return [odd, even]
#-------------------------------------------------------------------------------


main()