首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >了解Python中的闭包范围

了解Python中的闭包范围
EN

Stack Overflow用户
提问于 2017-08-27 15:33:47
回答 3查看 163关注 0票数 1

这是Bratt Slatkin书中的例子

代码语言:javascript
复制
def sort_priority(values,   group):
    def helper(x):
        if  x   in  group:
            return  (0, x)
        return  (1, x)
    values.sort(key=helper)

此外,他们还给出了这些值

代码语言:javascript
复制
numbers =   [8, 3,  1,  2,  5,  4,  7,  6]
group   =   {2, 3,  5,  7}
sort_priority(numbers,  group)
print(numbers)

我们有

代码语言:javascript
复制
[2, 3,  5,  7,  1,  4,  6,  8]

我不明白这个example.Why,我们有两次返回吗? helper函数到底做了什么?

EN

回答 3

Stack Overflow用户

发布于 2017-08-27 15:41:52

请注意,第一个return语句位于if块中。在python中,每当函数遇到return语句时,执行都会返回给调用者。在您的示例中,这两个return只是避免if else语句的一种快捷方式。当组中存在特定值时,返回(0,x),如果不满足if条件,则返回(1,x)

票数 1
EN

Stack Overflow用户

发布于 2017-08-27 15:45:02

没有嵌套函数的代码会更容易理解:

代码语言:javascript
复制
def helper(x):
    global group
    if x in group:
        return 0, x
    return 1, x


def sort_priority(values):
    values.sort(key=helper)


numbers = [8, 3, 1, 2, 5, 4, 7, 6]
group = {2, 3, 5, 7}
sort_priority(numbers)
print(numbers)

现在很容易看出,sort_priority()只是通过调用helper函数对值进行排序,该函数通过为每个x赋值来创建一个顺序。

当使用group格式的值调用helper函数时,它会获得“较低”的优先级(0),而如果该值不是group格式,则会获得更高的优先级(1)。

仔细看看helper确实会发现:

代码语言:javascript
复制
def helper(x):
    global group
    if x in group:
        return 0, x  # <-- we're in the `if` so `x` gets zero 
    return 1, x      # <-- if we got here it means we didn't get into the `if` so `x` gets one

因此,通过在排序中使用helper作为key函数,我们将获得并排序列表,该列表首先放置group中的项,然后才放置不在group中的项

代码语言:javascript
复制
[2, 3, 5, 7, 1, 4, 6, 8]
             ^
            The first item that is not in group
票数 1
EN

Stack Overflow用户

发布于 2021-01-14 22:37:36

对于我来说,使用sorted(values)函数而不是values.sort()函数更明显,否则它会有点模棱两可的“返回什么?”,“实际上是如何使用帮助器的?”

代码语言:javascript
复制
def sort_priority(values, group):
    def helper(x):
        if x in group:
            return (0, x)
        return (1, x)
    sorted_values = sorted(values, key=helper)
    return sorted_values

numbers = [8, 3, 1, 2, 5, 4, 7, 6]
group = {2, 3, 5, 7}
print('Sorted Numbers List: ', sort_priority(numbers, group))

当然,在使用sorted()之后,排序列表会显式返回它。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45902677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档