所以我想在我的函数中将列表的长度设置为变量,但它表示我的列表没有定义:
def maxElement(list, start=0, end = len(serie)):
return max(serie[start:end])
serie = [9, 3, 6, 1, 7, 5, 4, 8, 2]
print maxElement(serie)
答案 0 :(得分:3)
在功能定义时,尚未定义serie
。此外,默认参数在模块加载时进行评估和绑定,而不是在调用函数时。因此,您不能引用另一个参数la maxElement(lst, start=0, end=len(lst))
或具有任何其他动态运行时相关的默认值:
def maxElement(lst, start=0, end=None): # don't shadow built-in name list
if end is None:
end = len(lst)
return max(lst[start:end]) # do not use serie here, but lst
> serie = [9, 3, 6, 1, 7, 5, 4, 8, 2]
> print maxElement(serie)
9
> print maxElement(serie, start=1, end=6)
7
答案 1 :(得分:2)
您的代码存在一些问题。
首先,您实际上并未使用函数的list
参数。相反,您使用的是全局列表serie
。顺便说一句,你不应该使用list
作为变量名称,因为阴影(覆盖)内置的list
类型会导致神秘的错误。
正如schwobaseggl所提到的,默认函数参数在定义函数时进行评估,而不是在调用函数时进行评估。因此,当您定义函数时,end = len(serie)
将end
设置为serie
的当前长度。但是,您的脚本在定义serie
后定义maxElement
,因此该名称尚未定义,这就是您收到此错误的原因:
NameError: name 'serie' is not defined
如果你在serie
之前定义了maxElement
的定义,那将消除该错误,但该功能仍然无法正常工作,因为我已经提到的错误。
实际上,可能是另一个错误。 看起来就像你想要搜索start
和end
之间的最大元素一样。如果是这样,您需要使用类似lst[start:end+1]
的内容。如果你想使用普通的Python约定,end
被排除在范围之外,那么你可以使用lst[start:end]
。请注意,切片的结束索引是否超出列表并不重要; n
> 0,lst[start:len(lst)+n]
与lst[start:len(lst)]
完全相同。
这是修复后的代码版本。我稍微修改了数据,以便更容易测试。
def max_element(lst, start=0, end=None):
if end is None:
end = len(lst)
return max(lst[start:end + 1])
serie = [0, 3, 6, 1, 7, 5, 4, 8, 2]
print serie
print max_element(serie)
print max_element(serie, start=4)
print max_element(serie, end=2)
print max_element(serie, start=4, end=6)
print max_element(serie, start=3, end=3)
<强>输出强>
[0, 3, 6, 1, 7, 5, 4, 8, 2]
8
8
6
7
1
然而,此功能并非真正必要。您应该直接在列表中调用max
,必要时进行切片,例如:
print max(serie[4:7])