我在编码方面经验很少,而且我在课堂上学习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)的代码中没有错误出于某种原因第一次出现。
答案 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])
:
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
的东西进行比较,可以用不同的方式比较两个对象(更少,更少或相等,相等,不相等,......)