2015-02-06 29 views
1

我在编码方面的经验很少,我正在学习Python中的一个类。我正在学习条件语句和循环,并且被要求创建一个函数,它会接受任意数量的参数,并给我最大的帮助。很明显,我不允许使用内置的max函数。在Python中取最大数量的参数

到目前为止,我有:

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:“我”分配

之前引用局部变量,我不能确定的我可以做什么在这一点上,因为我不确定我是不是正确地定义了参数,或者在定义max(x)的代码中有一个错误,因为某些原因第一次没有出现。

+0

只是一句话,随机数的参数。你的函数只需要一个参数。 Python中的N-Arguments将是'max(* args)'。 – RedX 2015-02-06 07:11:45

+0

这很有趣,我不知道你可以做到这一点。我在定义函数时如何参考参数?所以,举个例子,当我写“for i in x”时,我会用什么来代替“x”? – BRamses 2015-02-06 07:16:27

+0

这只是一个列表:'对于一个参数'。有关更多详细信息,请参阅[本文](http://stackoverflow.com/questions/36901/what-does-double-star-and-star-do-for-python-parameters)。 – RedX 2015-02-06 07:19:43

回答

0

两件事情:

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

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

下面是一个例子最大功能设备结合起来(并支持呼叫如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函数如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 

仅供参考我的例子并不是解决这个问题的最佳解决方案,所以我建议你扩展它们以获得最终解决方案

+0

谢谢你的两个例子。我没有想过简单地输入x作为列表。这也说明了如何很好地使用* x。非常感激! – BRamses 2015-02-06 07:36:36

0

x [i]在循环被编译器处理之前执行,因此如果不事先声明而试图通过x [i]循环将导致错误。

鉴于其中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) 
+0

啊,好吧。我明白为什么我现在得到错误,谢谢。然而,我尝试了这个,最终告诉我元组索引超出范围。分配x = [1,2,3,4]只是改变了类型,但仍然给了我相同的错误。 (列表索引超出范围) – BRamses 2015-02-06 07:11:53

+0

道歉。现在试试我的例子。 – 2015-02-06 07:16:54

+0

如果'x'是空的,该怎么办? – 2015-02-06 07:19:14

0

Y我们的算法会起作用,但有两个小问题。首先,迭代数组存在问题。通常你根本不需要索引,只是做:

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到您的列表减少的最大因素。简单地定义返回的最大元素的拉姆达:

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的比较可以以不同方式比较两个对象(更少,更少或相等,不等于,...)