在函数的参数中分配列表的长度

时间:2016-05-30 18:59:07

标签: python function parameters arguments

所以我想在我的函数中将列表的长度设置为变量,但它表示我的列表没有定义:

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)

2 个答案:

答案 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的定义,那将消除该错误,但该功能仍然无法正常工作,因为我已经提到的错误。

实际上,可能是另一个错误。 看起来就像你想要搜索startend之间的最大元素一样。如果是这样,您需要使用类似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])