在Python中占用最多任意数量的参数

时间:2015-02-06 07:03:05

标签: python

我在编码方面经验很少,而且我在课堂上学习Python。我正在学习条件和循环,并被要求创建一个函数,它将采取任意数量的参数并给予我最大值。显然我不允许使用内置的max函数。

到目前为止,我有:

def max(x):
    current_max = x[1]
    for i in x[i]:
        if x[i] > current_max:
            current_max = x[i]

当我运行代码时,它没有给我任何错误,但是当我尝试运行max()时它只接受一个参数。想到的唯一想法就是加入:

x = input('Enter numbers to compare:')

当我跑步时,我得到了:

UnboundLocalError:在赋值之前引用的局部变量'i'

我不确定此时我能做些什么,因为我不确定我是否没有正确定义参数,或者只是在定义max(x)的代码中没有错误出于某种原因第一次出现。

3 个答案:

答案 0 :(得分:0)

x [i]在循环由编译器处理之前执行,因此尝试循环遍历x [i]而不事先声明会导致错误。

给定x,其中x是列表x = [1,2,3,4],以下内容应该有效

def max(x):
    current_max = x[0]
    for i in x:
        if i > current_max:
            current_max = i
    return current_max


x = [1,2,3,4]
print max(x)

答案 1 :(得分:0)

两件事:

1)在Python中,您需要在参数前添加一个*,以指示该参数实际上是一个参数列表。没有那个*,你的功能只会期待一个参数。编辑:啊我刚刚看到你实际上是将一个列表对象传递给你的函数,在这种情况下不需要*。如果您想支持max(1,3,7,-4)之类的通话,那么您确实需要*。

2)当迭代列表或任何其他“可迭代”时,您可以使用for item in list_of_items:迭代并检查列表中的每个项目。这在Python中一直使用,并且是在这种情况下迭代args列表的首选方式(即Pythonic方式)。

这是一个将所有内容联系在一起的示例max函数(并支持max(1,5,7,3)之类的调用:

def max(*x):
    current_max = x[0]  # Note we're assuming at least one argument was passed in. What if nothing was passed in?
    for i in x:
        if i > current_max:
            current_max = i
    return current_max

这是一个支持max([1,5,7,3])

等呼叫的示例max函数
def max(x):
    current_max = x[0]  # Note we're assuming at least one argument was passed in. What if nothing was passed in?
    for i in x:
        if i > current_max:
            current_max = i
    return current_max

仅供参考我的示例不是解决此问题的最佳解决方案,因此我建议您将其扩展为最终解决方案。

答案 2 :(得分:0)

您的算法可以运行,但有两个小问题。首先,迭代数组存在问题。通常你根本不需要索引,只需:

some_list = [1, 2, 3]
for item in some_list:
    print item
# Will print 1, then 2 and finally 3

完成循环后,您还需要返回current_max

重用内置函数的名称并不是一个好主意,所以我称之为my_max或类似的东西。如果您还想检查您的参数并添加文档字符串,您最终会得到:

def my_max(x):
    """ Return the biggest item in an iterable. """

    if len(x) == 0:
        raise ValueError("my_max() arg is an empty sequence")

    current_max = x[0]

    for i in x:
        if i > current_max:
            current_max = i

    return current_max

如果您更喜欢功能性编码风格,可以使用reduce将列表缩小为最大元素。只需定义返回最大元素的lambda:

def my_max(xs):
    return reduce(lambda x, y: x if x > y else y, xs)

如果您想知道Python的内置max是如何定义的,它实际上是用C语言编写的,就像许多Python的内置函数一样。如果你好奇,你可以check it out on GitHub。在内部,它的工作方式与min一样,因为使用称为PyObject_RichCompareBool的东西进行比较,可以用不同的方式比较两个对象(更少,更少或相等,相等,不相等,......)